找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1101|回复: 0
收起左侧

这个单片机程序怎么实现长按加1?

[复制链接]
ID:787264 发表于 2020-6-29 01:55 | 显示全部楼层 |阅读模式
  1. #include<reg51.h>
  2. sbit LED=P3^1;
  3. sbit BEEP=P3^2;
  4. sbit PWM=P3^0;
  5. sbit INA=P2^4;
  6. sbit INB=P2^5;
  7. sbit INC=P2^6;
  8. sbit IND=P2^7;  
  9. unsigned char code led_mod[10]={0x3f,0x06,0x5b,0x4f,
  10.           0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  11. unsigned char code led_sel[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  12. unsigned char DisplayCode[8]={0x00,0x00,0x00,0x3f,0x3f,0x40,0x3f,0x3f};
  13. unsigned char code f_rotation[8]={0xfe,0xfd,0xfb,0xf7,0x7f,0xbf,0xdf,0xef};
  14. unsigned char code b_rotation[4]={0X6F,0x3F,0x9F,0xCF }; typedef unsigned int u16; typedef unsigned char u8;
  15.   bit king_flag=0 ;
  16. bit Time_adjust=0;////????????????????????????     
  17. bit timer_1sec_flag=0;//???????????1???????????
  18. bit alarm_flag=0;//?????????????????????????????
  19. bit alarm_fen_flag=0;
  20. bit alarm_h_flag=0;  
  21. bit led_flag=0;//????????????LED??10????
  22. unsigned int motor=32;//?????????????????
  23. bit dir=1;//???岽????????????????????????
  24. bit r_run=0;    bit timer_1min_flag=0;     bit flag=0;      
  25. unsigned char min=0;
  26. unsigned char h=0;               u8 Motor_Step=0;
  27. unsigned char alarm_min=10;//????????
  28. unsigned char alarm_h=0;//?????С?
  29. unsigned char key_value;
  30. unsigned char led_timer_counter;        double count=2;unsigned char ID;unsigned char kind;  
  31. sbit K1=P1^0;//????1
  32. sbit K2=P1^1;
  33. sbit K3=P1^2;
  34. sbit K4=P1^3;
  35. sbit K5=P1^4;
  36. unsigned char  pre_sta[5]={1,1,1,1,1};//??????????????I/O????λ
  37. unsigned char cur_sta[5]={1,1,1,1,1};//??????????????I/O????λ
  38. unsigned char key_buff[5]={0xff,0xff,0xff,0xff,0xff};
  39. void delay(unsigned int z)//??????
  40. {
  41.   unsigned int i,j;
  42. for(i=0;i<z;i++)
  43.   for(j=0;j<125;j++);
  44. }
  45. void led7seg_scan()//??????????
  46. {
  47. unsigned char i;
  48.     for(i=0;i<4;i++)
  49.    {
  50.    P2=led_sel[i];//λ????????????λ????????
  51.    P0=DisplayCode[i];//????????????????????
  52.    delay(1);//delay 1ms
  53.    P0=0x00;//?????????
  54.    }
  55. }
  56. void Motor_Delay1ms(u16 c)   //??? 0us
  57. {
  58. for (; c>0; c--)
  59. {
  60. //   for (b=199;b>0;b--)
  61. //   {
  62. //     
  63. //   }      
  64. }
  65.      
  66. }
  67.      void Motor_Run(bit dir)
  68. {      
  69.          
  70.       if(r_run){
  71.     switch(Motor_Step)
  72.      {
  73.       case 0: INA=1;INB=0;INC=0;IND=0;Motor_Step++;delay(12);break;
  74.          
  75.       case 1: INA=1;INB=0;INC=1;IND=0;Motor_Step++;delay(12);break;
  76.         
  77.       case 2: INA=0;INB=0;INC=1;IND=0;Motor_Step++;delay(12);break;
  78.         
  79.       case 3: INA=0;INB=1;INC=1;IND=0;Motor_Step++;delay(12);break;
  80.         
  81.       case 4: INA=0;INB=1;INC=0;IND=0;Motor_Step++;delay(12);break;
  82.         
  83.       case 5: INA=0;INB=1;INC=0;IND=0;Motor_Step++;delay(12);break;
  84.         
  85.       case 6: INA=0;INB=1;INC=1;IND=0;Motor_Step++;delay(12);break;
  86.          
  87.       case 7: INA=0;INB=0;INC=1;IND=0;Motor_Step++;delay(12);break;
  88.       case 8: INA=1;INB=0;INC=0;IND=0;Motor_Step=0;delay(12);break;
  89.          
  90.      /* case 9: INA=0;INB=1;INC=1;IND=0;if(dir)Motor_Step++;else Motor_Step--;Motor_Delay1ms(20);break;
  91.         
  92.       case 10: INA=0;INB=0;INC=1;IND=0;if(dir)Motor_Step++;else Motor_Step--;Motor_Delay1ms(20);break;
  93.         
  94.       case 11: INA=0;INB=1;INC=1;IND=0;if(dir)Motor_Step++;else Motor_Step--;Motor_Delay1ms(20);break;
  95.         
  96.       case 12: INA=0;INB=1;INC=0;IND=0;if(dir)Motor_Step++;else Motor_Step--;Motor_Delay1ms(20);break;
  97.         
  98.       case 13: INA=0;INB=1;INC=0;IND=1;if(dir)Motor_Step++;else Motor_Step--;Motor_Delay1ms(20);break;
  99.         
  100.       case 14: INA=0;INB=0;INC=0;IND=1;if(dir)Motor_Step=0;else Motor_Step--;Motor_Delay1ms(20);break;   */
  101.          
  102.         
  103.       
  104.      }
  105.   } else INA=0;INB=0;INC=0;IND=0;  
  106.      delay(2);
  107. }  
  108. void   timer0_init()
  109. {                                             
  110.   TR0=1;//???????0
  111. TMOD=0x11;//????????0??1????????????????????????1
  112. EA=1;//???ж????ж?
  113. ET0=1;//???????0???ж?
  114. ET1=1;//???????1???ж?
  115. TR1=0;//???????1
  116.     TH0=(65536-4000)/256;//?????0????????   
  117. TL0=(65536-4000)%256;
  118.   TH1=(65536-4000)/256; //?????1????????  
  119. TL1=(65536-4000)%256;
  120. }           
  121. void key_action(unsigned char key_value)//???????????
  122. {        
  123. if(key_value==1)
  124. delay(100);//?????????????
  125. {      
  126. if(key_value==1) {
  127.   LED=~LED;  king_flag=~king_flag;
  128.   TR1=~TR1; delay(100);
  129.   }
  130.             else if(key_value==2)//?????????????
  131. {        if(king_flag)
  132.     {  if(K2==0)  {   delay(2); //????????????????????ж???????
  133.   if(K2==0)  {   count+=1; //?????μ???????????0.5
  134.      if(count>=8)     //???????????
  135.    {  count=2; }  } while(!K1);  }  } }
  136.   
  137. else if(key_value==3 )//??3??????
  138. {    if(king_flag) ID++;if(ID==3){
  139. ID=0;
  140.   }  }
  141. //Motor_Run(dir);               }   
  142.      
  143.    
  144.   
  145.   else if(key_value==4)//????4????
  146. { if(king_flag){   kind++;if(kind==4){
  147. kind=0; }    }
  148.   
  149. /* else if(key_value==5)
  150.       delay(100);  
  151.   { if(key_value==5)if(king_flag) {

  152.     if(alarm_fen_flag)//???????????????£??????????????
  153.   {  
  154.    alarm_min++;
  155.     if(alarm_min==60) alarm_min=0;
  156.    DisplayCode[3]=led_mod[alarm_min%10];
  157.    DisplayCode[2]=led_mod[alarm_min/10];
  158.     }
  159.   
  160.   }      

  161.   else  if(alarm_h_flag)//???????????????£??????????????
  162.   {
  163.    alarm_h++;
  164.     if(alarm_h==24) alarm_h=0;
  165.    DisplayCode[1]=led_mod[alarm_h%10];
  166.    DisplayCode[0]=led_mod[alarm_h/10];
  167.     }
  168.   
  169.   }      }   */
  170.    
  171.    
  172.      
  173.   }  }
  174. } unsigned char key_scan(void)//???????
  175. {
  176. unsigned char i;
  177. unsigned char key_value=0;
  178. for(i=0;i<5;i++)
  179. {
  180. if(cur_sta[i]!=pre_sta[i])//??????????????????
  181.   {
  182.    if(pre_sta[i]==1)//???????????,????????
  183.    {
  184.      key_value=i+1;
  185.        }
  186.     pre_sta[i]=cur_sta[i];//??????????????
  187.     }
  188. }
  189.   return (key_value);//?????????????????????????????????
  190. }
  191. void cur_sta_update()//???????????
  192. {
  193. unsigned char i;
  194.   key_buff[0]=(key_buff[0]<<1)|K1;//??????????K1?????key_buff[0]?е?????λ
  195. key_buff[1]=(key_buff[1]<<1)|K2;//??????????K2?????key_buff[1]?е?????λ
  196. key_buff[2]=(key_buff[2]<<1)|K3;//??????????K3?????key_buff[2]?е?????λ
  197. key_buff[3]=(key_buff[3]<<1)|K4;//??????????K4?????key_buff[3]?е?????λ
  198. key_buff[4]=(key_buff[4]<<1)|K5;//??????????K4?????key_buff[3]?е?????λ
  199. for(i=0;i<5;i++)
  200. {
  201.   if((key_buff[i]&0x0f)==0x00)//???????4?γ???????
  202.   {
  203.    cur_sta[i]=0;//????μ????0
  204.   }
  205.   else if((key_buff[i]&0x0f)==0x0f)//???????4?γ???????
  206.   {
  207.   cur_sta[i]=1;//????μ????1
  208.   }
  209. }
  210. }
  211. void DisplayCode_update_time()//??????????????
  212. {
  213. if(Time_adjust==0)//?????δ???????????£??????1????У????????????С?????
  214. {
  215.    if(timer_1sec_flag)//1 sec ?????
  216.   {
  217.    timer_1sec_flag=0;
  218.      
  219.    
  220.     min++;
  221.       if(min==60)
  222.      {
  223.       min=0;
  224.       h++;
  225.         if(h==24)
  226.         h=0;
  227.           }
  228.       }   
  229.    
  230.    if(alarm_flag==0)//????δ???????????????????????????
  231.    {DisplayCode[3]=led_mod[min%10];
  232.    DisplayCode[2]=led_mod[min/10];         
  233.    DisplayCode[1]=led_mod[h%10];
  234.    DisplayCode[0]=led_mod[h/10];
  235.    } delay(1);
  236. }  
  237. } void DisplayCode_update_time25()//??????????????
  238. {
  239. if(flag)//?????δ???????????£??????1????У????????????С?????
  240. {
  241.    if(timer_1min_flag)//1 sec ?????
  242.   {
  243.    timer_1min_flag=0;
  244.    
  245.    
  246.     alarm_min--;
  247.       if(alarm_min==0)
  248.      {    alarm_min=10;
  249.     kind=0;  ID=0;LED=~LED;PWM=0;TR1=~TR1;
  250.           }
  251.       }   
  252.     }}
  253. void main()
  254. {     unsigned char i,j;
  255.     unsigned char k=0;
  256. unsigned char key_value;LED=0;r_run=0;dir=0;
  257. timer0_init(); IT0=1;
  258.   while(1)
  259. {      
  260.   led7seg_scan();
  261.   key_value=key_scan();
  262.   key_action(key_value);
  263.   DisplayCode_update_time();
  264.   DisplayCode_update_time25();
  265.       if(key_value!=0)  
  266.   {    delay(2);
  267.   while(key_value==0);
  268.   if(key_value!=0)
  269.   {
  270.   for(i=10;i>0;i--){
  271.   for(j=5;j>0;j--){
  272.   BEEP=0;
  273.   delay(1);
  274.   BEEP=1;
  275.   delay(1);
  276.   }
  277.   }
  278.   BEEP=1;
  279.   }
  280.   }      
  281.       
  282.       
  283.    
  284.   
  285.    switch(ID)
  286.         {
  287.          case 0: r_run=0; break;    //??/??
  288.          case 1: r_run=1; break;    //???
  289.         
  290.         }
  291.         if(r_run) Motor_Run(dir);
  292.    switch(kind)
  293.         {
  294.          case 0: alarm_flag=0; break;    //??/??
  295.          case 1: alarm_flag=1;alarm_fen_flag=1; break;    //???
  296.          case 2:  alarm_flag=1;alarm_h_flag=1;alarm_fen_flag=0;DisplayCode[3]=led_mod[alarm_min%10];
  297.     DisplayCode[2]=led_mod[alarm_min/10];      break;  //???
  298.          case 3: alarm_flag=1;alarm_h_flag=0;alarm_fen_flag=0;flag=1;DisplayCode[1]=led_mod[alarm_h%10];
  299.     DisplayCode[0]=led_mod[alarm_h/10];  DisplayCode[3]=led_mod[alarm_min%10];
  300.     DisplayCode[2]=led_mod[alarm_min/10];     break;
  301.         }  
  302.       
  303.       
  304.       
  305.   if(key_value==5)
  306.       delay(100);if(key_value==5){if(king_flag) {
  307.       
  308.     if(alarm_fen_flag)//???????????????£??????????????
  309.   {  
  310.    alarm_min++;
  311.     if(alarm_min==60) alarm_min=0;
  312.    DisplayCode[3]=led_mod[alarm_min%10];
  313.    DisplayCode[2]=led_mod[alarm_min/10];while(key_value!=5);}
  314.    else  if(alarm_h_flag)//???????????????£??????????????
  315.   {
  316.    alarm_h++;
  317.     if(alarm_h==24) alarm_h=0;
  318.    DisplayCode[1]=led_mod[alarm_h%10];
  319.    DisplayCode[0]=led_mod[alarm_h/10];}}delay(100); while(key_value!=5);} }
  320. }                                       
  321. void timer0_4ms() interrupt 1
  322. {   
  323. static unsigned char timer_count=0; static unsigned char count=0;static unsigned char count_timer=0;static unsigned char timer_count12=0;
  324.          key_value=key_scan();
  325.       
  326.   TH0=(65536-4000)/256;
  327. TL0=(65536-4000)%256;
  328.                                  
  329.     timer_count++;
  330. if(timer_count==250)//1 sec
  331. {
  332.       
  333.     timer_count=0;   
  334.   timer_1sec_flag=1;
  335.   }  
  336.     if(alarm_flag)
  337. {        
  338. if(alarm_fen_flag){if(count_timer==100)  DisplayCode[3]=led_mod[alarm_min%10];  
  339.   if(count_timer==100)  DisplayCode[2]=led_mod[alarm_min/10];  
  340.     count_timer++;
  341.     if(count_timer==170){  count_timer=0;
  342.    DisplayCode[3]=0x00;  
  343.     DisplayCode[2]=0x00;   
  344.    
  345.     }         

  346.   }}if(alarm_h_flag)//???????????????£??????????????
  347.    
  348.   {if(count==100)  DisplayCode[1]=led_mod[alarm_h%10];  
  349.   if(count==100)  DisplayCode[0]=led_mod[alarm_h/10];  
  350.     count++;
  351.     if(count==170){  count=0;
  352.    DisplayCode[1]=0x00;  
  353.     DisplayCode[0]=0x00;   
  354.     }         

  355.   }  if(flag)
  356.   {
  357.   timer_count12++;
  358.   if(timer_count12==250)
  359.   {
  360.   timer_count=0;
  361.   timer_1min_flag=1;
  362.   }
  363. }   
  364.   cur_sta_update();  {
  365. }   
  366. }void timer1_1ms() interrupt 3
  367. {     
  368.   static unsigned char led_timer_counter=0;   
  369.      TR1=0;
  370.      TH1=(65536-4000)/256;
  371. TL1=(65536-4000)%256;
  372.           TR1=1;
  373.       led_timer_counter++;
  374.      //????
  375.       
  376. {      
  377.   if(led_timer_counter<count)   //count?????
  378.   {
  379. PWM=1;    //???????
  380.    
  381.   }
  382.   else
  383. PWM=0;
  384.    
  385.   if(led_timer_counter>8)
  386.   {
  387. led_timer_counter=0;
  388.       
  389.   }
  390.    
  391. }      
  392.            }
复制代码



回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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