您的位置:首页 > 其它

20141109 【 单片机——串口通讯——中断 】 八段数码管显示通信内容

2014-11-09 19:16 309 查看
根据串口通讯规则,

还有自己编写的 八段数码管 显示规则编写的程序。

主要是:

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??
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: