STC89C52RC由矩阵键盘为0~9和发送键,实现矩阵按键按下0~255内一个数,将其显示在8位共阳极数码管上并通过串口通信发送给计算机,计算机由isp串口接收C语言代码
时间: 2024-02-24 19:57:56 浏览: 87
STC89C52RC代码
以下是STC89C52RC单片机使用矩阵键盘输入数字和发送键,并将输入数据显示在8位共阳极数码管上,并通过串口通信发送给计算机,计算机使用ISP串口接收的C语言代码:
单片机端:
```c
#include <reg52.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define KEY P0
#define DIG P1
#define SEND P3_4
uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
uchar keyscan();
void delay(uint x);
void send_data(uchar dat);
void main()
{
uchar key, dat, dig, i;
TMOD = 0x01; //定时器0工作在模式1,16位计数器
TH0 = 0xfc; //定时器初值
TL0 = 0x18;
TR0 = 1; //启动定时器0
ET0 = 1; //开启定时器0中断
TH1 = 0xfd; //波特率9600
TL1 = 0xfd;
TR1 = 1; //启动定时器1
SM0 = 0;
SM1 = 1; //使用串口模式1
REN = 1; //启动串口接收
EA = 1;
ES = 1; //开启总中断和串口中断
while(1)
{
key = keyscan();
if(key != 0xff)
{
if(key == 0x0a) //发送键按下
{
SEND = 0;
for(i=0; i<10; i++) //发送10个字节
{
send_data(dat);
delay(10);
}
SEND = 1;
}
else //数字键按下
{
dat = key;
}
}
dig = dat / 100; //分解数字位
DIG = 0x07; //选择第一位数码管
P2 = table[dig];
delay(5);
DIG = 0x0b; //选择第二位数码管
P2 = table[(dat%100)/10];
delay(5);
DIG = 0x0d; //选择第三位数码管
P2 = table[dat%10];
delay(5);
}
}
uchar keyscan() //键盘扫描函数
{
uchar i, j, key;
KEY = 0x0f;
for(i=0; i<4; i++)
{
KEY = _crol_(KEY, 1); //按行扫描
key = KEY & 0x0f;
if(key != 0x0f) //有按键按下
{
delay(10); //去抖动延时
if((KEY & 0x0f) != 0x0f) //判断抖动后是否仍有按键按下
{
return (i*4 + key); //返回按键值
}
}
}
return 0xff; //无按键按下
}
void delay(uint x) //延时函数
{
uint i, j;
for(i=x; i>0; i--)
for(j=110; j>0; j--);
}
void send_data(uchar dat) //通过串口发送数据
{
SBUF = dat;
while(!TI);
TI = 0;
}
void timer0() interrupt 1 //定时器0中断函数
{
TH0 = 0xfc; //重新赋初值
TL0 = 0x18;
send_data(0xaa); //每隔1s发送一个0xaa
}
```
计算机端:
使用ISP串口接收数据的代码与普通串口接收数据的代码基本相同,只需要修改一下串口初始化的代码即可。在使用ISP串口时,需要选择正确的串口号和波特率,同时确保连接正确。
```c
#include <regx51.h>
typedef unsigned char uchar;
typedef unsigned int uint;
void serial_init()
{
PCON &= 0x7f; //SMOD=0
SCON = 0x50; //串口工作在模式1
TMOD &= 0x0f; //清除定时器1的设置
TMOD |= 0x20; //定时器1工作在模式2,8位自动重装载
TH1 = 0xfd; //波特率9600
TL1 = 0xfd;
TR1 = 1; //启动定时器1
ES = 1; //开启串口中断
EA = 1; //开启总中断
}
void main()
{
uchar dat;
serial_init();
while(1)
{
if(RI) //如果接收到数据
{
RI = 0;
dat = SBUF;
//处理接收到的数据
}
}
}
void serial() interrupt 4 using 1 //串口中断函数
{
if(RI) //如果接收到数据
{
RI = 0;
dat = SBUF;
//处理接收到的数据
}
}
```
注意:以上代码仅供参考,可能存在错误或不足之处,使用时请根据实际情况进行修改和完善。
阅读全文