原理图:
- //6keyfor2io.c
- //
- //昨日网友啊龙发布了一个《两条I/O,接六个按键的电路(无附加集成块)》
- //思路非常巧妙,仅用2个IO就可区分出无键和6个单独按键共7种状态,
- //不过论坛上好像有许多人没搞清怎么去区分出这些状态,
- //故针对该电路写了个配套的按键检测程序,希望大家喜欢!
- //如有疑问也可发送邮件至:xwjfile@21cn.com讨论
- // xwj 2006/06/16
- #include <REG52.H>
- #define uchar unsigned char
- sbit IO1=P1^6;
- sbit IO2=P1^7;
- uchar keybuf,keydat;
- bit bkeyok;
- void delay_us(unsigned int n)
- {
- while(--n);
- }
- void delay_ms(unsigned int n)
- {
- do
- {
- delay_us(1000);
- }
- while(--n);
- }
- bit scan_key(void)
- {
- uchar tempkey;
- IO1=1;IO2=1;
- if(!IO1)
- {
- if (!IO2)
- tempkey=3;
- else
- tempkey=2;
- }
- else
- {
- if (!IO2)
- tempkey=1;
- else
- {
- IO1=0;
- if (!IO2)
- {
- IO1=1;IO2=0;
- if (!IO1)
- tempkey=4;
- else
- tempkey=6;
- }
- else
- {
- IO1=1;IO2=0;
- if (!IO1)
- tempkey=5;
- else
- tempkey=0;
- }
- }
- }
- IO1=1;IO2=1;
- if((keybuf !=0) && (keybuf == tempkey))
- {
- bkeyok=1;
- keydat=tempkey;
- }
- keybuf=tempkey;
- return(bkeyok);
- }
- uchar read_key(void)
- {
- bkeyok=0;
- return(keydat);
- }
- void doanything(uchar key)
- {
- //----------按键处理只有有按键并正确消抖时才会进入,功能自己随便写
- ;
- }
- void main(void)
- {
- while(1)
- {
- if(scan_key())
- doanything(read_key());
- delay_ms(10);
- }
- }