/**************************************
函數功能:
在#MCU2的數碼管上顯示收到的學號後3位
若與自己的相符合,則發送Right!否則發送Wrong!
默認學號為123
***************************************/
#include<reg52.h>
#include<absacc.h>
/*******************************
總線地址定義區
********************************/
#define LED_DIG XBYTE[0xD000] //定義數碼管的段選總線地址
#define LED_COM XBYTE[0xC000] //定義數碼管的位選總線地址
/*******************************
全局變量定義區
********************************/
unsigned char code DisCode[] = {0x0C0,0xF9,0xA4,0xB0,0x99,0x92,
0x82,0xF8,0x80,0x90,0xFF,0xe1,0x89};
//***陽極數碼管碼表,定位在ROM中
bit Flag = 0; //壹個標誌位,防止MCU重復發送
unsigned char RR = 0; //收數指針
unsigned char TT = 0; //發數指針
unsigned char *SDat;
unsigned char Disbuf[] = {0,0,0,0}; //存放欲顯示的數據
unsigned char Hello[] = {'H','e','l','l','o','!','\n'};
unsigned char Right[] = {'R','i','g','h','t','!','\n'};
unsigned char Wrong[] = {'W','r','o','n','g','!','\n'};
/********************************
顯示延時
*********************************/
void Delay()
{
unsigned char i = 10;
while(i--);
}
/********************************
帶參數傳遞的顯示程序循環方式
*********************************/
void Display(unsigned char Dat[4])
{
unsigned char COM = 0X01; //數碼管位選
unsigned char i;
for(i=0;i<4;i++)
{
LED_DIG = DisCode[Dat[i]]; //送段選
LED_COM = COM; //選通壹個數碼管
Delay();
LED_COM = 0; //消隱
COM<<=1; //移位,準備選通下壹個數碼管
}
}
/********************************
主函數
*********************************/
void main(void)
{
//初始化
TMOD = 0x20;
TH1 = TL1 = -11059200/12/32/9600;
SCON = 0x50;
TR1 = 1;
ES= 1;
EA= 1;
//主循環
SDat = Hello;
TI = 1;
while(1)
{
Display(Disbuf); //功能子函數調用
}
}/********************************
中斷函數
*********************************/
void SER_SR() interrupt 4 using 2
{
if(RI)
{
RI = 0;
Disbuf[RR++] = SBUF;
if(RR==3)
{
RR = 0;
if((Disbuf[0]==0x01)&&(Disbuf[1]==0x02)&&(Disbuf[2]==0x03))
{
Disbuf[3] = 0x0b;
SDat = Right;
}
else
{
Disbuf[3] = 0x0c;
SDat = Wrong;
}
TI = 1;
}
}
else
{
TI = 0;
if(TT<7)
{
SBUF = *(SDat+TT);
TT++;
}
else
TT = 0;
}
}