网站导航: 首页 > 设计参考 > 正文 文章搜索
两个I/O口实现六个按键的电路(无附加集成块)及配套C程序
 
文章编号:
090106162724
文章分类: 单片机 51系列
点 击:
...
关 键 词: 按键,键盘
文章来源:
网络,作者:xwj
摘 要:
思路非常巧妙,仅用2个IO就可区分出无键和6个单独按键共7种状态...

 原理图:


程序:

 
  1. //6keyfor2io.c   
  2. //   
  3. //昨日网友啊龙发布了一个《两条I/O,接六个按键的电路(无附加集成块)》   
  4. //思路非常巧妙,仅用2个IO就可区分出无键和6个单独按键共7种状态,   
  5. //不过论坛上好像有许多人没搞清怎么去区分出这些状态,   
  6. //故针对该电路写了个配套的按键检测程序,希望大家喜欢!   
  7. //如有疑问也可发送邮件至:xwjfile@21cn.com讨论   
  8. //                                  xwj    2006/06/16   
  9. #include <REG52.H>   
  10. #define uchar unsigned char   
  11.   
  12. sbit IO1=P1^6;   
  13. sbit IO2=P1^7;   
  14. uchar keybuf,keydat;   
  15. bit bkeyok;   
  16.   
  17. void delay_us(unsigned int n)   
  18. {   
  19.     while(--n);   
  20. }   
  21.   
  22. void delay_ms(unsigned int n)   
  23. {   
  24.     do  
  25.     {   
  26.         delay_us(1000);   
  27.     }   
  28.     while(--n);   
  29. }   
  30.   
  31. bit scan_key(void)   
  32. {   
  33.     uchar tempkey;   
  34.     IO1=1;IO2=1;   
  35.     if(!IO1)   
  36.     {   
  37.         if (!IO2)   
  38.             tempkey=3;   
  39.         else  
  40.             tempkey=2;   
  41.     }   
  42.     else  
  43.     {   
  44.         if (!IO2)   
  45.             tempkey=1;   
  46.         else  
  47.         {   
  48.             IO1=0;   
  49.             if (!IO2)   
  50.             {   
  51.                 IO1=1;IO2=0;   
  52.                 if (!IO1)   
  53.                     tempkey=4;   
  54.                 else  
  55.                     tempkey=6;   
  56.             }   
  57.             else  
  58.             {   
  59.                 IO1=1;IO2=0;   
  60.                 if (!IO1)   
  61.                     tempkey=5;   
  62.                 else  
  63.                     tempkey=0;   
  64.             }   
  65.                
  66.         }   
  67.     }   
  68.     IO1=1;IO2=1;   
  69.     if((keybuf !=0) && (keybuf == tempkey))   
  70.     {   
  71.         bkeyok=1;   
  72.         keydat=tempkey;   
  73.     }   
  74.     keybuf=tempkey;   
  75.     return(bkeyok);   
  76. }   
  77.   
  78. uchar read_key(void)   
  79. {   
  80.     bkeyok=0;   
  81.     return(keydat);   
  82. }   
  83.   
  84. void doanything(uchar key)   
  85. {   
  86.     //----------按键处理只有有按键并正确消抖时才会进入,功能自己随便写   
  87.     ;               
  88. }   
  89.   
  90. void main(void)   
  91. {   
  92.     while(1)   
  93.     {   
  94.         if(scan_key())   
  95.             doanything(read_key());   
  96.         delay_ms(10);   
  97.     }   
  98. }   
  99.   

 

 
相关文章:

 
最新开源项目
 
 
  查看更多...  
 
本站相关产品   淘宝网店
 




 
  查看更多...  

 

本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4