#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define DataPort P0 //定義數據端口 程序中遇到DataPort 則用P0 替換
unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};// 顯示段碼值0~F
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分別對應相應的數碼管點亮,即位碼
sbit LATCH1=P2^6;//定義鎖存使能端口 段鎖存
sbit LATCH2=P2^7;// 位鎖存
unsigned char TempData[8]; //存儲顯示值的全局變量
void Display(unsigned char FirstBit,unsigned char Num);//數碼管顯示函數
sbit FM=P2^3; //HJ-C52 P1.2 ?J5????
void Init_Timer0(void);//定時器初始化
void send_char();
unsigned char txd;
uchar buf,num,i,j;
void main (void)
{
SCON=0x50; //設置為工作方式1
PCON=0x00; //波特率不加倍
TMOD=0x20; //設置計數器工作方式2
EA=1; //打開總中斷
ES=1; //打開接收中斷
TL1=0xfd; //計數器初始值設置,注意波特率是9600的
TH1=0xfd;
TR1=1;
while (1)
{
Display(0,8); //調用顯示函數
TempData[i]=dofly_DuanMa[num];
for(j=0;j<8;j++)//清屏
{
TempData[j]=0;
}
}
}
void Display(unsigned char FirstBit,unsigned char Num)
{
static unsigned char i=0;
DataPort=0; //清空數據,防止有交替重影
LATCH1=1; //段鎖存
LATCH1=0;
DataPort=dofly_WeiMa[i+FirstBit]; //取位碼
LATCH2=1; //位鎖存
LATCH2=0;
DataPort=TempData[i]; //取顯示數據,段碼
LATCH1=1; //段鎖存
LATCH1=0;
i++;
if(i==Num)
i=0;
}
void serial() interrupt 4
{
ES=0;
if(RI==1) //RI 是串口接收中斷申請標志位
{
RI=0; //清除接收中斷標志位
buf=SBUF; //將接收到的數據放入到發送寄存器
send_char(); //調用
switch (buf)
{
case 0x31: P1=0xfe; FM=1 ;num=1;i++;break;
case 0x32: P1=0xfd; FM=1 ;num=2;i++;break;
case 0x33: P1=0xfb; FM=1 ;num=3;i++;break;
case 0x34: P1=0xf7; FM=1 ;num=4;i++;break;
case 0x35: P1=0xef; FM=1 ;num=5;i++;break;
case 0x36: P1=0xdf; FM=1 ;num=6;i++;break;
case 0x37: P1=0xbf; FM=1 ;num=7;i++;break;
}
ES=1;
}
}
void send_char() //發送一個字符
{
SBUF = buf;
while(!TI); //等待發送數據完成
TI = 0; //清除發送完成標志位
}
|