lcd1602程序(lcd1602例程)
一、LCD1602怎么显示中文啊
【1】1602液晶是字符型液晶,总共有2行,每行16个字符。
每个字符有效的可显示字体是5*8点阵字体。
所以通常无法显示中文。中文的显示必须选择图形点阵型液晶。
【2】特别地:是指,显示“年月日”,之类的简单的汉字吧?
最多支持8个CGRAM字符。可以自己做。调用字模代码0-7。
如:“年”的CGRAM单元数据为:
0FH,09H,0FH,09H,0FH,09H,13H,00H。这8个字节写入CGRAM单元00H-07H。
调用字符代码0。可以看到中文“年”。
【3】具体代码,下载相关液晶点阵模块的资料,附带程序能看到一些例程。
二、万年历51单片机LCD1602不显示是什么原因
给你一个显示的例程,你看看你自己的程序或硬件错在何处。
#defineLCD1602_FLAG
#defineLCD1602_PORTP0
#include<reg51.h>
#include<stddef.h>
#defineucharunsignedchar
sbitlcd1602_rs=P2^0;
sbitlcd1602_e=P2^2;
sbitlcd1602_rw=P2^1;
sbitlcd1602_busy=P0^7;
ucharstr[]="ThisisKeyTest";
ucharkeyval,keystr[16];
voiddelay(uchara)
{
uchari;
while(a--)for(i=0;i<120;i++);
}
/*
************************************
*函数名称:lcd1602_CheckBusy()
*函数功能:状态查询
************************************
*/
voidlcd1602_CheckBusy()
{
do
{
lcd1602_busy=1;
lcd1602_rs=0;
lcd1602_rw=1;
lcd1602_e=0;
lcd1602_e=1;
}
while(lcd1602_busy);
}
/*
***************************************
*函数名称:lcd1602_WriteCmd()
*函数功能:写命令
*入口参数:命令字
*出口参数:无
***************************************
*/
voidlcd1602_WriteCmd(constucharcmd)
{
lcd1602_CheckBusy();
lcd1602_rs=0;
lcd1602_rw=0;
lcd1602_e=1;
LCD1602_PORT=cmd;
lcd1602_e=0;
}
/*
*******************************************
*函数名称:lcd1602_WriteData()
*函数功能:写数据
*入口参数:c--待写数据
*出口参数:无
*********************************************
*/
voidlcd1602_WriteData(constucharc)
{
lcd1602_CheckBusy();
lcd1602_rs=1;
lcd1602_rw=0;
lcd1602_e=1;
LCD1602_PORT=c;
lcd1602_e=0;
}
/*
***********************************************
*函数名称:lcd1602_Init()
*函数功能:初始化LCD
*入口参数:无
*出口参数:无
***********************************************
*/
voidlcd1602_Init()
{
lcd1602_WriteCmd(0x38);//显示模式为8位2行5*7点阵
lcd1602_WriteCmd(0x0c);//displayenable,flagenable,flashenable,
lcd1602_WriteCmd(0x06);//flagmovetoright,screendon'tmove
lcd1602_WriteCmd(0x01);//clearscreen
}
/*
************************************************
*函数名称:lcd1602_Display()
*函数功能:字符显示
*入口参数:ptr--字符或字符串指针
*出口参数:无
*说明:用户可通过以下方式来调用:
*1)lcd1602_Display("Hello,world!");
*2)INT8U存储类型txt[]="要显示的字符串";
*或者INT8U存储类型txt[]={'t','x','t',..,'\0'};
*INT8U*ptr;
*ptr=&txt;
*lcd1602_Display(ptr);
*或lcd1602_Display(txt);
*或lcd1602_Display(&txt);
************************************************
*/
voidlcd1602_Display(constuchar*ptr,ucharline)
{
uchardatai=0;
uchar*dataq;
q=ptr;
switch(line)
{
case0:
lcd1602_WriteCmd(0x80);
while(q!=NULL&&(*q!='\0')&&i<16)
{
lcd1602_WriteData(*q);
q++;
i++;
}
break;
case1:
lcd1602_WriteCmd(0xc0);
while(q!=NULL&&(*q!='\0')&&i<16)
{
lcd1602_WriteData(*q);
q++;
i++;
}
break;
}
}
ucharkbscan(void)
{
unsignedcharsccode,recode;
P3=0x0f;//发0扫描,列线输入
if((P3&0x0f)!=0x0f)//有键按下
{
delay(20);//延时去抖动
if((P3&0x0f)!=0x0f)
{
sccode=0xef;//逐行扫描初值
while((sccode&0x01)!=0)
{
P3=sccode;
if((P3&0x0f)!=0x0f)
{
recode=(P3&0x0f)|0xf0;
while((P3&0x0f)!=0x0f);//等待键抬起
return((~sccode)+(~recode));
}
else
sccode=(sccode<<1)|0x01;
}
}
}
return0;//无键按下,返回0
}
uchargetkey(void)
{
ucharkey;
key=kbscan();
if(key==0){keyval=0xff;return(0);}
switch(key)
{
case0x11:keyval=7;break;
case0x12:keyval=4;break;
case0x14:keyval=1;break;
case0x18:keyval=10;break;
case0x21:keyval=8;break;
case0x22:keyval=5;break;
case0x24:keyval=2;break;
case0x28:keyval=0;break;
case0x41:keyval=9;break;
case0x42:keyval=6;break;
case0x44:keyval=3;break;
case0x48:keyval=11;break;
case0x81:keyval=12;break;
case0x82:keyval=13;break;
case0x84:keyval=14;break;
case0x88:keyval=15;break;
default:keyval=0xff;break;
}
if(keyval!=0xff)return(1);
elsereturn(0);
}
main()
{
ucharnum;
lcd1602_Init();
lcd1602_Display(str,0);
while(1)
{
if(getkey())
{
if(keyval<10)keystr[num]=keyval+0x30;
elsekeystr[num]=keyval-10+'A';
lcd1602_Display(keystr,1);
num++;
num%=16;
}
}
}