//6keyfor2io.c // //昨日网友啊龙发布了一个《两条I/O,接六个按键的电路(无附加集成块)》 //思路非常巧妙,仅用2个IO就可区分出无键和6个单独按键共7种状态, //不过论坛上好像有许多人没搞清怎么去区分出这些状态, //故针对该电路写了个配套的按键检测程序,希望大家喜欢! //如有疑问也可发送邮件至:xwjfile@21cn.com讨论 //xwj2006/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); } }