找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2087|回复: 4
打印 上一主题 下一主题
收起左侧

51单片机制作电子钟,在调用keyscan()函数出现问题,求助!!

[复制链接]
跳转到指定楼层
楼主
ID:541879 发表于 2019-12-23 12:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
51单片机用1602制作电子钟,调用keyscan()函数出现问题,求助!
代码如下:

  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. //lcd_data = P0

  5. sbit lcdrs = P2^2;
  6. sbit lcdrw = P2^1;
  7. sbit lcden = P2^0;
  8. sbit k1 = P3^3;
  9. sbit k2 = P3^2;
  10. sbit k3 = P3^1;
  11. sbit Led = P1^0;   //led light

  12. uchar i,t=0,k1num = 0;
  13. uint year = 2019;
  14. char h = 00,m = 00,s = 00,w = 55,month = 01,day = 01 ;

  15. uchar code table1[] = {"2019-12-22 SUN"}; //初始日期
  16. uchar code table2[] = {"   00:00:00   "}; //初始时间
  17. uchar code table3[] = {" smhwdmy "}; //模式状态选择(秒s,分m,时h,周w,日d,月m,年y)

  18. void delay(uchar z)
  19. {
  20.    uchar x,y;
  21.    for(x = z;x>0;x--)
  22.      for(y=110;y>0;y--);
  23. }

  24. void write_com(uchar com){
  25.    lcdrs = 0;
  26.    lcdrw = 0;
  27.    P0 = com;
  28.    delay(10);
  29.    lcden = 1;
  30.    delay(10);
  31.    lcden = 0;
  32. }

  33. void write_dat(uchar dat)         //LCD写数据
  34. {
  35.    lcdrs = 1;
  36.    lcdrw = 0;
  37.    P0 = dat;
  38.    delay(10);
  39.    lcden = 1;
  40.    delay(10);
  41.    lcden = 0;
  42. }

  43. void Monday(void)         //调用星期一子函数
  44. {
  45.    write_com(0x80 + 12);
  46.    write_dat('M');
  47.    write_com(0x80 + 13);
  48.    write_dat('O');
  49.    write_com(0x80 + 14);
  50.    write_dat('N');
  51. }

  52. void Tuesday(void)         //调用星期二子函数
  53. {
  54.    write_com(0x80 + 12);
  55.    write_dat('T');
  56.    write_com(0x80 + 13);
  57.    write_dat('U');
  58.    write_com(0x80 + 14);
  59.    write_dat('E');
  60. }

  61. void Wednesday(void)         //调用星期三子函数
  62. {
  63.    write_com(0x80 + 12);
  64.    write_dat('W');
  65.    write_com(0x80 + 13);
  66.    write_dat('E');
  67.    write_com(0x80 + 14);
  68.    write_dat('D');
  69. }

  70. void Thursday(void)         //调用星期四子函数
  71. {
  72.    write_com(0x80 + 12);
  73.    write_dat('T');
  74.    write_com(0x80 + 13);
  75.    write_dat('H');
  76.    write_com(0x80 + 14);
  77.    write_dat('U');
  78. }

  79. void Friday(void)         //调用星期五子函数
  80. {
  81.    write_com(0x80 + 12);
  82.    write_dat('F');
  83.    write_com(0x80 + 13);
  84.    write_dat('R');
  85.    write_com(0x80 + 14);
  86.    write_dat('I');
  87. }

  88. void Saturday(void)         //调用星期六子函数
  89. {
  90.    write_com(0x80 + 12);
  91.    write_dat('S');
  92.    write_com(0x80 + 13);
  93.    write_dat('A');
  94.    write_com(0x80 + 14);
  95.    write_dat('T');
  96. }

  97. void Sunday(void)         //调用星期日子函数
  98. {
  99.    write_com(0x80 + 12);
  100.    write_dat('S');
  101.    write_com(0x80 + 13);
  102.    write_dat('U');
  103.    write_com(0x80 + 14);
  104.    write_dat('N');
  105. }

  106. void display_week(uchar week)         //星期显示
  107. {
  108.    switch(week)
  109.    {
  110.       case 1: Monday();break;
  111.              case 2: Tuesday();break;
  112.           case 3: Wednesday();break;
  113.           case 4: Thursday();break;
  114.           case 5: Friday();break;
  115.           case 6: Saturday();break;
  116.           case 7: Sunday();break;
  117.    }
  118. }

  119. void init(void)                  //LCD初始显示
  120. {
  121.    lcden = 0;
  122.    write_com(0x38);
  123.    write_com(0x0c);
  124.    write_com(0x06);
  125.    write_com(0x01);
  126.    write_com(0x80);
  127.    TMOD = 0x01;

  128.    ET0 = 1;
  129.    EA = 1;
  130.    TH0 = 0x3c;TL0 = 0xb0;
  131.    TR0 = 1;
  132.    write_com(0x80);
  133.    for(i=0;i<15;i++)
  134.      {
  135.             write_dat(table1[i]);delay(5);
  136.          }
  137.    write_com(0x80 + 0x40);
  138.    for(i=0;i<11;i++)
  139.      {
  140.               write_dat(table2[i]);delay(5);
  141.      }
  142. }

  143. void display_time(uchar ad,uchar time)                //时间显示
  144. {
  145.    uchar a,b;
  146.    a = time/10;
  147.    b = time%10;
  148.    write_com(0x80 + 0x40 + ad);
  149.    write_dat(0x30 + a);
  150.    write_com(0x80 + 0x40 + 1 + ad);
  151.    write_dat(0x30 + b);
  152. }

  153. void display_date(uint nian,char yue,char ri)        //日期显示
  154. {
  155.    uint y1,y2,y3,y4;
  156.    char a,b,c,d;
  157.    y1 = nian/1000;
  158.    y2 = nian%1000/100;
  159.    y3 = nian%1000%100/10;
  160.    y2 = nian%1000%100%10;
  161.    a = yue/10;
  162.    b = yue%10;
  163.    c = ri/10;
  164.    d = ri%10;
  165.    write_com(0x80 + 1);
  166.    write_dat(0x30 + y1);
  167.    write_com(0x80 + 2);
  168.    write_dat(0x30 + y2);
  169.    write_com(0x80 + 3);
  170.    write_dat(0x30 + y3);
  171.    write_com(0x80 + 4);
  172.    write_dat(0x30 + y4);
  173.    write_com(0x80 + 6);
  174.    write_dat(0x30 + a);
  175.    write_com(0x80 + 7);
  176.    write_dat(0x30 + b);
  177.    write_com(0x80 + 9);
  178.    write_dat(0x30 + c);
  179.    write_com(0x80 + 10);
  180.    write_dat(0x30 + d);
  181. }

  182. void display_state(uchar s)                        //模式状态屏幕显示
  183. {
  184.    write_com(0x80 + 0x40 + 14);
  185.    write_dat(table3[s]);
  186. }

  187. void keyscan()                        //按键扫描
  188. {
  189.    if(k1==0)
  190.    {
  191.       delay(10);
  192.           if(k1==0)
  193.           {
  194.              Led = 0;
  195.                  k1num++;TR0 = 0;t = 0;
  196.                  while(!k1);
  197.                  if(k1num==1)
  198.                  {write_com(0x80 + 0x40 + 11);write_com(0x0f);display_state(k1num - 1);} //s
  199.                    if(k1num==2)
  200.                  {write_com(0x80 + 0x40 + 8);display_state(k1num - 1);} //m
  201.                  if(k1num==3)
  202.                  {write_com(0x80 + 0x40 + 5);display_state(k1num - 1);} //h
  203.                  if(k1num==4)
  204.                  {write_com(0x80 + 14);display_state(k1num - 1);} //week
  205.                  if(k1num==5)
  206.                  {write_com(0x80 + 10);display_state(k1num - 1);} //day
  207.                  if(k1num==6)
  208.                  {write_com(0x80 + 7);display_state(k1num - 1);} //month
  209.                  if(k1num==7)
  210.                  {write_com(0x80 + 4);display_state(k1num - 1);} //year
  211.                  if(k1num==8)
  212.                  {k1num = 0;write_com(0x0c);TR0 = 1;Led = 1;display_state(7);}
  213.           }
  214.    }
  215.    if(k1num!=0)
  216.    {

  217.       if(k2==0)
  218.           {
  219.              delay(10);
  220.                  if(k2==0)
  221.                  {
  222.                     while(!k2);
  223.                         if(k1num==1)
  224.                          {
  225.                            s++;
  226.                            if(s==60)
  227.                            s = 0;
  228.                            display_time(10,s);
  229.                          }                 
  230.                     if(k1num==2)
  231.                          {
  232.                            m++;
  233.                            if(m==60)
  234.                            m = 0;
  235.                            display_time(7,m);
  236.                          }
  237.                         if(k1num==3)
  238.                          {
  239.                            h++;
  240.                            if(h==24)
  241.                            h = 0;
  242.                            display_time(4,h);
  243.                          }
  244.                          if(k1num==4)
  245.                          {
  246.                            w++;
  247.                            if(w==8)
  248.                            w = 1;
  249.                            display_week(w);
  250.                          }
  251.                          if(k1num==5)
  252.                          {
  253.                            day++;
  254.                            if(day==32)
  255.                            day = 1;
  256.                            display_date(year,month,day);
  257.                          }
  258.                         if(k1num==6)
  259.                          {
  260.                            month++;
  261.                            if(month==13)
  262.                            month = 1;
  263.                            display_date(year,month,day);
  264.                          }
  265.                         if(k1num==7)
  266.                          {
  267.                            year++;
  268.                            display_date(year,month,day);
  269.                          }
  270.                  }   
  271.           }
  272.           if(k3==0)
  273.           {
  274.                   delay(10);
  275.                    if(k3==0)
  276.                   {
  277.                           while(!k3);
  278.                      if(k1num==1)
  279.                           {          s--;
  280.                           if(s==-1)
  281.                                   s=59;
  282.                                   display_time(10,s);
  283.                 }
  284.                          if(k1num==2)
  285.                           {          m--;
  286.                           if(m==-1)
  287.                                   m=59;
  288.                                   display_time(7,m);
  289.                 }
  290.                          if(k1num==3)
  291.                           {          h--;
  292.                           if(h==-1)
  293.                                   h=23;
  294.                                   display_time(4,h);
  295.                 }
  296.                          if(k1num==4)
  297.                           {          w--;
  298.                           if(w==0)
  299.                                   w=7;
  300.                                   display_week(w);
  301.                 }
  302.                          if(k1num==5)
  303.                           {          day--;
  304.                           if(day==0)
  305.                                   day=31;
  306.                                   display_date(year,month,day);
  307.                 }
  308.                          if(k1num==6)
  309.                           {          month--;
  310.                           if(month==0)
  311.                                   month=12;
  312.                                   display_date(year,month,day);
  313.                 }
  314.                          if(k1num==7)
  315.                           {          year--;
  316.                                   display_date(year,month,day);
  317.                 }
  318.              }
  319.       }
  320.    }
  321. display_date(year,month,day);
  322. display_week(w);
  323. display_time(10,s);
  324. display_time(7,m);
  325. display_time(4,h);
  326. }

  327. void timer0()interrupt 1
  328. {
  329.                 t++;
  330.                 TH0=0x3c;
  331.                 TL0=0xb0;
  332.                 if(t==20)
  333.                 {s++;t=0;}
  334.                 if(s==60)
  335.                 {m++;s=0;}
  336.                 if(m==60)
  337.                 {h++;m=0;}
  338.                 if(h==24)
  339.                 {w++;day++;h=0;}
  340.                 if(w==8)
  341.                 {w=1;}
  342.                 if(day==32)
  343.                 {month++;day=1;}
  344.                 if(month==13)
  345.                 {year++;month=1;}
  346. }

  347. void main()
  348. {
  349.         init();
  350.         while(1);
  351.         {
  352.                 keyscan();
  353.         }
  354. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:541879 发表于 2019-12-23 12:49 | 只看该作者
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
//lcd_data = P0

sbit lcdrs = P2^2;
sbit lcdrw = P2^1;
sbit lcden = P2^0;
sbit k1 = P3^3;
sbit k2 = P3^2;
sbit k3 = P3^1;
sbit Led = P1^0;   //led light

uchar i,t=0,k1num = 0;
uint year = 2019;
char h = 00,m = 00,s = 00,w = 55,month = 01,day = 01 ;

uchar code table1[] = {"2019-12-22 SUN"}; //初始日期
uchar code table2[] = {"   00:00:00   "}; //初始时间
uchar code table3[] = {" smhwdmy "}; //模式状态选择(秒s,分m,时h,周w,日d,月m,年y)

void delay(uchar z)
{
   uchar x,y;
   for(x = z;x>0;x--)
     for(y=110;y>0;y--);
}

void write_com(uchar com)         //写命令函数
{
   lcdrs = 0;
   lcdrw = 0;
   P0 = com;
   delay(10);
   lcden = 1;
   delay(10);
   lcden = 0;
}

void write_dat(uchar dat)         //LCD写数据
{
   lcdrs = 1;
   lcdrw = 0;
   P0 = dat;
   delay(10);
   lcden = 1;
   delay(10);
   lcden = 0;
}

void Monday(void)         //调用星期一子函数
{
   write_com(0x80 + 12);
   write_dat('M');
   write_com(0x80 + 13);
   write_dat('O');
   write_com(0x80 + 14);
   write_dat('N');
}

void Tuesday(void)         //调用星期二子函数
{
   write_com(0x80 + 12);
   write_dat('T');
   write_com(0x80 + 13);
   write_dat('U');
   write_com(0x80 + 14);
   write_dat('E');
}

void Wednesday(void)         //调用星期三子函数
{
   write_com(0x80 + 12);
   write_dat('W');
   write_com(0x80 + 13);
   write_dat('E');
   write_com(0x80 + 14);
   write_dat('D');
}

void Thursday(void)         //调用星期四子函数
{
   write_com(0x80 + 12);
   write_dat('T');
   write_com(0x80 + 13);
   write_dat('H');
   write_com(0x80 + 14);
   write_dat('U');
}

void Friday(void)         //调用星期五子函数
{
   write_com(0x80 + 12);
   write_dat('F');
   write_com(0x80 + 13);
   write_dat('R');
   write_com(0x80 + 14);
   write_dat('I');
}

void Saturday(void)         //调用星期六子函数
{
   write_com(0x80 + 12);
   write_dat('S');
   write_com(0x80 + 13);
   write_dat('A');
   write_com(0x80 + 14);
   write_dat('T');
}

void Sunday(void)         //调用星期日子函数
{
   write_com(0x80 + 12);
   write_dat('S');
   write_com(0x80 + 13);
   write_dat('U');
   write_com(0x80 + 14);
   write_dat('N');
}

void display_week(uchar week)         //星期显示
{
   switch(week)
   {
      case 1: Monday();break;
             case 2: Tuesday();break;
          case 3: Wednesday();break;
          case 4: Thursday();break;
          case 5: Friday();break;
          case 6: Saturday();break;
          case 7: Sunday();break;
   }
}

void init(void)                  //LCD初始显示
{
   lcden = 0;
   write_com(0x38);
   write_com(0x0c);
   write_com(0x06);
   write_com(0x01);
   write_com(0x80);
   TMOD = 0x01;

   ET0 = 1;
   EA = 1;
   TH0 = 0x3c;TL0 = 0xb0;
   TR0 = 1;
   write_com(0x80);
   for(i=0;i<15;i++)
     {
            write_dat(table1[i]);delay(5);
         }
   write_com(0x80 + 0x40);
   for(i=0;i<11;i++)
     {
              write_dat(table2[i]);delay(5);
     }
}

void display_time(uchar ad,uchar time)                //时间显示
{
   uchar a,b;
   a = time/10;
   b = time%10;
   write_com(0x80 + 0x40 + ad);
   write_dat(0x30 + a);
   write_com(0x80 + 0x40 + 1 + ad);
   write_dat(0x30 + b);
}

void display_date(uint nian,char yue,char ri)        //日期显示
{
   uint y1,y2,y3,y4;
   char a,b,c,d;
   y1 = nian/1000;
   y2 = nian%1000/100;
   y3 = nian%1000%100/10;
   y2 = nian%1000%100%10;
   a = yue/10;
   b = yue%10;
   c = ri/10;
   d = ri%10;
   write_com(0x80 + 1);
   write_dat(0x30 + y1);
   write_com(0x80 + 2);
   write_dat(0x30 + y2);
   write_com(0x80 + 3);
   write_dat(0x30 + y3);
   write_com(0x80 + 4);
   write_dat(0x30 + y4);
   write_com(0x80 + 6);
   write_dat(0x30 + a);
   write_com(0x80 + 7);
   write_dat(0x30 + b);
   write_com(0x80 + 9);
   write_dat(0x30 + c);
   write_com(0x80 + 10);
   write_dat(0x30 + d);
}

void display_state(uchar s)                        //模式状态屏幕显示
{
   write_com(0x80 + 0x40 + 14);
   write_dat(table3[s]);
}

void keyscan()                        //按键扫描
{
   if(k1==0)
   {
      delay(10);
          if(k1==0)
          {
             Led = 0;
                 k1num++;TR0 = 0;t = 0;
                 while(!k1);
                 if(k1num==1)
                 {write_com(0x80 + 0x40 + 11);write_com(0x0f);display_state(k1num - 1);} //s
                   if(k1num==2)
                 {write_com(0x80 + 0x40 + 8);display_state(k1num - 1);} //m
                 if(k1num==3)
                 {write_com(0x80 + 0x40 + 5);display_state(k1num - 1);} //h
                 if(k1num==4)
                 {write_com(0x80 + 14);display_state(k1num - 1);} //week
                 if(k1num==5)
                 {write_com(0x80 + 10);display_state(k1num - 1);} //day
                 if(k1num==6)
                 {write_com(0x80 + 7);display_state(k1num - 1);} //month
                 if(k1num==7)
                 {write_com(0x80 + 4);display_state(k1num - 1);} //year
                 if(k1num==8)
                 {k1num = 0;write_com(0x0c);TR0 = 1;Led = 1;display_state(7);}
          }
   }
   if(k1num!=0)
   {
      
      if(k2==0)
          {
             delay(10);
                 if(k2==0)
                 {
                    while(!k2);
                        if(k1num==1)
                         {
                           s++;
                           if(s==60)
                           s = 0;
                           display_time(10,s);
                         }                 
                    if(k1num==2)
                         {
                           m++;
                           if(m==60)
                           m = 0;
                           display_time(7,m);
                         }
                        if(k1num==3)
                         {
                           h++;
                           if(h==24)
                           h = 0;
                           display_time(4,h);
                         }
                         if(k1num==4)
                         {
                           w++;
                           if(w==8)
                           w = 1;
                           display_week(w);
                         }
                         if(k1num==5)
                         {
                           day++;
                           if(day==32)
                           day = 1;
                           display_date(year,month,day);
                         }
                        if(k1num==6)
                         {
                           month++;
                           if(month==13)
                           month = 1;
                           display_date(year,month,day);
                         }
                        if(k1num==7)
                         {
                           year++;
                           display_date(year,month,day);
                         }
                 }   
          }
          if(k3==0)
          {
                  delay(10);
                   if(k3==0)
                  {
                          while(!k3);
                     if(k1num==1)
                          {          s--;
                          if(s==-1)
                                  s=59;
                                  display_time(10,s);
                }
                         if(k1num==2)
                          {          m--;
                          if(m==-1)
                                  m=59;
                                  display_time(7,m);
                }
                         if(k1num==3)
                          {          h--;
                          if(h==-1)
                                  h=23;
                                  display_time(4,h);
                }
                         if(k1num==4)
                          {          w--;
                          if(w==0)
                                  w=7;
                                  display_week(w);
                }
                         if(k1num==5)
                          {          day--;
                          if(day==0)
                                  day=31;
                                  display_date(year,month,day);
                }
                         if(k1num==6)
                          {          month--;
                          if(month==0)
                                  month=12;
                                  display_date(year,month,day);
                }
                         if(k1num==7)
                          {          year--;
                                  display_date(year,month,day);
                }
             }
      }
   }
display_date(year,month,day);
display_week(w);
display_time(10,s);
display_time(7,m);
display_time(4,h);
}

void timer0()interrupt 1
{
                t++;
                TH0=0x3c;
                TL0=0xb0;
                if(t==20)
                {s++;t=0;}
                if(s==60)
                {m++;s=0;}
                if(m==60)
                {h++;m=0;}
                if(h==24)
                {w++;day++;h=0;}
                if(w==8)
                {w=1;}
                if(day==32)
                {month++;day=1;}
                if(month==13)
                {year++;month=1;}
}

void main()
{
        init();
        while(1);
        {
                keyscan();
        }
}








回复

使用道具 举报

板凳
ID:140489 发表于 2019-12-27 09:08 | 只看该作者
你又不说是什么问题,你是想帮你的人自己去猜吗?
回复

使用道具 举报

地板
ID:394424 发表于 2019-12-27 10:02 | 只看该作者
while(!k1);  和delay 延时做按键检测效果真的差  你去参考别人用中断做的
回复

使用道具 举报

5#
ID:213173 发表于 2019-12-27 10:27 | 只看该作者
bzy 发表于 2019-12-23 12:49
#include
#define uint unsigned int
#define uchar unsigned char

void main()
{
        init();
        while(1);  这里多了分号,
        {
                keyscan();
        }
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表