前几天做的关于串口通讯的课程设计,结合了矩阵按键,以及8位的数码管动态显示。
程序效果:初始时发送端跟清空端无任何显示,当发送端的矩阵按键按下某一个时,
接受端就接受到对应的键值。并且显示在数码管上,显示效果是按下一个按键数码管就
多显示一个,按到第9下的时候,数码管全部不显示,回归到初始状态。
压缩包中有原理图跟源程序
发送端代码:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define GPIO_DIG P0
#define GPIO_KEY P1
uchar KeyValue; //存放键值
void delay(uint z); //延时函数,10us
void send(uchar num1); //发送函数
void keyscan(); //矩阵键盘扫描函数
void UsartInit(); //波特率设置函数
void main()
{
UsartInit();
GPIO_DIG=0x00; //数码管初始消影
while(1)
{
keyscan(); //不断扫描键盘发送扫描结果
}
}
void delay(uint z) //延时函数
{
while(z--);
}
void UsartInit() //波特率设置函数
{
TMOD=0x20; //设置定时器1为工作方式2
TH1=0xfd; //装初值设置波特率
TL1=0xfd;
TR1=1; //打开定时器1
SCON=0X50;
PCON=0X00;
}
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++;
}
}
}
}
压缩包中有原理图同全套代码,欢迎借鉴。。
D单片机间串口通信_矩阵按键_动态数码管.zip
(230.22 KB, 下载次数: 31)
|