4×4矩阵键盘

#include "reg51.h"
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit P0_0=P0^0;
sbit P0_1=P0^1;
sbit P0_2=P0^2;
sbit P0_3=P0^3;
sbit P0_4=P0^4;
sbit P0_5=P0^5;
sbit P0_6=P0^6;
sbit P0_7=P0^7;

sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;

sbit P2_0=P2^0;
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P2_3=P2^3;
sbit P2_4=P2^4;
sbit P2_5=P2^5;
sbit P2_6=P2^6;
sbit P2_7=P2^7;

sbit P3_0=P3^0;
sbit P3_1=P3^1;
sbit P3_2=P3^2;
sbit P3_3=P3^3;
sbit P3_4=P3^4;
sbit P3_5=P3^5;
sbit P3_6=P3^6;
sbit P3_7=P3^7;
sbit led=P3^7;
//---------------------------------------------------*/
//全局变量定义
unsigned char B_key_value; //串口校验使用
/*-----------------------------------------------------------------------------------
函 数 名: Delay()
功 能: 延时
说 明: 延时时间0.5ms*i 最大延时127.5ms 11.0592M
入口参数: unsigned char i
返 回 值: 无
/*---------------------------------------------------------------------------------*/
void Delay(unsigned char i)
{
unsigned char j;
do{
//-------------------
j=250; //延时0.5ms
do{
j--;
}while(j);
//-------------------
i--;
}while(i);
}
/*-----------------------------------------------------------------------------------
函 数 名:
功 能: 延时
说 明:
入口参数: unsigned char i
返 回 值: 无
/*---------------------------------------------------------------------------------*/
void Delay500ms(unsigned char i)
{
do{
Delay(200); //延时200ms
i--;
}while(i);
}
/*-----------------------------------------------------
函 数 名:
功 能: 打开及初始化串口
说 明:
入口参数:
返 回 值:
//---------------------------------------------------*/
void OpenSerialCom(void)
{
SCON = 0x50; //设置串口工作模式1并打开串口
TMOD = 0x20; //波特率
PCON |= 0x80;
TH1 = 0xfa; //9600
TL1 = 0xfa;
IE |= 0x90; //打开串行中断及总中断
TR1 = 1; //启动内部定时
}
/*-----------------------------------------------------
函 数 名:
功 能: 数据(字符串)串行发送
说 明:
入口参数:
返 回 值:
//---------------------------------------------------*/
void SendChar(uchar ch)
{
ES=0;
SBUF=ch;
while(TI==0);
TI=0; //发送中断标志
Delay500ms(1); //延时1s
ES=1;
}
/*-----------------------------------------------------
函 数 名:
功 能: 按键扫描
说 明:
入口参数: 无
返 回 值: 键值
//---------------------------------------------------*/
uint KeyScan()
{
uchar a=0xff;
uchar b=0;
P1=0x00;
P2=0xE0;
if(P0!=0xFF) //判断是否有键按下,无键按下key=FF
{
for(b=0;b<13;b=b+1) //13列
{
if(b<8)
{
P2=0xff;

//P2口置1
P1=~(0x80>>b); //P1口右移,取反
Delay(8);//延时消抖
if(P0!=0xFF) //P0口是否全为1
{
if(P0_0==0){a=0x10;}
else if(P0_1==0){a=0x20;}
else if(P0_2==0){a=0x30;}
else if(P0_3==0){a=0x40;}
else if(P0_4==0){a=0x50;}
else if(P0_5==0){a=0x60;}
else if(P0_6==0){a=0x70;}
else if(P0_7==0){a=0x80;}
a=a+b; //读取键值
}
}
else
{
P1=0xff;
switch(b)
{
case 8:{P2=0xef;}break;
case 9:{P2=0xf7;}break;
case 10:{P2=0xfe;}break;
case 11:{P2=0xfd;}break;
case 12:{P2=0xfb;}break;
default:{}
}
Delay(8);//延时消抖
if(P0!=0xFF)
{
if(P0_0==0){a=0x10;}
else if(P0_1==0){a=0x20;}
else if(P0_2==0){a=0x30;}
else if(P0_3==0){a=0x40;}
else if(P0_4==0){a=0x50;}
else if(P0_5==0){a=0x60;}
else if(P0_6==0){a=0x70;}
else if(P0_7==0){a=0x80;}
a=a+b;
}
}
}
}
P1=0x00;
P2=0xE0;
B_key_value=a;
return(a);
}
/*-----------------------------------------------------
函 数 名:
功 能: IO口函数初始化, 指示灯闪烁两次
说 明:
入口参数: 无
返 回 值: 无
//---------------------------------------------------*/
void SystemInti()
{
uint i=0;
SendEnable=0; //初始化变量
for(i; i<2; i++)
{
led=0;//系统开始,红灯闪烁两次
Delay500ms(1); //0.5s
led=1;
Delay500ms(1); //0.5s
}
P1 &=0x00;
}
/*-----------------------------------------------------
函 数 名: main()主函数
功 能:
说 明:
入口参数:
返 回 值:
//---------------------------------------------------*/
void main()
{
uint k;
P0=0Xff;
P2=0Xe0;
P1=0X00;
Delay500ms(2);
start:
SystemInti(); //系统初始化
OpenSerialCom(); //串口初始化为模式1
Delay500ms(20);
while(1)
{
k=KeyScan(); //这个按键取值非常稳定
if(k!=0xff)
{
if(k==KeyScan())
{
//SendChar(0x0a);
SendChar(k); //正常键值发送
}
}
if(SendEnable>=20) //软件看门狗,系统跑飞,重新开始
goto start;
}
}

相关文档
最新文档