打印

初学请教单片机1602液晶时钟的程序问题

[复制链接]
2237|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
步行者108|  楼主 | 2010-5-22 22:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大虾我是一个初学者,写了个时钟程序遇到了问题,时钟的分调节功能没办法实现,请好心人帮忙看看:
#include<reg52.h>
#define unint unsigned int
#define unchar unsigned char
unchar code table0[]="2010-01-01";
unchar code table1[]="00:00:00";
unchar code table2[]={'0','1','2','3','4','5','6','7','8','9'};
sbit rw=P2^5;
sbit rs=P2^6;
sbit lcden=P2^7;
sbit key0=P2^4;//功能键
sbit key1=P2^3;//数值加键
sbit key2=P2^2;//数值减键
char jsnum=0,sec,ff,hh,key0num=0;
void write_sfh(unchar ,unchar );
void delay(unint z)
{
unint x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
void write_com(unchar com)
{
rs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(unchar date)
{
rs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void lcd_init()
{
unint t;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(t=0;t<10;t++)
  {
   write_date(table0[t]);
   delay(5);
  }
write_com(0x80+0x40);
for(t=0;t<8;t++)
  {
   write_date(table1[t]);
   delay(5);
  }
}
void time_init()
{
TMOD=0x01;
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void keyscan()
{
if(key0==0)
  {
   delay(20);
   if(key0==0)
   {
    key0num++;
    while(!key0);
   }
  }
         


        if(key1==0&key0num)
        {
        
         delay(20);
         if(key1==0)
         {
          while(!key1);
          if(key0num==1)  
          {
           sec++;
           if(sec==60)  sec=0;
            write_sfh(6,sec);}
          if(key0num==2)  
          {
           ff++;  
           if(ff==60) ff=0;
            write_sfh(3,ff);}
          if(key0num==3)
          {
           hh++;  
           if(hh==24)  hh=0;
            write_sfh(0,hh);}
         }
        }
        
        if(key2==0&key0num)
        {
         delay(20);
         if(key2==0)
         {
          while(!key2);
          if(key0num==1)  
          {
           sec--;
           if(sec==-1)  sec=59;
              write_sfh(6,sec);}
          if(key0num==2)  
          {
           ff--;  
           if(ff==-1)  ff=59;
           write_sfh(3,ff);}
          if(key0num==3)
          {
           hh--;  
           if(hh==-1)  hh=23;
           write_sfh(0,hh);}
         }
        }

}
void main()
{
rw=0;
    sec=0;
ff=0;
hh=0;
lcd_init();
time_init();
while(1)
{
  keyscan();
  if(jsnum==20)
   {
    jsnum=0;
    sec++;
      if(sec==60)
     {
      sec=0;
      ff++;
      if(ff==60)
       {
        ff=0;
        hh++;
        if(hh==24)
         {
          hh=0;
         }
         write_sfh(0,hh);
       }
       write_sfh(3,ff);
     }
     write_sfh(6,sec);
   }
}


}
void time0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
jsnum++;
}
void write_sfh(unchar add,unchar date)
{
unchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(table2[shi]);
write_date(table2[ge]);
}

相关帖子

沙发
xwj| | 2010-5-22 22:50 | 只看该作者
编程前,你要想好:人怎么去操作,然后程序要怎么动作,你就知道该怎么写了;
代码写好后,再多想想:会不会有什么意外才做,比如我乱按的话会不会发生什么错误? 想的多了,程序也就完善了。

使用特权

评论回复
板凳
步行者108|  楼主 | 2010-5-22 23:01 | 只看该作者
前辈,我时和秒都能调了,分的调节已经整整查了一天还没查出来,很急所以才来发帖,望前辈帮忙看看!

使用特权

评论回复
地板
mohanwei| | 2010-5-23 10:45 | 只看该作者
自己把代码缩进一下,写上注释,自然就很容易看出问题了……

使用特权

评论回复
5
zq_mcu| | 2010-5-23 11:10 | 只看该作者
看看是不是电路的问题

使用特权

评论回复
6
xwj| | 2010-5-23 11:18 | 只看该作者
        if(key1==0&key0num)
        {
                。。。。


LZ,先去想想(key1==0&key0num)是怎么执行的吧

然后去看书认真复习下运算符的优先级和结合规律,再去看看&和&&的区别。

使用特权

评论回复
7
小燕子神飞| | 2010-5-23 11:44 | 只看该作者
这个语句有问题吧: if(key1==0&key0num),

key0num==0正常 (0b0000_0000)
key0num==1调秒 (0b0000_0001)
key0num==2调分 (0b0000_0010)
key0num==3调时 (0b0000_0011)

按你的意思:
if(key1==0&key0num), 判断按下键了,同时 key0num!=0 条件成立,执行if语句
但是 key1==0的值是0或1,调分钟时 key0num 值是 0b0000_0010,两者相与 & 结果肯定为零.
第偶数个量应该都不可调, 秒正常,分不可调,小时正常,日不可调,月正常,年不可调...  呵呵
建议你改成: if(key1==0 && key0num) 或 if(key1==0 && key0num != 0), 其他类似的语句都改下再试试.

使用特权

评论回复
8
步行者108|  楼主 | 2010-5-23 13:10 | 只看该作者
7楼书的有理啊,谢谢大家!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

6

帖子

1

粉丝