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

根据串口通讯规则,

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


主要是:

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?? 
*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值