蓝桥杯单片机速成3-定时器扫描按键

目录

一、原理图

二、独立按键

三、矩阵按键 

四、按键的使用


一、原理图

学过51的都知道,矩阵按键的实现需要进行行或列扫描 ,我们这里以扫描行为例进行矩阵键盘的实现

按键按下的判断:IO口的电平为低电平,即为按下

二、独立按键

开始之前,要先把跳冒接上BIN独立模式         即接上3和2

u8 key4_scan()
{
	u8 sign = 0x08;//类似于标志位一样,用来判断哪一行的按键按下
	u8 i =0;
	u8 temp = 0;//用来存储IO口的值
	
	P3 = P3|0x0f;//先把P3口的低四位全部置1,用于读取哪个按键按下了,而高四位不变
	temp = P3&0xff;//把P3的低四位取出来,而高四位不变
	for(i=0;i<4;i++)
	{
		if(~temp == (sign >> i))//sign为0000 1000 逐渐右移一位,直到与取反后的temp一致后就输出                    
                                //此时的按键值
			return i+4;//按键是从s4开始的
	}
	return 0;
}

假如是s4按下了,则temp取反后是->0000 1000 当i=0时,二者相等,然后返回值为0+4=4  

三、矩阵按键 

 开始之前,要先把跳冒接上即接上1和2

u8 key16_scan()
{
	u16 sign = 0x8000;
	u8 i = 0;
	u16 temp = 0;
	
	P44 = 0;P42 = 1;P35 = 1;P34 = 1;//第一列
	temp = temp | (P3&0x0f);//取出P3口的低四位赋给temp
	P44 = 1;P42 = 0;P35 = 1;P34 = 1;//第二列
	temp = (temp<<4) | (P3&0x0f);//避免第一行的扫描的值被覆盖,我们就先把temp左移4位,在取出这次 
                                 //的P3口的低四位赋给temp                                                       
	P44 = 1;P42 = 1;P35 = 0;P34 = 1;//第三列
	temp = (temp<<4) | (P3&0x0f);//以此类推
	P44 = 1;P42 = 1;P35 = 1;P34 = 0;//第四列
	temp = (temp<<4) | (P3&0x0f);//以此类推                                           

	
	for(i=0;i<16;i++)
	{
		if(~temp == (sign>>i))
			return i+4;
	}
	return 0;
}

例如s19按下,则第一列经过行扫描后的temp=1111

第二列经过行扫描后的temp=1111 1111

第三列经过行扫描后的temp=1111 1111 1111 

第四列经过行扫描后的temp=1111 1111 1111 1110

取反后为0000 0000 0000 0001 当i=15时,二者相等,返回值为19

四、按键的使用

void key_proc()
{
	static u8 old;
	u8 temp,up,down;
	
	if(key_f == 0)return;
	key_f = 0;
	
	temp = key16_scan();
	up = ~temp & (temp ^ old);//上升沿
	down = temp & (temp ^ old);//下降沿
	old = temp;
    /*
    在这里进行具体使用的编写即可
    */
}

void TIME_ISR()  interrupt 1
{
	cnt++;
	if(cnt % 20 ==0)key_f = 1;
	cnt %= 1000;
}

void main()
{
	ALL_INIT();
	Timer0Init();
	while(1)
	{
	    key_proc();
	}
}

上面的代码通过巧妙的方式来取代了传统的按键键值判断的方式,很简单,可以直接使用 

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值