51单片机非常简洁的矩阵扫描程序
程序员文章站
2022-03-08 13:25:21
```c /*按键的键位定义*/ unsigned char code anj[4][4] = { 1,2,3,10, 4,5,6,11, 7,0,9,12, 13,8,14,15, }; char ScanKey() { char key = -1;//赋值用于判读没有按下... ......
/*按键的键位定义*/ unsigned char code anj[4][4] = { 1, 2, 3, 10, 4, 5, 6, 11, 7, 0, 9, 12, 13, 8, 14, 15, }; char scankey() { char key = -1;//赋值用于判读没有按下 unsigned i,j; for (i = 0;i < 4;i++) { p1 = _cror_(0x7f,i); for (j = 0;j < 4;j++) { if ((p1 & _cror_(0x08,j)) == 0) { key = anj[i][j]; while ((p1 & _cror_(0x08,j)) == 0);//松手检测 break; } } } return key; }
原理: 比如高位是行低位是列 先给p1复制 0111 1111 然后&上 0000 1000 如果第一列有按下那么 0111 1111 & 0000 0000 (有按键按下 0000 1000 变为 0000 0000) = 0000 0000 自然就得到 (1,1)这个位置的按键按下了 加上右移(_cror_())后面的都以此类推就可以检测所有的按键了。