微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于数字时钟。

关于数字时钟。

时间:10-02 整理:3721RD 点击:
/*键盘按键调整数值出现了问题*/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcden=P2^7;
sbit lcdwr=P2^5;
sbit lcdrs=P2^6;
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
uchar code table[]="2014-02-08";
uchar code table1[]="00:00:00";
uint shi,fen,miao,s;
void delay(uint ms)
{
        uint x,y;
        for(x=ms;x>0;x--)
                for(y=110;y>0;y--);       
}
void write_com(uchar com)
{
        lcdwr=0;
        lcdrs=0;
        P0=com;
        delay(1);
        lcden=1;
        delay(1);
        lcden=0;
}
void write_data(uchar dat)
{
        lcdwr=0;
        lcdrs=1;
        P0=dat;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}
void init()
{
        uint num;
        lcden=0;
        write_com(0x38);
        write_com(0x0e);
        write_com(0x06);
        write_com(0x01);
        write_com(0x80);
        for(num=0;num<10;num++)
        {
                write_data(table[num]);
                delay(5);
        }
        write_com(0x80+0x40);       
        for(num=0;num<8;num++)
        {
                write_data(table1[num]);
                delay(5);
        }
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        TMOD=0x01;
        EA=1;
        ET0=1;
        TR0=1;
}

void write_sfm(uchar add,uchar date)
{
        uint shi,ge;
        shi=date/10;
        ge=date%10;
        write_com(0x80+0x40+add);
        write_data(0x30+shi);
        write_data(0x30+ge);
}
void keyscan()
{
        if(k1==0)
        {
                delay(1);
                if(k1==0)
                {
                        s++;
                        while(k1!=0);
                        if(s==1)
                        {
                                TR0=0;
                                write_com(0x80+0x40+7);
                        }
                        if(s==2)
                        {
                                write_com(0x80+0x40+4);
                        }
                        if(s==3)
                        {
                                write_com(0x80+0x40+1);       
                        }
                        if(s==4)
                        {
                                s=0;
                                write_com(0x0f);
                                TR0=1;
                        }
                }                                                                                        /*应该从这里出现了问题。主要是按键后不能调整*/
                if(s!=0)                                                                                                                               
                {
                        delay(1);
                        if(k2==0)
                        {
                                if(k2==0)
                                {
                                        while(k2!=0);
                                        if(s==1)
                                        {
                                                miao++;
                                                if(miao==60)
                                                        miao=0;
                                                write_com(0x80+0x40+7);
                                                write_sfm(7,miao);
                                        }
                                        if(s==2)
                                        {
                                                fen++;
                                                if(fen==60)
                                                        fen=0;
                                                write_com(0x80+0x40+4);
                                                write_sfm(4,fen);
                                        }               
                                        if(s==3)
                                        {
                                                shi++;
                                                if(shi==24)
                                                        shi=0;
                                                write_com(0x80+0x40+1);
                                                write_sfm(1,shi);
                                        }
                                }
                        }
                   if(k3==0)
                   {
                                   delay(1);
                                if(k3==0)
                                {
                                        while(k3!=0);
                                        if(s==1)
                                        {
                                                miao--;
                                                if(miao==-1)
                                                        miao=59;
                                                write_com(0x80+0x40+7);
                                                write_sfm(7,miao);
                                        }
                                        if(s==2)
                                        {
                                                fen--;
                                                if(fen==-1)
                                                        fen=59;
                                                write_com(0x80+0x40+4);
                                                write_sfm(4,fen);
                                        }               
                                        if(s==3)
                                        {
                                                shi--;
                                                if(shi==-1)
                                                        shi=23;
                                                write_com(0x80+0x40+1);
                                                write_sfm(1,shi);
                                        }
                                }
                        }                  
                   }
                }                                                                                                        /*这里结束*/
}
void main()
{
        init();
        while(1)
        {
                keyscan();
        }
}
void timer0() interrupt 1
{         
        uint count;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        count++;
        if(count==20)
        {
                count=0;
                miao++;
                if(miao==60)
                {
                        miao=0;
                        fen++;
                        if(fen==60)
                        {
                                fen=0;
                                shi++;
                                if(shi==24)
                                {
                                        shi=0;
                                }
                                write_sfm(1,shi);
                        }
                        write_sfm(3,fen);
                }
                write_sfm(6,miao);
        }       
}

  1. /*
  2. *利用1602显示数字时钟 时分秒星期均开调节 使用矩阵键盘的最后一列后三个
  3. */
  4. #include<reg52.h>
  5. #define uchar unsigned char
  6. #define uint unsigned int
  7. sbit lcden=P3^4;
  8. sbit lcdrs=P3^5;
  9. sbit wela=P2^7;
  10. sbit dula=P2^6;
  11. sbit s1=P3^1;
  12. sbit s2=P3^2;
  13. sbit s3=P3^3;
  14. sbit rd=P3^7;
  15. uchar code table[]={" 2014-02-08 SUN"};
  16. uchar code table1[]={"    00:00:00"};
  17. uchar i,jishu,s1num,shi,fen,miao,zhou;
  18. //延时函数
  19. void delayms(uchar z)
  20. {
  21.   uchar x,y;
  22.   for(x=z;x>0;x--)
  23.   for(y=110;y>0;y--);
  24. }
  25. //读指令 高脉冲读走指令
  26. void write_com(uchar com)
  27. {
  28.   lcdrs=0;
  29.   lcden=0;
  30.   lcden=1;
  31.   delayms(5);
  32.   P0=com;
  33.   lcden=0;
  34.   delayms(5);
  35. }
  36. //读数据 高脉冲读走数据
  37. void write_date(uchar date)
  38. {
  39.   lcdrs=1;
  40.   lcden=0;
  41.   lcden=1;
  42.   delayms(5);
  43.   P0=date;
  44.   lcden=0;
  45.   delayms(5);
  46. }
  47. //初始化子函数
  48. void init()
  49. {
  50.   wela=0;
  51.   dula=0;
  52.   lcden=0;
  53. //初始化1602液晶新品啊  
  54.   write_com(0x38);
  55.   write_com(0x0c);
  56.   write_com(0x06);
  57.   write_com(0x01);
  58. //写入第一行
  59.         write_com(0x80);
  60.         for(i=0;i<15;i++)
  61.         {
  62.     write_date(table[i]);
  63.     delayms(5);
  64.         }
  65. //写入第二行       
  66.         write_com(0x80+0x40);
  67.         for(i=0;i<12;i++)
  68.         {
  69.     write_date(table1[i]);
  70.     delayms(5);
  71.         }
  72. //开启T0中断       
  73.         TMOD=0x01;
  74.         TH0=(65536-46080)/256;
  75.         TL0=(65536-46080)%256;
  76.         EA=1;
  77.         ET0=1;
  78.         IT0=0;
  79.         TR0=1;
  80. }
  81. //第二行修改时分秒
  82. void write_sfm(uchar add,uchar date)
  83. {
  84.   write_com(0x80+0x40+add);
  85.   write_date(date/10+0x30);
  86.   write_date(date%10+0x30);
  87. }
  88. //第一行修改星期
  89. void write_zhou(uchar add,uchar date)
  90. {
  91.   write_com(0x80+add);
  92.   switch(date)
  93.   {
  94.     case 0: write_date('S');write_date('U');write_date('N');break;
  95.     case 1: write_date('M');write_date('O');write_date('N');break;
  96.     case 2: write_date('T');write_date('U');write_date('E');break;
  97.     case 3: write_date('W');write_date('E');write_date('D');break;
  98.     case 4: write_date('T');write_date('H');write_date('U');break;
  99.     case 5: write_date('F');write_date('R');write_date('I');break;
  100.     case 6: write_date('S');write_date('A');write_date('T');break;
  101.   }
  102. }
  103. //键盘扫描程序
  104. void keyscan()
  105. {
  106.   rd=0;
  107.   //第一个按键按下后的响应
  108.   if(s1==0)
  109.   {
  110.     delayms(5);
  111.     if(s1==0)
  112.     {
  113.       while(!s1);
  114.       delayms(5);
  115.       while(!s1);
  116.       s1num++;
  117.       if(s1num==5)
  118.       {
  119.         s1num=0;
  120.         write_com(0x0c);
  121.         TR0=1;
  122.       }
  123.       if(s1num==1)
  124.       {
  125.         TR0=0;
  126.         write_com(0x0f);
  127.         write_com(0x80+0x40+10);
  128.       }
  129.       if(s1num==2)
  130.         write_com(0x80+0x40+7);
  131.       if(s1num==3)
  132.         write_com(0x80+0x40+4);
  133.       if(s1num==4)
  134.         write_com(0x80+12);
  135.     }
  136.   }
  137. //第二个按键按下后的响应  
  138.   if(s2==0)
  139.   {
  140.     delayms(5);
  141.     if(s2==0)
  142.     {
  143.       while(!s2);
  144.       delayms(5);
  145.       while(!s2);
  146.       if(s1num==1)
  147.       {
  148.         miao++;
  149.         if(miao==60)
  150.           miao=0;
  151.         write_sfm(10,miao);
  152.         write_com(0x80+0x40+10);
  153.       }
  154.       if(s1num==2)
  155.       {
  156.         fen++;
  157.         if(fen==60)
  158.           fen=0;
  159.         write_sfm(7,fen);
  160.         write_com(0x80+0x40+7);
  161.       }
  162.       if(s1num==3)
  163.       {
  164.         shi++;
  165.         if(shi==24)
  166.           shi=0;
  167.         write_sfm(4,shi);
  168.         write_com(0x80+0x40+4);
  169.       }
  170.       if(s1num==4)
  171.       {
  172.         zhou++;
  173.         if(zhou==7)
  174.           zhou=0;
  175.         write_zhou(12,zhou);
  176.         write_com(0x80+12);
  177.       }
  178.     }
  179.   }
  180. //第三个按键按下后的响应
  181.   if(s3==0)
  182.   {
  183.     delayms(5);
  184.     if(s3==0)
  185.     {
  186.       while(!s3);
  187.       delayms(5);
  188.       while(!s3);
  189.       if(s1num==1)
  190.       {
  191.         miao--;
  192.         if(miao==255)
  193.           miao=59;
  194.         write_sfm(10,miao);
  195.         write_com(0x80+0x40+10);
  196.       }
  197.       if(s1num==2)
  198.       {
  199.         fen--;
  200.         if(fen==255)
  201.           fen=59;
  202.         write_sfm(7,fen);
  203.         write_com(0x80+0x40+7);
  204.       }
  205.       if(s1num==3)
  206.       {
  207.         shi--;
  208.         if(shi==255)
  209.           shi=23;
  210.         write_sfm(4,shi);
  211.         write_com(0x80+0x40+4);
  212.       }
  213.       if(s1num==4)
  214.       {
  215.         zhou--;
  216.         if(zhou==255)
  217.           zhou=6;
  218.         write_zhou(12,zhou);
  219.         write_com(0x80+12);
  220.       }
  221.     }
  222.   }
  223. }
  224. void main()
  225. {
  226.   init();
  227.   while(1)
  228.   {
  229.     keyscan();
  230.   }
  231. }
  232. //中断函数
  233. void time0() interrupt 1
  234. {
  235.   TH0=(65536-46080)/256;
  236.   TL0=(65536-46080)%256;
  237.   jishu++;
  238.   //根据计数器的数据进行时分秒 星期的更新
  239.   //只要以下程序的反应时间不超过50ms就可以 放在while中可能长时间按s3导致jishu异常
  240.   if(jishu==20)
  241.   {
  242.     jishu=0;
  243.     miao++;
  244.     if(miao==60)
  245.     {
  246.       miao=0;
  247.       fen++;
  248.       if(fen==60)
  249.       {
  250.         fen=0;
  251.         shi++;
  252.         if(shi==24)
  253.         {
  254.           shi=0;
  255.           zhou++;
  256.           if(zhou==7)
  257.             zhou=0;
  258.           write_zhou(12,zhou);
  259.         }
  260.         write_sfm(4,shi);
  261.       }
  262.       write_sfm(7,fen);
  263.     }
  264.     write_sfm(10,miao);
  265.   }  
  266. }

复制代码


小编看的应该是郭天祥的教程吧。这个是我原来写的代码。
主要问题keyscan中if应该是并列关系,由s进一步判断加减
慢慢看能看懂的,上面有我的注释

谢谢!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top