晚上帮同学写了段代码 用单片机P1口扩展成4*4的键盘 按下按键点亮P0口的LED 矩阵键盘的扩展不算复杂 主要是检测代码部分比较复杂 IO扩展原理 矩阵键盘又称行列键盘,它是用四条I/O线作为行线,四条I/O线作为列线组成的键盘。 在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为4*4个。 这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。 检测原理 当无按键闭合时,行线与列线之间开路。当有键闭合时,与闭合键相连的两条I/O口线之间短路。 判断有无按键按下的方法:
代码如下: #include <reg51.h> #define uchar unsigned char #define LED_ON(X) P0 = ~(1<<(X)) //LED低电平点亮 uchar KeyScan(void); void main(void) { uchar key; while(1){ key = KeyScan(); if(key > 0) { key = key -1; LED_ON(key); } } } uchar KeyScan(void) { uchar i,val,row,col,key; P1 = 0xF0; //行线置0,列线置1 if( P1 != 0x0F0 ) //按键按下 { for(i=0;i<4;i++) //行扫描 { val = 0xFF&(~(1<<i)); //每行轮流置1 P1 = val; if(P1 != val) { row = i; //确定行数 break; //终止循环 } } for(i=0;i<4;i++) //列扫描 { val = 0xFF&(~(0x10<<i)); P1 = val; if(P1 != val) { col = i+1; //确定列数 break; //终止循环 } } key = row*4+col; return key; }else{ return 0; } } |
|