开始 1602初始化 写数据 图5.4 LCD1602显示流程
具体程序如下:
#define port P0
#define uchar unsigned char #define uint unsigned int
sbit rs=P2^7; //将P2.0设置为数据选择口 sbit rw= sbit en=
void writedata(uchar i) //写指令 { }
void writecom(uchar i) //写数据 {
P2^6; //将P2.6设置为读写选择口 P2^5; //将P2.5设置为使能信号口
rs=1; //选择指令寄存器 rw=0; //写 en=1; //允许读写 delayus(100); port=i;
en=0; //禁止读写
rs=0; rw=0; en=1;
}
delayus(100); port=i; en=0;
void chushishizhong() //初始时钟 { }
void writestr(uchar ha,uchar li,uchar *s) //对LCD的行与列的初始地址进行定
义,写数据
{ }
while(*s) { }
writedata(*s); s++;
if(ha==0)
writecom(li+0x80); else writecom(li+0xc0);
writecom(0x38); //设置8位格式,2行,5x7 writecom(0x08); //清屏幕
writecom(0x06); //设定输入方式,增量不移位 writecom(0x0c); //整体显示,关光标,不闪烁
5.5键址返回程序
键盘扫描程序的功能是逐个扫描各个功能键和“+”“—”键是否被按下,若按下某个按键,则返回相应的键址。
其按键扫描程序如下:
sbit k1=P3^3; //定义每个按键的数据口 P3.3为S1按键 sbit k2=P3^4; //P3.4对应S2按键 sbit k3=P3^5; //P3.5对应S3按键 sbit k4=P3^6; //P3.6对应S4按键
sbit k5=P3^7; //P3.7对应S5按键
unsigned char keyscan() //定义键址返回程序 {
if(k1==0) //当按键1按下 {
delayms(10); //消抖 延时 if(k1==0)
{
while(k1==0);
return 1; //返回键址1 }
} {
delayms(10); if(k2==0)
{
while(k2==0);
return 2; //返回键址2 }
else if(k2==0) //当按键2按下
} {
delayms(10); if(k3==0)
{
while(k3==0);
return 3; //返回键址3 }
else if(k3==0) //当按键3按下
} {
delayms(10);
else if(k4==0) //当按键4按下
}
if(k4==0)
{
while(k4==0);
return 4; //返回键址4 }
} {
delayms(10); if(k5==0)
{
while(k5==0);
return 5; //返回键址5 }
else if(k5==0) //当按键5按下
} else
return 0; //若没有按键按下则返回0
5.6测试及性能分析
实际硬件测试图如下:
1)接通电源,系统正常显示时钟,如图5.5所示
图5.5 实时时钟显示
2)按下按键2,,光标闪烁,进入时钟校准模式,如图5.6所示
图5.6 时钟校准
3)按下按键3,系统显示当前温度,按下按键5,按键6调节烧水温度,当水箱内温度低于目标温度时,LED灯亮,表示继电器断开,加热电路工作。,如图5.7所示。