[技术问答] 按键显示数字,按下到弹起期间数码管变暗是什么原因

[复制链接]
1119|2
 楼主| IversonCar 发表于 2015-11-8 20:25 | 显示全部楼层 |阅读模式
  1. #include<reg51.h>
  2. #define GPIO_DIG P0
  3.                                  
  4. sbit LSA=P2^2;
  5. sbit LSB=P2^3;
  6. sbit LSC=P2^4;
  7. sbit P26=P2^6;
  8. sbit P27=P2^7;
  9. sbit KEY1=P3^0;
  10. sbit KEY2=P3^1;
  11. sbit KEY3=P3^2;
  12. sbit KEY4=P3^3;
  13. unsigned char code DIG_CODE[17]={
  14. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  15. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  16. //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
  17. //unsigned char DisplayData[8];
  18. //用来存放要显示的8位数的值
  19. void DigDisplay(); //动态显示函数
  20. void Delay10ms( );   //延时10ms
  21. void delayms(unsigned char xms);
  22. unsigned char keyscanf();           //unsigned char keyscanf();
  23.         unsigned char time[4]={2,0,1,6};
  24. /*******************************************************************************
  25. * 函 数 名         : main
  26. * 函数功能                   : 主函数
  27. * 输    入         : 无
  28. * 输    出         : 无
  29. *******************************************************************************/
  30. void main(void)
  31. {        static unsigned char st=0;
  32. //        unsigned char key;
  33.         unsigned int i;                          
  34.         P26=1;
  35.         P27=1;
  36.       
  37.         while(1)
  38.         {      
  39.             DigDisplay();
  40.                 if(KEY2==0)                //检测按键K1是否按下
  41.                 {
  42.                         Delay10ms();        //消除抖动
  43.                         if(KEY2==0)
  44.                         {      
  45.                                 for(;KEY2==0;)
  46.                     P26=0;
  47.                         if(time[st]<9)//if(time[0]<9&time[1]<9&time[2]<9&time[3]<9)
  48.                         time[st]++;
  49.                         else time[st]=0;
  50.                                 while((i<50)&&(        KEY1=1))         //检测按键是否松开
  51.                                 {
  52.                                         Delay10ms();
  53.                                         i++;
  54.                                 }
  55.                                 i=0;
  56.                         }
  57.                 }      
  58.                 // key2
  59.                         if(KEY1==0)                //检测按键K1是否按下
  60.                 {
  61.                         Delay10ms();        //消除抖动
  62.                         if(KEY1==0)
  63.                         {
  64.                                 for(;KEY1==0;)
  65.                     P26=0;
  66.                         if(time[st]!=0)
  67.                         time[st]--;
  68.                         else time[st]=9;
  69.                                 while((i<50)&&(        KEY1=1))         //检测按键是否松开
  70.                                 {
  71.                                         Delay10ms();
  72.                                         i++;
  73.                                 }
  74.                                 i=0;
  75.                         }
  76.                 }      
  77.                 // key3
  78.                         if(KEY3==0)                //检测按键K1是否按下
  79.                 {
  80.                         Delay10ms();        //消除抖动
  81.                         if(KEY3==0)
  82.                         {
  83.                                 for(;KEY3==0;)
  84.                     P26=0;
  85.                         if(st>=0&&st<=2)
  86.                         st++;
  87.                         else st=0;
  88.                                 while((i<50)&&(        KEY1=1))         //检测按键是否松开
  89.                                 {
  90.                                         Delay10ms();
  91.                                         i++;
  92.                                 }
  93.                                 i=0;
  94.                         }
  95.                 }      
  96.                 // key4
  97.                         if(KEY4==0)                //检测按键K1是否按下
  98.                 {
  99.                         Delay10ms();        //消除抖动
  100.                         if(KEY4==0)
  101.                         {
  102.                                 for(;KEY4==0;)
  103.                     P26=0;
  104.                         if(st!=0)
  105.                         st--;
  106.                         else st=3;
  107.                                 while((i<50)&&(        KEY1=1))         //检测按键是否松开
  108.                                 {
  109.                                         Delay10ms();
  110.                                         i++;
  111.                                 }
  112.                                 i=0;
  113.                         }
  114.                 }      
  115.         }
  116.       
  117.         }                              
  118. /*******************************************************************************
  119. * 函 数 名         : DigDisplay
  120. * 函数功能                   : 使用数码管显示
  121. * 输    入         : 无
  122. * 输    出         : 无
  123. *******************************************************************************/
  124. void DigDisplay()
  125. {
  126.         unsigned char i;
  127.         unsigned int j;
  128.         for(i=0;i<4;i++)
  129.         {
  130.                 switch(i)         //位选,选择点亮的数码管,
  131.                 {
  132.                         case(0):
  133.                                 LSA=1;LSB=1;LSC=0; break;//显示第0位
  134.                         case(1):
  135.                                 LSA=0;LSB=1;LSC=0; break;//显示第1位
  136.                         case(2):
  137.                                 LSA=1;LSB=0;LSC=0; break;//显示第2位
  138.                         case(3):
  139.                                 LSA=0;LSB=0;LSC=0; break;//显示第3位      
  140.                 }
  141.                 GPIO_DIG=DIG_CODE[time];//发送段码
  142.                 j=10;                                                 //扫描间隔时间设定
  143.                 while(j--);      
  144.         GPIO_DIG=0x00;//消隐
  145.         }
  146. }
  147. /*******************************************************************************
  148. * 函 数 名         : keyscanf
  149. * 函数功能                   : 扫描按键
  150. * 输    入         : 无
  151. * 输    出         : 无
  152. *******************************************************************************/
  153. unsigned char keyscanf()           ///        unsigned char keyscanf()
  154.         {
  155.         if(KEY1&KEY2&KEY3&KEY4)
  156.                 {
  157.                 delayms(10);
  158.                 if(KEY1&KEY2&KEY3&KEY4)
  159.                 {
  160.                
  161.                                 if(!KEY1)
  162.                                 {        P26=0;
  163.                                         return(1);}
  164.                                 else if(!KEY2)
  165.                                 {        P27=0;
  166.                                         return(2);}
  167.                                 else if(!KEY3)
  168.                                 {        while(!KEY3)
  169.                                         return(3);}
  170.                                 else if(!KEY4)
  171.                                 {        while(!KEY4)
  172.                                         return(4);}
  173.                               
  174.                 }
  175.                 }
  176.                 return (0);
  177.         }
  178. /*******************************************************************************
  179. * 函 数 名         : delayms
  180. * 函数功能                   : 延迟
  181. * 输    入         : 无
  182. * 输    出         : 无
  183. *******************************************************************************/
  184. void delayms(unsigned int xms)
  185.         {
  186.         unsigned int i,j;
  187.         for(i=xms;i>0;i--)
  188.                 for(j=110;j>0;j--);
  189.         }
  190.   void Delay10ms(void)   //误差 0us
  191. {
  192.     unsigned char a,b,c;
  193.     for(c=1;c>0;c--)
  194.         for(b=38;b>0;b--)
  195.             for(a=130;a>0;a--);
  196. }


玛尼玛尼哄 发表于 2015-11-11 23:12 | 显示全部楼层
P0好像需要提供外部的上拉电阻,要不然你就拉低了系统电流了。
zhuotuzi 发表于 2015-11-12 14:45 | 显示全部楼层
驱动LED上采用三极管驱动,就不会受MCU电流变化的影响,实际上那个端口8个PIN,电流和是一定的,有上限,设计时候要考虑。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

344

帖子

0

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