📄 com.txt
字号:
//串口调试程序,下载本程序到主板,打开本文件夹中的串口调试软件,试试看,不用我讲了吧!
#include <reg52.h>
#include <intrins.h>
sbit SPK=P3^4; //SPK定义为P3口的第4位,驱动蜂鸣器
code unsigned char key_tab[17]={0xed,0x7e,0x7d,0x7b,
0xbe,0xbd,0xbb,0xde,
0xdd,0xdb,0x77,0xb7,
0xee,0xd7,0xeb,0xe7,0XFF};//========================此数组为键盘编码,
//本人采用类似电话按键的编码方式,方便以后设计
// 1 2 3 a 0x01 0x02 0x03 0x0a
// 4 5 6 b 对应16进制码: 0x04 0x05 0x06 0x0b
// 7 8 9 e 0x07 0x08 0x09 0x0e
// * 0 # f 0x0c 0x00 0x0e 0x0f
code unsigned char table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共阴数码管 0-9 表
unsigned char l_tmpdate[3]={0,0,0};
unsigned char l_key=0xff; //定义变量,存放键值
unsigned char l_keyold=0xFF; //做为按键松开否的凭证
void ReadKey(void); //扫描键盘 获取键值
void display(unsigned char *lp,unsigned char lc);//数字的显示函数;lp为指向数组的地址,lc为显示的个数
void delay();//延时子函数,5个空指令
void main(void)
{
EA=1; //开启总中断
//RI=1;
EX0=1; //开启外部中断 0
IT0=1; // 设置成 下降沿触发方式
P0=0xf0; //键盘端口设备
//AT89S52还有个定时器3,是16位定时计数器,我们这里就用定时器3来产生波特率,
//为何我们不用定时器2呢,是因为我们用的晶振有关,你们可以计算下,12M的频率用定时器2是难以
//产生我们串口软件所要的比如9600,4800等波特率,所以这里我们用到了定时计数器3
//下面是产生9600波特率的初值,你们可以用工式计算下:16位计数为65536-12000000/12/32/9600
RCAP2L = 0xD8;
RCAP2H = 0xFF;
TL2=0XD8;
TH2=0XFF;
T2CON=0X34; //此寄存器为设置定时器3做波特率发生器,是一个开关,默认为定时器2,所以我们要设置它
SCON=0X50; //串口的工作方式,设置为方式1
ES=1; //打开串口中断
while(1)
{
display(l_tmpdate,3);//显示接收缓冲变量的值
if(l_key!=0xff){ //检测键盘是否有键要处理
SBUF=l_key; //我们这里直接将键盘编码发送出去
while(!TI){}
TI=0; // 等待发送完毕返回继续检测
l_key=0xff;
}
}
}
void display(unsigned char *lp,unsigned char lc)//显示
{
unsigned char i; //定义变量
P2=0; //端口2为输出
P1=P1&0xF8; //将P1口的前3位输出0,对应138译门输入脚,全0为第一位数码管
for(i=0;i<lc;i++){ //循环显示
P2=table[lp[i]]; //查表法得到要显示数字的数码段
delay(); //延时
P2=0; //清0端口,准备显示下位
if(i==7) //检测显示完8位否,完成直接退出,不让P1口再加1,否则进位影响到第四位数据
break;
P1++; //下一位数码管
}
}
void delay(void) //空5个指令
{
unsigned char i=10;
while(i)
i--;
}
//以下一部份在键盘程序里有说明,此处不在讲述
void key_scan() interrupt 0 //外部中断 0 0的优先级最高
{
EX0=0;
TMOD&=0XF1;
TH0=0X2E;
TL0=0X00;
ET0=1;
TR0=1;
}
void timer0_isr(void) interrupt 1 //定时器0的中断函数
{
TR0=0;
ReadKey();
}
void ReadKey(void) //读键盘值
{
unsigned char i,j,key;
j=0xfe;
key=0xff;
for (i=0;i<4;i++){
P0=j;
if ((P0&0xf0)!=0xf0){
key=P0;
break;
}
j=_crol_(j,1);
}
if (key==0xff){
l_keyold=0xff;
P0=0xf0;
EX0=1;
SPK=1;
return;
}
SPK=0;
if(l_keyold==key){
TH0=0X2E;
TL0=0;
TR0=1;
return;
}
TH0=0X2E;
TL0=0;
TR0=1;
l_keyold=key;
for(i=0;i<17;i++){
if (key==key_tab[i]){
l_key=i;
break;
}
}
}
void com_isr(void) interrupt 4 //串口中断
{
unsigned char tmp; //定义变量执接收串口数据
RI=0; //将寄存器复位等待接收下一个
tmp=SBUF; //将接收的数据存于变量中
l_tmpdate[0]=tmp/100; //将数据分开三位显示
tmp=tmp%100;
l_tmpdate[1]=tmp/10;
l_tmpdate[2]=tmp%10;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -