51单片机复习程序例举004--HD44780控制的1602LCD
扫描二维码
随时随地手机看文章
1、在HD44780控制的1602LCD的显示屏上显示两条字符串 和 两个用户自定义的字符
/******************************************************************************
*说明:AT89S52芯片,12M晶振
*外设:HD44780控制的1602LCD:两行显示,每行最多显示40个预显示字符中的16个字符
*11条控制指令
*本程序:在HD44780控制的1602LCD上显示2行字符串,按键K1,显示一个用户自定义字符
*循环按键,循环显示
******************************************************************************/
#include
#include
sbitK1=P1^4;//按键
sbitRS=P2^0;//对象标志位:=0(对象是指令或状态位);=1(对象是数据)
sbitRW=P2^1;//读写标志位:=0(写);=1(读)
sbitE=P2^2;//使能位:为1时,读写信息,为负跳变时,执行指令
sbitBF=P0^7;//HD44780控制的1602LCD的忙状态位(只能通过指令读取)
//用户要显示的字符串
unsignedcharcodesys_str1[]="Dragon_CSU";
unsignedcharcodesys_str2[]="Good_Luck";
//用户自定义的字符编码方式:在8*8的点阵中选“右上角”的“5列*7行”点阵存放数据
unsignedcharcodeuser_str[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};/*自定义字符℃*/
/******************************************************************************
*名称:delay1ms()
*功能:延时1ms
*参数:intt
*返回:无
******************************************************************************/
voiddelay1ms(intt)
{
unsignedchari;
while(t--)
{
for(i=0;i<125;i++)
{
;
}
}
}
/******************************************************************************
*名称:Busy_Test()
*功能:检测HD44780控制的1602LCD是否处于忙状态
*参数:无
*返回:bitresult忙则返回1,不忙则返回0。
******************************************************************************/
bitBusy_Test(void)
{
//1、定义变量,存储返回值
bitresult;
//2、读状态位
RS=0;RW=1;
E=1;
_nop_();_nop_();_nop_();_nop_();//延时4个机器周期,给硬件响应,
//即:使E=1;稳定
result=BF;//将忙状态位BF的值读给函数要返回的变量
//3、将时能位E复位到低电平
E=0;
//4、将忙状态位读的结果作为函数的参数返回
returnresult;
}
/******************************************************************************
*名称:Write_Com()
*功能:向HD44780写控制1602LCD的控制指令
*参数:unsignedchardictate
*返回:无
******************************************************************************/
voidWrite_Com(unsignedchardictate)
{
//1、检测LCD忙状态,忙,则等待
while(Busy_Test()==1){;}
//2、向HD44780控制的1602LCD写控制指令
/*----2.1、操作对象是指令,执行对象:写入----------------------------*/
RS=0;
RW=0;
/*----2.2、在E为0时,先将指令数据写到P0口的DB0--DB7数据线上-------*/
E=0;
_nop_();//给硬件反应时间,等待E=0;稳定
_nop_();
P0=dictate;//将指令先暂时写到数据线上
_nop_();//确保硬件把指令数据写完了
_nop_();
_nop_();
_nop_();
/*----2.3、在E为1时,将数据线上的指令数据写到DH44780的寄存器里----*/
E=1;
_nop_();_nop_();_nop_();_nop_();//等待E=1稳定
/*----2.4、在E为下降沿时,执行写入的指令--------------------------*/
E=0;//从E=1到E=0产生下降沿,HD44780执行指令
}
/******************************************************************************
*名称:Write_Address()
*功能:通过指令来控制第一个要显示的字符或下一个即将要显示的字符在LCD上的位置
*参数:unsignedcharaddr在LCD上要显示的位置
*返回:无
******************************************************************************/
voidWrite_Address(unsignedcharaddr)
{
//向HD44780写指令8:设定DDRAM地址的指令。
//即:即将要显示的字符在1602LCD上的指令需要的地址=0x80|(字符在LCD屏幕上的位置)
Write_Com(0x80|addr);
}
/******************************************************************************
*名称:Write_Data()
*功能:1、向HD44780控制的1602LCD写要显示的字符数据;
*2、向CGRAM中,对应地址的存储单元写用户自定义的字符数据
*参数:unsignedcharchar_data要显示的字符(其实字符的值和它的ASCII码值一样)
*返回:无
******************************************************************************/
void Write_Data(un