[国产单片机] 外部中断按键调时程序问题

[复制链接]
774|5
 楼主| 1154775677 发表于 2019-1-13 22:08 | 显示全部楼层 |阅读模式
  1. /***************************¼üÅÌɨÃè***********************************/
  2. //¼üÅÌɨÃ躯Êý

  3. uchar key_scan()
  4. {
  5.          uchar key;
  6.    P3 = 0xff;
  7.          if(P3 == 0xfe)           //µÚÒ»¸ö°´¼ü P30
  8.        delay_ms(5);        
  9.                 if(P3 == 0xfe)
  10.                                         {
  11.                                            key = 1;
  12.                                                  while(P3 == 0xfe);
  13.                                                  delay_ms(5);
  14.                                                  while(P3 == 0xfe);
  15.                                                  return key;
  16.                                         }
  17.          else if(P3 == 0xfd)          //µÚ¶þ¸ö°´¼ü P31
  18.                     delay_ms(5);
  19.                  if(P3 == 0xfd)
  20.                                          {
  21.                                           key = 2;
  22.                                                 while(P3 == 0xfd);
  23.                                                 delay_ms(5);
  24.                                                 while(P3 == 0xfd);
  25.                                                 return key;
  26.                                          }
  27.         else if(P3 == 0xf7)         //µÚËĸö°´Å¥  P33
  28.                      delay_ms(5);
  29.                  if(P3 != 0xf7)
  30.                                          {
  31.                                           key = 4;
  32.                                                 while(P3 == 0xf7);
  33.                                                 delay_ms(5);
  34.                                                 while(P3 == 0xf7);
  35.                                                 return key;
  36.                                          }
  37.                 return 0xff;
  38. }
  39. /***************ÍⲿÖжÏ***********************************/
  40. //³õʼ»¯

  41. void External_init0()
  42. {
  43.    IT0 = 1;   //ÍⲿÒý½ÅϽµÑزúÉúÖжÏ
  44.    EA =  1;
  45.          EX0 = 1;   //ÔÊÐíÍⲿÖжÏ
  46. }
  47. //ÖжϷþÎñ³ÌÐò
  48. void External_INT0() interrupt 0
  49. {
  50.     uchar keyvalue;
  51.           LCD1602_init();
  52.           keyvalue = key_scan();  //ɨÃè¶ÀÁ¢¼üÅ
  53.           if(keyvalue == 1)       //ʱ
  54.                   {
  55.                                 TIME[2] = (TIME[2]/16)*10 + TIME[2]%16;
  56.                           TIME[2]++;
  57.                                 if(TIME[2] == 24) TIME[2] = 0;
  58.                                 TIME[2] = (TIME[2]/10)*16 + TIME[2]%10;
  59.                                
  60.                                 dis_onechar(5,1,TIME[2]/16 + '0'); //ʱ
  61.               dis_onechar(6,1,TIME[2]%16 + '0');
  62.               dis_onechar(7,1,':');
  63.                                 DS1302write_dat(0x84,TIME[2]);
  64.             }

  65.    
  66.          else        if(keyvalue == 2)      //·Ö
  67.                   {
  68.                    TIME[1] = (TIME[1]/16)*10 + TIME[1]%16;
  69.        TIME[1]++;
  70.                          if(TIME[1] == 60) TIME[1] = 0;
  71.        TIME[1] = (TIME[1]/10)*16 + TIME[1]%10;
  72.                                
  73.                         dis_onechar(8,1,TIME[1]/16 + '0'); //·Ö
  74.             dis_onechar(9,1,TIME[1]%16 + '0');
  75.             dis_onechar(10,1,':');
  76.                         DS1302write_dat(0x82,TIME[1]);
  77.             }                       
  78.         else if(keyvalue == 4)     //Ãë
  79.                    {
  80.                     TIME[0] = (TIME[0]/16)*10 + TIME[0]%16;
  81.                                 TIME[0]++;
  82.                                 if(TIME[1] == 60) TIME[1] = 0;
  83.                                 TIME[0] = (TIME[0]/10)*16 + TIME[0]%10;
  84.                                
  85.                                 dis_onechar(11,1,TIME[0]/16 + '0');//Ãë
  86.               dis_onechar(12,1,TIME[0]%16 + '0');
  87.                                 DS1302write_dat(0x80,TIME[0]);
  88.            }
  89. }

DS1302 LCD1602 键盘的扫描函数都用串口调试过可以用 就是用外部中断调时 时出先问题 求大佬指导啊 实在调不出来了

评论

哎 帖子凉凉  发表于 2019-1-15 19:25
xuyaqi 发表于 2019-1-14 08:37 | 显示全部楼层
把全部工程发出来才好找问题,局部看不出问题。
 楼主| 1154775677 发表于 2019-1-14 11:55 | 显示全部楼层
xuyaqi 发表于 2019-1-14 08:37
把全部工程发出来才好找问题,局部看不出问题。

好的
 楼主| 1154775677 发表于 2019-1-14 11:56 | 显示全部楼层
xuyaqi 发表于 2019-1-14 08:37
把全部工程发出来才好找问题,局部看不出问题。
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. typedef unsigned char uchar;

  4. uchar table[] = {"Time:"};
  5. uchar table1[] = {"Date:"};
  6. #define DS1302_W_ADDR 0x80
  7. #define DS1302_R_ADDR 0x81
  8. /****************ÑÓʱº¯Êý*********************************/
  9. void delay_us(unsigned char t)
  10. {
  11.     while(--t);
  12. }

  13. void delay_ms(unsigned char t)
  14. {
  15.     while(t--)
  16.                 {
  17.         delay_us(245);
  18.                           delay_us(245);
  19.     }
  20. }
  21. /*******************DS1302********************/
  22. //              Ãë ·Ö Ê±  ÈÕ Ô ÐÇÆÚ Äê
  23. uchar TIME[7] = {00,00,00,06,01,07,19};

  24. sbit SCLK = P1^0;
  25. sbit IO   = P1^1;
  26. sbit RST  = P1^2;

  27. //д×Ö½Ú
  28. void DS1302write_byte(uchar byte)
  29. {
  30.     uchar i;
  31.           for(i = 0; i < 8; i++)
  32.          {
  33.             SCLK = 0;          //À­µÍʱÖÓÏß
  34.                   IO = byte & 0x01;
  35.       byte >>= 1;     
  36.       SCLK = 1;                     //À­¸ßʱÖÓÏß ²úÉúÉÏÉýÑØ дÈëÊý¾Ý
  37.          }
  38. }
  39. //¶Á×Ö½Ú
  40. uchar DS1302read_byte()
  41. {
  42.      uchar i,dat;
  43.      for(i = 0; i < 8; i++)
  44.       {
  45.                           SCLK = 0;
  46.                                 dat >>= 1;
  47.                                 if(IO) dat |= 0x80;
  48.                           SCLK = 1;       
  49.                         }  
  50.      return dat;
  51. }
  52. //дÊý¾Ý
  53. void DS1302write_dat(uchar addr,uchar dat)
  54. {
  55.    
  56.           DS1302write_byte(addr);
  57.           DS1302write_byte(dat);
  58.           
  59. }
  60. //¶ÁÊý¾Ý
  61. uchar DS1302read_dat(uchar addr)
  62. {
  63.          uchar dat;
  64.          DS1302write_byte(addr);
  65.          dat = DS1302read_byte();
  66.    return dat;
  67. }

  68. //Çå³ýд±£»¤
  69. void DS1302clear_wp()
  70. {
  71.         RST = 0;
  72.         SCLK = 0;
  73.         RST = 1;
  74.   DS1302write_dat(0x8e,0x00);
  75.        
  76. }
  77. //ÉèÖÃд±£»¤
  78. void DS1302set_wp()
  79. {
  80.        
  81.   DS1302write_dat(0x8e,0x80);
  82.         SCLK = 0;
  83.         RST = 0;
  84. }
  85. // ÉèÖÃÆðʼʱ¼ä
  86. //Ê®½øÖÆ×ªBCD
  87. void DS1302set_time(uchar addr)
  88. {
  89.   uchar i,j;
  90.          
  91.         DS1302clear_wp();
  92.         for(i = 0; i < 7; i++)
  93.         {
  94.                
  95.           j=TIME[i]/10;
  96.                 TIME[i]=TIME[i]%10;
  97.                 TIME[i]=TIME[i]+j*16;       
  98.           DS1302write_dat(addr,TIME[i]);  
  99.     addr += 2;
  100.         }
  101.         DS1302set_wp();
  102. }
  103. //¶ÁDS1302µÄÊý¾Ý
  104. //¶ÁÈ¡BCDÂë
  105. void DS1302read_time(uchar addr)
  106. {
  107.    uchar i;
  108.          
  109.          DS1302clear_wp();
  110.          for(i = 0; i < 7; i++)
  111.          {
  112.                  
  113.                  TIME[i] = DS1302read_dat(addr);
  114.                  addr += 2;
  115.        
  116.    }
  117.          DS1302set_wp();
  118. }
  119. /*********************LCD1602ÏÔʾ***********************************/
  120. sbit RS = P3^5;
  121. sbit RW = P3^6;
  122. sbit EN = P3^4;

  123. //ÅÐæ
  124. void read_busy()
  125. {
  126.           uchar busy;
  127.     RS = 0;
  128.     RW = 1;
  129.           P0 = 0xff;
  130.    do{
  131.            EN = 1;
  132.                  busy = P0;
  133.      EN = 0;                 
  134.           }while(busy & 0x80);
  135. }
  136. //дÃüÁî
  137. void write_cmd(uchar cmd)
  138. {
  139.           read_busy();
  140.     RS = 0;
  141.           RW = 0;
  142.           P0 = cmd;
  143.           EN = 1;
  144.           EN = 0;
  145. }
  146. //дÊý¾Ý
  147. void write_dat(uchar dat)
  148. {
  149.    read_busy();
  150.          RS = 1;
  151.          RW = 0;
  152.    P0 = dat;
  153.          EN = 1;
  154.          EN = 0;
  155. }
  156. //ÏÔʾһ¸ö×Ö·û
  157. void dis_onechar(uchar x,uchar y,uchar dat)
  158. {
  159.         if(y) x |= 0xc0;
  160.           x |= 0x80;
  161.         write_cmd(x);
  162.   write_dat(dat);
  163. }
  164. //ÏÔʾһ¸ö×Ö·û´®
  165. void dis_str(uchar x,uchar y,uchar *str)
  166. {
  167.    if(y) x |= 0xc0;
  168.            x |= 0x80;
  169.         write_cmd(x);
  170.         while(*str != '\0')
  171.         {
  172.          write_dat(*str++);
  173.         }
  174. }
  175. void LCD1602_init()
  176. {
  177.    write_cmd(0x38);
  178.          write_cmd(0x0c);
  179.          write_cmd(0x06);
  180.          write_cmd(0x01);//ÇåÆÁ
  181. }
  182. //ÏÔʾʱ¼äº¯Êý
  183. void dis_time()
  184. {
  185.    DS1302read_time(0x81);
  186.          dis_onechar(5,1,TIME[2]/16 + '0'); //ʱ
  187.          dis_onechar(6,1,TIME[2]%16 + '0');
  188.          dis_onechar(7,1,':');
  189.                  
  190.          dis_onechar(8,1,TIME[1]/16 + '0'); //·Ö
  191.          dis_onechar(9,1,TIME[1]%16 + '0');
  192.          dis_onechar(10,1,':');
  193.                
  194.          dis_onechar(11,1,TIME[0]/16 + '0');//Ãë
  195.          dis_onechar(12,1,TIME[0]%16 + '0');
  196.                  
  197.          dis_onechar(5,0,TIME[6]/16 + '0'); //Äê
  198.          dis_onechar(6,0,TIME[6]%16 + '0');
  199.          dis_onechar(7,0,'-');
  200.                  
  201.          dis_onechar(8,0,TIME[4]/16 + '0'); //ÔÂ
  202.          dis_onechar(9,0,TIME[4]%16 + '0');
  203.          dis_onechar(10,0,'-');
  204.                  
  205.          dis_onechar(11,0,TIME[3]/16 + '0'); //ÈÕ
  206.          dis_onechar(12,0,TIME[3]%16 + '0');
  207.          dis_onechar(13,0,' ');
  208.          
  209.          dis_onechar(14,0,TIME[5]/16 + '0'); //ÐÇÆÚ
  210.          dis_onechar(15,0,TIME[5]%16 + '0');
  211. }

  212. /***************************¼üÅÌɨÃè***********************************/
  213. //¼üÅÌɨÃ躯Êý

  214. uchar key_scan()
  215. {
  216.          uchar key;
  217.    P3 = 0xff;
  218.          if(P3 == 0xfe)           //µÚÒ»¸ö°´¼ü P30
  219.        delay_ms(5);        
  220.                 if(P3 == 0xfe)
  221.                                         {
  222.                                            key = 1;
  223.                                                  while(P3 == 0xfe);
  224.                                                  delay_ms(5);
  225.                                                  while(P3 == 0xfe);
  226.                                                  return key;
  227.                                         }
  228.          else if(P3 == 0xfd)          //µÚ¶þ¸ö°´¼ü P31
  229.                     delay_ms(5);
  230.                  if(P3 == 0xfd)
  231.                                          {
  232.                                           key = 2;
  233.                                                 while(P3 == 0xfd);
  234.                                                 delay_ms(5);
  235.                                                 while(P3 == 0xfd);
  236.                                                 return key;
  237.                                          }
  238.         else if(P3 == 0xf7)         //µÚËĸö°´Å¥  P33
  239.                      delay_ms(5);
  240.                  if(P3 != 0xf7)
  241.                                          {
  242.                                           key = 4;
  243.                                                 while(P3 == 0xf7);
  244.                                                 delay_ms(5);
  245.                                                 while(P3 == 0xf7);
  246.                                                 return key;
  247.                                          }
  248.                 return 0xff;
  249. }
  250. /***************ÍⲿÖжÏ***********************************/
  251. //³õʼ»¯

  252. void External_init0()
  253. {
  254.    IT0 = 1;   //ÍⲿÒý½ÅϽµÑزúÉúÖжÏ
  255.    EA =  1;
  256.          EX0 = 1;   //ÔÊÐíÍⲿÖжÏ
  257. }
  258. //ÖжϷþÎñ³ÌÐò
  259. void External_INT0() interrupt 0
  260. {
  261.     uchar keyvalue;
  262.           LCD1602_init();
  263.           keyvalue = key_scan();  //ɨÃè¶ÀÁ¢¼üÅ
  264.           if(keyvalue == 1)       //ʱ
  265.                   {
  266.                                 TIME[2] = (TIME[2]/16)*10 + TIME[2]%16;
  267.                           TIME[2]++;
  268.                                 if(TIME[2] == 24) TIME[2] = 0;
  269.                                 TIME[2] = (TIME[2]/10)*16 + TIME[2]%10;
  270.                                
  271.                                 dis_onechar(5,1,TIME[2]/16 + '0'); //ʱ
  272.               dis_onechar(6,1,TIME[2]%16 + '0');
  273.               dis_onechar(7,1,':');
  274.                                 DS1302write_dat(0x84,TIME[2]);
  275.             }

  276.    
  277.          else        if(keyvalue == 2)      //·Ö
  278.                   {
  279.                    TIME[1] = (TIME[1]/16)*10 + TIME[1]%16;
  280.        TIME[1]++;
  281.                          if(TIME[1] == 60) TIME[1] = 0;
  282.        TIME[1] = (TIME[1]/10)*16 + TIME[1]%10;
  283.                                
  284.                         dis_onechar(8,1,TIME[1]/16 + '0'); //·Ö
  285.             dis_onechar(9,1,TIME[1]%16 + '0');
  286.             dis_onechar(10,1,':');
  287.                         DS1302write_dat(0x82,TIME[1]);
  288.             }                       
  289.         else if(keyvalue == 4)     //Ãë
  290.                    {
  291.                     TIME[0] = (TIME[0]/16)*10 + TIME[0]%16;
  292.                                 TIME[0]++;
  293.                                 if(TIME[1] == 60) TIME[1] = 0;
  294.                                 TIME[0] = (TIME[0]/10)*16 + TIME[0]%10;
  295.                                
  296.                                 dis_onechar(11,1,TIME[0]/16 + '0');//Ãë
  297.               dis_onechar(12,1,TIME[0]%16 + '0');
  298.                                 DS1302write_dat(0x80,TIME[0]);
  299.            }
  300. }
  301. /**********************Ö÷º¯Êý****************************************/
  302. void main()
  303. {
  304.         External_init0();
  305.         LCD1602_init();
  306.         dis_str(0,1,table);
  307.         dis_str(0,0,table1);
  308.         DS1302set_time(0x80);
  309.         while(1)
  310.         {
  311.          dis_time();
  312.         }
  313. }
 楼主| 1154775677 发表于 2019-1-14 17:41 | 显示全部楼层

主要在 外部中断哪有问题 其他模块的程序 我都测试过没问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

48

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部