|
程序效果:初始時發送端無任何顯示,接受端顯示8位的數字,當發送端的矩陣按鍵按下某一個時,
接受端就接受到對應的按鍵的操作,16個按鍵對應著對8位數字每個位的加減。
發送端代碼:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define GPIO_KEY P1
uchar KeyValue; //存放鍵值
void delay(uint z); //延時函數
void send(uchar num1); //發送函數
void keyscan(); //矩陣鍵盤掃描函數
void UsartInit(); //串口初始化
void main()
{
UsartInit();
P0=0x00; //數碼管初始消影
while(1)
{
keyscan(); //不斷掃描鍵盤發送掃描結果
}
}
void UsartInit() //串口初始化,設置波特率
{
TMOD=0x20; //設置定時器1為工作方式2
TH1=0xfd; //裝初值設置波特率
TL1=0xfd;
TR1=1; //打開定時器1
SCON=0X50;
PCON=0X00;
}
void delay(uint z) //延時函數
{
while(z--);
}
void send(uchar num1) //發送函數
{
SBUF=num1;
while(!TI);
TI=0;
}
void keyscan() //矩陣鍵盤掃描函數
{
char a=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)//讀取按鍵是否按下
{
delay(1000);//延時10ms進行消抖
if(GPIO_KEY!=0x0f)//再次檢測鍵盤是否按下
{
//測試列
GPIO_KEY=0X0F;
switch(GPIO_KEY)
{
case(0X07): KeyValue=0;break;
case(0X0b): KeyValue=1;break;
case(0X0d): KeyValue=2;break;
case(0X0e): KeyValue=3;break;
}
//測試行
GPIO_KEY=0XF0;
switch(GPIO_KEY)
{
case(0X70): KeyValue=KeyValue;break;
case(0Xb0): KeyValue=KeyValue+4;break;
case(0Xd0): KeyValue=KeyValue+8;break;
case(0Xe0): KeyValue=KeyValue+12;break;
}
send(KeyValue); //傳送鍵值
while((a<50)&&(GPIO_KEY!=0xf0)) //檢測按鍵松手檢測
{
delay(1000);
a++;
}
}
}
}
所有資料在壓縮包中。
|
評分
-
查看全部評分
|