欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

51单片机非常简洁的矩阵扫描程序

程序员文章站 2022-07-01 15:50:29
```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_())后面的都以此类推就可以检测所有的按键了。