登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 1602显示屏(动态滚动)

[复制链接]
发表于 2019-1-29 18:17:54 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 单片机
学习安排: 熟练掌握
开始时间: 2019-01-29
结束时间: 2019-01-29
一:1602液晶的认识
1602液晶共16引脚,各引脚功能名称如下图所示“16”表示一行至多显示16的字符,“02”表示有两行

第一行的地址是0x00到0x27,第二行地址0x40到0x67,其中第一行0X00到0x0F是液晶上第一行16个字符显示位置相对应的,第二行0X40到0X4F是第二行内容而每行多出来的部分是显示移动字符设置的。

二:操步骤

1.液晶的初始化

1.1读状态引脚RS=L;RW=H,E=H;

1.2写指令引脚RS=L;RW=L,D0-D7表示指令码;

1.3读数据引脚RS=H;RW=HH;E=H;

1.4写数据RS=H,RW=L;D0-D7表示写入的数据

初始化代码

void LCD_init()
{
    delay_ms(40);
    LCD_Write_Cmd(0x38);//选择模式
    delay_ms(5);
    LCD_Write_Cmd(0x38);//选择模式
    delay_ms(1);
    LCD_Write_Cmd(0x38);//选择模式
    LCD_Write_Cmd(0x38);//选择模式
    LCD_Write_Cmd(0x08);//关闭显示
    LCD_Write_Cmd(0x01);//清除显示
    LCD_Write_Cmd(0x06);//设置光标自动加1
    LCD_Write_Cmd(0x0c);//打开显示
}                                                                                                         下面这个程序在c52单片机尚能显示出来,在我们的12c5A上还是有问题,具体问题还是单片机的时序问题,谁能否看看具体哪里修改。                                                 #include<STC12C5A60S2.H>

#define LCD1602_DB P0
sbit LCD1602_RS=P2^0;
sbit LCD1602_RW=P2^1;
sbit LCD1602_E=P1^2;

bit flag500ms=0;
unsigned char T0RH=0;
unsigned char T0RL=0;

unsigned char code str1[]="Kingst Studio";
unsigned char code str2[]="Let's move...";

void ConfigTimer0(unsigned int ms);
void delay_ms(unsigned int t);
void InitLcd1602();
void LcdShowStr(unsigned char x, unsigned char y,
unsigned char *str, unsigned char len);

void main()
{
unsigned char i;
unsigned char index=0;
unsigned char pdata bufMove1[16+sizeof(str1)+16];
unsigned char pdata bufMove2[16+sizeof(str2)+16];

EA=1;
ConfigTimer0(10);
InitLcd1602();

for (i=0; i<16;i++)
{
  bufMove1=' ';
  bufMove2=' ';
}
for (i=0;i<(sizeof(str1)-1); i++)
{
  bufMove1[16+i]=str1;
  bufMove2[16+i]=str2;
}

for (i=(16+sizeof(str1)-1); i<sizeof(bufMove1); i++)
{
  bufMove1=' ';
  bufMove2=' ';
}
while(1)
{
  if(flag500ms)
  {
   flag500ms=0;
   LcdShowStr(0,0,bufMove1+index, 16);
   LcdShowStr(0,1,bufMove2+index, 16);
   index++;
   if(index >= (16+sizeof(str1)-1))
   {
    index=0;
   }
  }
}
}
void ConfigTimer0(unsigned int ms)
{
unsigned long tmp;

tmp=33177600/12;
tmp=(tmp*ms)/1000;
tmp=65536-tmp;
tmp=tmp+12;
T0RH=(unsigned char)(tmp>>8);
T0RL=(unsigned char)tmp;
TMOD &=0xF0;
TMOD |=0x01;
TH0=T0RH;
TL0=T0RL;
ET0=1;
TR0=1;
}
void LcdWaitReady()
{
unsigned char sta;

LCD1602_DB=0xFF;
LCD1602_RS=0;
LCD1602_RW=1;
delay_ms(3);
do{
  LCD1602_E=1;
  delay_ms(3);
  sta = LCD1602_DB;
  LCD1602_E=0;
  delay_ms(3);
}while(sta & 0x80);
}
void LcdWriteCmd(unsigned char cmd)
{
LcdWaitReady();
LCD1602_RS=0;
  delay_ms(3);
LCD1602_RW=0;
  delay_ms(3);
LCD1602_DB=cmd;
  delay_ms(3);
LCD1602_E=1;
  delay_ms(3);
LCD1602_E=0;
  delay_ms(3);
}
void LcdWriteDat(unsigned char dat)
{
LcdWaitReady();
LCD1602_RS=1;
LCD1602_RW=0;
LCD1602_DB=dat;
LCD1602_E=1;
  delay_ms(3);
LCD1602_E=0;
  delay_ms(3);
}
void LcdSetCursor(unsigned char x, unsigned char y)
{
unsigned char addr;
if(y==0)
  addr=0x00+x;
else
  addr=0x40+x;
LcdWriteCmd(addr | 0x80);
}
void LcdShowStr(unsigned char x, unsigned char y,
  unsigned char *str, unsigned char len)
  {
   LcdSetCursor(x,y);
   while(len--)
   {
    LcdWriteDat(*str++);
   
   
  }
}
   
void InitLcd1602()
{
  LcdWriteCmd(0x38);
   LcdWriteCmd(0x0C);
  LcdWriteCmd(0x06);
  LcdWriteCmd(0x01);
}
void InterruptTimer0() interrupt 1
{
  static unsigned char tmr500ms=0;
  
  TH0=T0RH;
  TL0=T0RL;
  tmr500ms++;
  if(tmr500ms>=50)
  {
   tmr500ms=0;
   flag500ms=1;
  }
}
void delay_ms(unsigned int t)
{
  unsigned int x,y;
  for(x=t;x>0;x--)
  {
   for(y=110;y>0;y--)
   {
   }
  }
}
  


QQ图片20190129181715.jpg
152123dk0j00kcrc70njp8.png
好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表