51单片机+1602液晶万年历程序
/*下面是相关数据的显示函数*/
//温度显示函数
void writetemp(uchar add,uint dat)//写入温度值函数指定位置
{
uchar gw,sw,xw;//个位,十位,小数位(注意得到为三位有效数)
gw=dat%100/10;/*特别注意此处*/
sw=dat/100;
xw=dat%10;
writecom(h2+add);//h2为头文件规定的值0x80+0x40
writedata(0x30+sw);//数字+30得到显示码
writedata(0x30+gw);//个位数
writedata(0x2e);//小数点
writedata(0x30+xw);//小数位
writedata(0xdf);//显示“°”(度)
//writedata(0x43);//显示“C”符号,为液晶字符的地址码(考虑是否要)
}
//时分秒显示函数
void writetime(uchar add,uchar dat)//写入时分秒
{
uchar gw,sw;
gw=dat%10;//取得个位数
sw=dat/10;//取得十位数
writecom(h2+add);//第二行显示
writedata(0x30+sw);//显示该数字
writedata(0x30+gw);
}
//年月日显示函数
void writeday(uchar add,uchar dat)//写入年月日函数
{
uchar gw,sw;
gw=dat%10;//取得个位数字
sw=dat/10;//取得十位数字
writecom(h1+add);//在第一行显示
writedata(0x30+sw);
writedata(0x30+gw);//显示
}
void writeweek(uchar week)//写星期函数
{
writecom(h1+0x0e);/*巨注意:第一行是从0位开始的*/
switch(week)
{
case 1:writedata(1);//括号内写入1注意是单引号
break;
case 2:writedata(2);
break;
case 3:writedata(3);
break;
case 4:writedata(4);
break;
case 5:writedata(5);
break;
case 6:writedata(6);
break;
case 7:writedata(7);
break;
}
}
//按键扫描函数
void keyscan()
{
if(key1==0)//设置键按下
{
delay(5);//延时
if(key1==0)
{
beep=0;//蜂鸣器短响一声
delay(20);
beep=1;
alarmflag=0;/*按下标志,用于防止调节时间时鸣叫*/
while(!key1);
keynum++;
if(keynum==9)
keynum=1;//返回
switch(keynum)
{
case 1:TR0=0;//关闭定时器
writecom(h2+0x07);//秒的位置
writecom(0x0f);//设置为光标闪烁
temp=(miao)/10*16+(miao)%10;//秒化为bcd码
write_1302(0x8e,0x00);
write_1302(0x80,0x80|temp);//秒数据写入
write_1302(0x8e,0x80);
break;
case 2:writecom(h2+4);//分的位置
break;//不用再次设置为闪烁状态了
case 3:writecom(h2+1);//时的位置
break;
case 4:writecom(h1+0x0e);//星期的位置
break;
case 5:writecom(h1+0x09);//日的位置
break;
case 6:writecom(h1+0x06);//月的位置
break;
case 7:writecom(h1+0x3);//年的位置
break;
case 8:writecom(0x0c);//第8次,光标不闪烁
alarmflag=1;/*设置标志重新设置为1*/
TR0=1;//重新打开定时器
temp=(miao)/10*16+(miao)%10;
write_1302(0x8e,0x00);
write_1302(0x80,0x00|temp);//写入秒
write_1302(0x8e,0x80);
break;
}
}
}
if(keynum!=0)//当设置键按下时才能操作
{
if(key2==0)//加键
{
delay(5);
if(key2==0)
{
beep=0;//蜂鸣器短响
delay(20);
beep=1;
while(!key2);//按键松开
switch(keynum)
{
case 1:miao++;//
if(miao==60)miao=0;
writetime(0x06,miao);/*在十位的位置写入,因为为两位数,个位数自动再后面显示*/
temp=(miao)/10*16+(miao)%10;//转换为bcd码
write_1302(0x8e,0x00);//允许写
write_1302(0x80,temp);// 写入秒
write_1302(0x8e,0x80);//打开保护
writecom(h2+0x07);//液晶模式为写入后自动右移,在此返回原来位置
break;
case 2:fen++;
if(fen==60) fen=0;
writetime(0x03,fen);//在十位数位置开始写入
temp=(fen)/10*16+(fen)%10;//转换为bcd码
write_1302(0x8e,0x00);//允许写
write_1302(0x82,temp);//写入分
write_1302(0x8e,0x80);//打开保护
writecom(h2+4);//返回个位数的位置
break;
case 3:shi++;
if(shi==24) shi=0;
writetime(0,shi);//在0位开始写入
temp=(shi)/10*16+(shi)%10;//转换为bcd码
write_1302(0x8e,0x00);//允许写
write_1302(0x84,temp);//写入时
write_1302(0x8e,0x80);//打开保护
writecom(h2+1);//返回到个位位置
break;
case 4:week++;
if(week==8) week=1;
writecom(h1+0x0e);//显示位置
writeweek(week);//写入星期
temp=(week)/10*16+(week)%10;
write_1302(0x8e,0x00);//允许写入
write_1302(0x8a,temp);//写入周
write_1302(0x8e,0x80);//打开保护
writecom(h1+0x0e);/*此处有疑惑:返回原来位置?*/
break;
case 5:ri++;
if(ri==32) ri=1;
writeday(8,ri);//注意是在十位开始写入
temp=(ri)/10*16+(ri)%10;//转换为bcd码
write_1302(0x8e,0x00);//允许写
write_1302(0x86,temp);//写入日
write_1302(0x8e,0x80);//打开保护
writecom(h1+9);//返回个位数
break;
case 6:yue++;
if(yue==13) yue=1;
writeday(5,yue);//在十位开始写入
temp=(yue)/10*16+(yue)%10;//转换为bcd码
write_1302(0x8e,0x00);//允许写
write_1302(0x88,temp);//写入月
write_1302(0x8e,0x80);//打开保护
writecom(h1+6);//返回个位位置
break;
case 7:nian++;
if(nian==100) nian=0;
writeday(2,nian);//在第一行第三个字符开始写入
temp=(nian)/10*16+(nian)%10;//转换为bcd码
write_1302(0x8e,0x00);//允许写
write_1302(0x8c,temp);//写入年
write_1302(0x8e,0x80);//打开保护
writecom(h1+3);//返回个位位置
break;
}
51单片机1602液晶万年 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)