根据串口通讯规则,
还有自己编写的 八段数码管 显示规则编写的程序。
主要是:
1.串口通讯·输入:执行中断,模拟缓冲区保存输入的数据(最多16Byte)。
2.串口通讯·输出:保存数据的同时,通过SBUF输出到屏幕。
3.数据处理:把读入模拟缓冲区的数据输出到8个八段数码管中(循环覆盖)。
就这样,没什么特别的。
其实本来想输出到 液晶屏1602 中的,
可惜我买的 液晶屏1602 自带单片机处理程序(用来和Arduino通信的,没有和单片机通信的接口)。
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define DIGIT_MAX 16
#define LCD P0
#define LCD_BIN P2
const uchar digital[DIGIT_MAX+5] =
{0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,
0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x80};
// 0123456789 AbCdEF. + 17
const uchar digital_bin[8] =
{0xE3, 0xE7, 0xEB, 0xEF, 0xF3, 0xF7, 0xFB, 0xFF};
//{0x00, 0x04, 0x08, 0x0C, 0x10, 0x14, 0x18, 0x1C};
const uint TIME_H = 0xF3; // 4800bps
const uint TIME_L = 0xF3;
uint TIME;
void u_init(){
SCON = 0x50; //0移位寄存器,1可变异步收发器8+2,2固定9+2,3可变9+2 [4]0允许串行接收
TMOD = 0x20; //计数器工作方式2
PCON = 0x80; //波特率加倍
TH1 = 0xF3; //4800bps * 2
TL1 = 0xF3;
ES = 1; //打开 接受中断
EA = 1; //打开 总中断
TR1 = 1; //打开 计数器
}
uchar LCD_dat[8], no=7;
uchar buffer[16], now;
uchar to_digital(uchar x){
if( '0'<=x && x<='9' )
return digital[x-'0'];
switch( x ){
case 'a':
case 'A': return 0x77;
case 'b':
case 'B': return 0x7C;
case 'c': return 0x58;
case 'C': return 0x39;
case 'd':
case 'D': return 0x5E;
case 'e':
case 'E': return 0x79;
case 'f':
case 'F': return 0x71;
case 'h': return 0x74;
case 'H': return 0x76;
case 'p':
case 'P': return 0x73;
case 'o':
case 'O': return 0x5C;
case 'l': return 0x30;
case 'L': return 0x38;
case 'j': return 0x0D;
case 'J': return 0x0F;
case 'n': return 0x54;
case '-': return 0x40;
case '.': return 0x80;
default: return 0x49;// '三'
}
}
void main(){
uint i, cnt;
u_init();
while( 1 ){
for(i=0; i<now; i++){
LCD_dat[no] = to_digital( buffer[i] );
no = (no+0x07)&0x07;
}
now = 0;
for(i=0; i<8; i++){
LCD_BIN = digital_bin[i];
for(cnt=10; cnt; cnt--)
if( i==no ) LCD = LCD = LCD_dat[i] | 0x80;
else LCD = LCD_dat[i];
LCD = 0x00;
}
}
}
void u_int1() interrupt 4{
buffer[now] = SBUF; //接收数据
RI = 0; //手动清除中断标志
SBUF = buffer[now]; //发送数据
now = (++now)&0x0F; //下一个 保存位置
while( !TI ); //发送完毕
TI = 0; //发送标志复位
//数据处理
}
/*
0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, // 0123456789
0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x08, // AbCdEF.
0x58, 0x3D, 0x76, 0x74, 0x0F, 0x0D, 0x38, 0x30, 0x54, 0x40, // cGHhJjLln-
0x5C, 0x73, 0x64, 0x48, 0x49, // oPS??
*/