51_矩阵键盘

1.LCD调试

        需要在文件中包含这两个文件,提供测试的函数

2.矩阵键盘原理

        矩阵键盘扫描(输入扫描)
        原理:读取第1行(列)一读取第2行(列)一读取第3行(列......然后快速循环这个过程,最终实现所有按键同时检测的效果

3.扫描代码

我们给P1_3赋0,其他赋1检查第一列,代码:

P1=0xFF;  //全部赋1

P1_3 = 0; //P1_3对应的列,也就是第一列
//下面是逐个检查第一列上的每个元素是否被按下,被按下就记录对应的keyNumber
if(P1_7 == 0){Delay1ms(20);while(P1_7 == 0);Delay1ms(20);keyNumber = 1;}
if(P1_6 == 0){Delay1ms(20);while(P1_6 == 0);Delay1ms(20);keyNumber = 5;}
if(P1_5 == 0){Delay1ms(20);while(P1_5 == 0);Delay1ms(20);keyNumber = 9;}
if(P1_4 == 0){Delay1ms(20);while(P1_4 == 0);Delay1ms(20);keyNumber = 13;}	
//以上检查完第一列的按键

        剩下三列也是一样的操作,最重要的:一列扫描完毕准备扫描下一列的时候将P1重新赋值为0xFF

P1=0xFF;
	P1_2 = 0; 
	if(P1_7 == 0){Delay1ms(20);while(P1_7 == 0);Delay1ms(20);keyNumber = 2;}
	if(P1_6 == 0){Delay1ms(20);while(P1_6 == 0);Delay1ms(20);keyNumber = 6;}
	if(P1_5 == 0){Delay1ms(20);while(P1_5 == 0);Delay1ms(20);keyNumber = 10;}
	if(P1_4 == 0){Delay1ms(20);while(P1_4 == 0);Delay1ms(20);keyNumber = 14;}	
	
	P1=0xFF;
	P1_1 = 0;
	if(P1_7 == 0){Delay1ms(20);while(P1_7 == 0);Delay1ms(20);keyNumber = 3;}
	if(P1_6 == 0){Delay1ms(20);while(P1_6 == 0);Delay1ms(20);keyNumber = 7;}
	if(P1_5 == 0){Delay1ms(20);while(P1_5 == 0);Delay1ms(20);keyNumber = 11;}
	if(P1_4 == 0){Delay1ms(20);while(P1_4 == 0);Delay1ms(20);keyNumber = 15;}	
	
	P1=0xFF;
	P1_0 = 0;
	if(P1_7 == 0){Delay1ms(20);while(P1_7 == 0);Delay1ms(20);keyNumber = 4;}
	if(P1_6 == 0){Delay1ms(20);while(P1_6 == 0);Delay1ms(20);keyNumber = 8;}
	if(P1_5 == 0){Delay1ms(20);while(P1_5 == 0);Delay1ms(20);keyNumber = 12;}
	if(P1_4 == 0){Delay1ms(20);while(P1_4 == 0);Delay1ms(20);keyNumber = 16;}	

        然后将keyNumber返回,再在主函数中通过LCD_ShowNum()打印即可实现按下对应的键LCD显示相应的数字的效果。

4.矩阵键盘密码锁

unsigned char key=0;
unsigned int Password=0,count=0;
void main()
{
	LCD_init();
	LCD_ShowNum(2,1,Password,4);
	LCD_ShowString(1,1,"Password:");
	while(1)
	{
		key = MatrixKey();
		if(key)
		{
			LCD_ShowString(1,14,"   "); //当重新输入密码的时候清除OK和ERR
			if(key<=10)
			{
				//四位密码,count用来计数
				if(count < 4)
				{
					key%=10;//将10转换为0
					Password*=10;
					Password+=key;
					count++;
				}
			}
			//确认按钮
			if(key == 11)
			{
				if(Password == 5555 && count == 4)
				{
					LCD_ShowString(1,14,"OK ");
					Password=0,count=0;
				}
				else
				{
					LCD_ShowString(1,14,"ERR");
					Password=0,count=0;
				}
			}
			if(key == 12) //back
			{
				if(count >0)
				{
					Password /= 10;
					count --;
				}
			}
			LCD_ShowNum(2,1,Password,4);
			key=0;
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值