《初学者C51自学笔记》之8X8键盘(线与和线或)

在键盘的电路中,存在这线与这玩意,

线与和线或:一条线和一个开关,一端是高电平另一端是低电平,开关闭合,整条线就会变为低电平,总的来说就是存在线与的关系,只要一端是低电平闭合开关后,整条线就会拉低,这就是线与;有一端是Z(高组态),闭合开关后,另一端是高电平整条线就是高低电平,反之亦然,这就是线或

如何编程:先P3=11110000(图中从下至上11110000),假设按下S1则其高四位变为1110(线与)(忽略低四位)这时你已经确定是键盘的第一列的某一按键被按下;再把P3=11101111,把低四位变为一(高四位不变),这时你还没放开按键,因为线与,则P3=11101110;(要想判断按键是否被按下:用&0xf0)

#include<reg52.h>
#define uchar unsigned char 
#define uint unsigned int 

unsigned char code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
unsigned char code smg_we[]={0x08,0x18,0x28,0x38,0x48,0x58,0x68,0x78};

//************************************************
//延时函数,在12MHz的晶振频率下
//大约50us的延时
//************************************************
void delay_50us(uint t)
{
	uchar j;
	for(;t>0;t--)
        for(j=19;j>0;j--);
}

//************************************************
//延时函数,在12MHz的晶振频率下
//大约50ms的延时
//************************************************
void delay_50ms(uint t)
{
	uint j;
	for(;t>0;t--)
	for(j=6245;j>0;j--);
} 

void main()
{
	uchar key_l,key_h;
	uchar key;
	while(1)
	{
	P3=0xf0;//11110000
	key_l=P3;
	key_l=key_l&0xf0;//判断按键是否被按下
	if(key_l!=0xf0)
	{
		delay_50us(100);//消抖
		if(key_l!=0xf0)//再判断
		{
			key_l=P3&0xf0;
			key_l=key_l|0x0f;//11101111(准备对行进行检查)
			P3=key_l;
			key_h=P3;
			key_h=key_h&0x0f;//00001110(把列忽略)
			key_l=key_l&0xf0;//11100000(把行忽略)
			key=key_h+key_l; //11101110

		}
	}
	switch (key)
	{
		case 0xee:P1=smg_du[0];break;
		case 0xde:P1=smg_du[1];break;
		case 0xbe:P1=smg_du[2];break;
		case 0x7e:P1=smg_du[3];break;
		case 0xed:P1=smg_du[4];break;
		case 0xdd:P1=smg_du[5];break;
		case 0xbd:P1=smg_du[6];break;
		case 0x7d:P1=smg_du[7];break;
		case 0xeb:P1=smg_du[8];break;
		case 0xdb:P1=smg_du[9];break;
		case 0xbb:P1=smg_du[10];break;
		case 0x7b:P1=smg_du[11];break;
		case 0xe7:P1=smg_du[12];break;
		case 0xd7:P1=smg_du[13];break;
		case 0xb7:P1=smg_du[14];break;
		case 0x77:P1=smg_du[15];break;

	}
	}
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值