实验九 行列反转键盘

矩阵键盘行列反转法

基本原理:

        通过对行、列端口输出两次相反的值,并分别读入行值和列值,再将读入的行值和列值进行求和或按位“或”运算,得到每个按键的扫描码。所谓的“反转扫描法”实际上是利用处理器的高速扫描与低速的按键操作所形成的“时间差”,从按键按下开始到获取整个行值、列值时,按键实际上还没有松开。P1^0/P1^1/P1^2/P1^3 为行,P1^4/P1^5/P1^5/P1^6为列的键值如下。

图一 键值表

#include "reg51.h"
char led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,
            0xF8,0x80,0x90,0x08,0x03,0x46,0x21,0x06,0x0e};//数码管显示字符码

char keytp[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,
            0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};//按键键值表
#define key P1
						
unsigned char key_scan();	//按键扫描子函数
void delay();	//延时函数
/**************************************
*
***************************************/						
void main()
{
	  P0=0xff;
		while(1)
		{
			P0=key_scan();	
		}			
	}
/**************************************
*
***************************************/
unsigned char key_scan()
{
	char keyh,keyl,keytp,temp;
	key=0X0F; //第一次行列输出的值 0000 1111
	if(key!=0x0f)
	{
		delay();//软件去抖动
		if(key!=0x0f)
		{
			keyh=key;//读出第一次按键按下的值进行保存keyh
		}
		key=0xf0;//第二次行列输出的值 1111 0000
		keyl=key;//读出第二次按键按下的值进行保存keyl
		keytp=keyh|keyl;
		
		switch(keytp)
		{
			case 0xee: temp=led[0];break;
		  case 0xde: temp=led[1];break;
			case 0xbe: temp=led[2];break;
			case 0x7e: temp=led[3];break;
			case 0xed: temp=led[4];break;
			case 0xdd: temp=led[5];break;
			case 0xbd: temp=led[6];break;
			case 0x7d: temp=led[7];break;
			case 0xeb: temp=led[8];break;
			case 0xdb: temp=led[9];break;
			case 0xbb: temp=led[10];break;//0000 1000 
			case 0x7b: temp=led[11];break;//0000 0011
			case 0xe7: temp=led[12];break;//0100 0110
			case 0xd7: temp=led[13];break;//0010 0001
			case 0xb7: temp=led[14];break;//0000 0110
			case 0x77: temp=led[15];break;//0000  1110
			default:break;
		}
	 }
	return temp;
	}
/**************************************
*
***************************************/
void delay()
{
	char i=10;
	while(i--);
}

 图二 行列翻转式代码

图三  仿真图 

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Esky2005

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值