#include<reg52.h>
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
#define dxuan P0 //段选
#define key P1 //按键接口
//sbit LSA=P2^2;
//sbit LSB=P2^3;
//sbit LSC=P2^4;
u8 code duanma[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
u8 keyvalue;//定义一个全局变量
void delay(u16 t)//有按键别忘了加delay,消抖
{
while(t--);
}
//矩阵采用行列扫描,高四位输出低电平,低四位输出高电平,当低四位不全为高电平时说明有按键按下(判断列)
//高四位输出高电平,低四位输出低电平,当高四位不全为高电平时按键按下(判断行)
//行连的是高 列连的是低
void keykey() //模块化,矩阵按键控制模块
{
u8 a;
key=0x0f;//0000 1111
if(key!=0x0f)//
{
delay(1000);
if(key!=0x0f)
{
//判断列
key=0x0f;//0000 1111
switch(key)
{
case(0x07):keyvalue=0;break; //break
case(0X0b):keyvalue=1;break;
case(0X0d):keyvalue=2;break;
case(0X0e):keyvalue=3;break;
}
//判断行
key=0xf0;//1111 0000
switch(key)
{
case(0x70):keyvalue=keyvalue;break; //break
case(0Xb0):keyvalue=keyvalue+4;break;
case(0Xd0):keyvalue=keyvalue+8;break;
case(0Xe0):keyvalue=keyvalue+12;break;
}
while((a<50)&&(key!=0xf0)) //按键松开的判断
{
delay(1000);
a++;
}
}
}
}
void main()
{
while(1)
{
keykey();
dxuan=duanma[keyvalue];
}
}
矩阵按键