12864LCD显示倒计时程序Word格式文档下载.docx
《12864LCD显示倒计时程序Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《12864LCD显示倒计时程序Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。
sbitspk=P1^4;
sbitsadd=P2^7;
sbitsdel=P2^6;
signedcharsecond=0,minute=0,hour=0,count=0,keycount=0;
signedcharkey=0;
unsignedcharcodeDIS1[]=
{
"
距离系统爆炸时间"
};
unsignedcharcodeDIS2[]=
还剩:
"
unsignedcharcodeDIS31[]=
时"
unsignedcharcodeDIS32[]=
分"
unsignedcharcodeDIS33[]=
秒"
unsignedcharcodeDIS4[]=
周林"
unsignedcharcodetable2[]="
0123456789"
;
charcodereserve[3]_at_0x3b;
//保留0x3b开始的3个字节
/*********************延时子函数**************************/
voiddelayNOP()//us延时子函数(4.34us)
_nop_();
}
voiddelayms(unsignedintms)//ms延时子函数
unsignedchary;
while(ms--)
{
for(y=0;
y<
114;
y++)
;
}
//******************检查LCD忙状态**************************
bitlcd_busy()//检查LCD忙状态1忙,0闲
bitresult;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
delayNOP();
result=(bit)(P0&
0x80);
LCD_EN=0;
return(result);
//***********************写指令数据***********************
voidlcd_wcmd(unsignedcharcmd)//写指令数据到LCD
while(lcd_busy())
LCD_RW=0;
P0=cmd;
voidlcd_wdat(unsignedchardat)//写显示数据到LCD
LCD_RS=1;
P0=dat;
voidwritesmh(unsignedcharadd,unsignedchardate)//显示个位和十位数据
unsignedcharshi,ge;
shi=date/10;
ge=date%10;
lcd_wcmd(0x80+add);
delayms(5);
lcd_wdat(table2[shi]);
lcd_wdat(table2[ge]);
//*********************初始化设定****************************
voidlcd_init()
LCD_PSB=1;
//并口方式
LCD_RST=0;
//液晶复位
LCD_RST=1;
lcd_wcmd(0x34);
//扩充功能设定,扩充指令,选8位数据
lcd_wcmd(0x30);
//功能设定,基本指令操作,选8位数据
lcd_wcmd(0x0C);
//显示开,关光标,关光标反白允许。
lcd_wcmd(0x04);
//光标的移动方向
lcd_wcmd(0x01);
//清除LCD的显示内容
TMOD=0x01;
TH0=0x3C;
TL0=0xB0;
EA=1;
ET0=1;
TR0=0;
EX0=0;
//外部中断0允许
IT0=1;
//外部中断0为边沿触发方式
//*********************设定显示位置子函数**********************
voidlcd_pos(unsignedcharX,unsignedcharY)//设定显示位置
unsignedcharpos;
if(X==1)
X=0x80;
elseif(X==2)
X=0x90;
elseif(X==3)
X=0x88;
elseif(X==4)
X=0x98;
pos=X+Y;
//确定显示地址
lcd_wcmd(pos);
//写显示地址
//*****************清屏子函数***************************
voidclr_screen()//清屏子函数
//扩充指令操作
//基本指令操作
//清屏
//******************闪烁子函数**************************
voidlcdflag()
lcd_wcmd(0x08);
//关闭显示
delayms(500);
lcd_wcmd(0x0c);
//开启显示
//******************写字符串子函数*************************
voidwr_string(unsignedcharstr[])//写字符串子函数
unsignedcharnum=0;
while(str[num])
lcd_wdat(str[num++]);
//写数据
//********************按键设置时间*************************
voidkeyscan()//按键设置时间
if(sset==0)
delayms(10);
if(sset==0)
{
EX0=1;
keycount++;
while(sset==0)
{
;
}
if(keycount==1)
TR0=0;
//停止计时
key=1;
keycount=2;
lcd_wcmd(0x8e);
lcd_wcmd(0x0d);
//秒位闪烁
if(keycount==2)
if(keycount==3)
keycount=4;
lcd_wcmd(0x8c);
//分位闪烁
//lcd_wcmd(0x04);
光标左移一位
if(keycount==4)
if(keycount==5)
keycount=6;
lcd_wcmd(0x8a);
//时位闪烁
if(keycount==6)
if(keycount==7)
keycount=0;
lcd_wcmd(0x0c);
//停止闪烁
TR0=1;
//开始计时
EX0=1;
}
if(keycount!
=0)
if(keycount==2)//编辑秒
if(sadd==0)//数值加1
delayms(10);
if(sadd==0)
{
second++;
if(second==60)
{
second=0;
}
sadd=1;
}
writesmh(0x0e,second);
if(sdel==0)//数值减1
if(sdel==0)
if(second==0)
second=60;
second--;
sdel=1;
if(keycount==4)//编辑分钟
minute++;
if(minute==60)
minute=0;
writesmh(0x0c,minute);
if(minute==0)
minute=60;
minute--;
writesmh(0x0c,minute);
if(keycount==6)//编辑小时
hour++;
if(hour==24)
writesmh(0x0a,hour);
if(hour==0)
hour=24;
hour--;
writesmh(0x0a,hour);
//主函数主函数主函数主函数主函数主函数主函数主函数主函数主函数主函数主函数主函数主函数
voidmain()
delayms(100);
//上电,等待稳定
lcd_init();
//初始化LCD
lcd_pos(1,0);
//设置显示位置为第一行
wr_string(DIS1);
lcd_pos(2,0);
//设置显示位置为第二行
wr_string(DIS2);
lcd_pos(3,3);
//设置显示位置为第四行
wr_string(DIS31);
lcd_pos(3,5);
wr_string(DIS32);
lcd_pos(3,7);
wr_string(DIS33);
lcd_pos(4,6);
wr_string(DIS4);
writesmh(0x0e,second);
writesmh(0x0c,minute);
writesmh(0x0a,hour);
while
(1)
keyscan();
//**********************中断***************************
voidtime0()interrupt1using0//倒计时中断
count++;
if(count==20)
count=0;
second--;
if(second<
0)
second=59;
minute--;
if(minute<
minute=59;
hour--;
if(hour<
hour=24;
lcd_pos(3,2);
//设置显示位置为第三行,第七列
lcd_pos(3,4);
lcd_pos(3,6);
writesmh(0x0e,second);
if((second==0)&
&
(minute==0)&
(hour==0))//到点后响铃
TR0=0;
spk=0;
second=0;
minute=0;
hour=0;
lcdflag();
spk=1;
voidencoder(void)interrupt0//外部中断0旋转码开关中断程序
if(INT1==1)
{
sadd=0;
sdel=1;
if(INT1==0)
sdel=0;
sadd=1;
//*********************************************************