在键盘的电路中,存在这线与这玩意,
线与和线或:一条线和一个开关,一端是高电平另一端是低电平,开关闭合,整条线就会变为低电平,总的来说就是存在线与的关系,只要一端是低电平闭合开关后,整条线就会拉低,这就是线与;有一端是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;
}
}
}