#include "STC89C51RC_RD_PLUS.H"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define nop _nop_();_nop_();
uchar code C51BOX2[3] _at_ 0x43; //仿真器用三字节空间
uchar code DispTab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,//段码0-9
0x88,0x83,0xc6,0xa1,0x86,0x8e}; //a-f
uchar DispBuf[4];
sfr LedPort=0x80; //P0口接段码
sbit Led0 = P1^0; //LED控制脚
sbit Led1 = P1^1;
sbit Led2 = P1^2;
sbit Led3 = P1^3;
uchar CN; //接收缓冲区
uchar CT; //接收字节计数
bit Recdat;
void uDelay(uchar DelayTime) //us级延时子程序,入口参数每加1约加2us
{ while(--DelayTime); }
void Hex2Bcd() //HEX转BCD程序
{
DispBuf[0]=DispTab[CN/16];
DispBuf[1]=DispTab[CN%16];
DispBuf[2]=0xff;
DispBuf[3]=0xff;
}
void Display(uchar j) //显示子程序
{
for(;j>0;j--)
{
LedPort=DispBuf[0];
Led0=0;
uDelay(20);
Led0=1;
LedPort=DispBuf[1];
Led1=0;
uDelay(20);
Led1=1;
LedPort=DispBuf[2];
Led2=0;
uDelay(20);
Led2=1;
LedPort=DispBuf[3];
Led3=0;
uDelay(20);
Led3=1;
}
}
void InitCom() //初始化串口
{
SCON=0x50; //0101 0000B,工作方式1,8位UART,波特率可变,允许接收
TMOD=0x20; //T1工作于方式2
TCON=0x40; //定时器1开始计数
TH1=250; //T1计数初值
TL1=250;
PCON=0x80; //SMOD置1,双倍速率
RI=0;TI=0;
//TR1=1;
}
void ComINT() interrupt 4 using 1 //中断接收程序
{
if(RI) //判断是否接收完,接收完成后,由硬件置RI位
{
CN=SBUF; //读入缓冲区
RI=0; //清标志
Recdat=1; //有数据,建立标志
}
}
void ComOut(uchar dat) //向串口发送数据
{
SBUF=dat; //发送数据送缓冲
while(!TI); //等待发送完成
TI=0;
}
void main()
{
uDelay(255);
CT=0;
InitCom();
EA=1;
ES=1;
while(1){
if(Recdat)
{Hex2Bcd();ComOut(CN);Recdat=0;}
Display(10);
}
}