一: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--)
{
}
}
}
|