|
#include <REGX52.H>
unsigned char Nixie_Buffer[9];
unsigned char count, count1;
void UART_Init(void) //4800bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位數(shù)據(jù),可變波特率,與串口發(fā)送的區(qū)別是這里打開了接收控制位REN
TMOD &= 0x0F; //清除定時(shí)器1模式位
TMOD |= 0x20; //設(shè)定定時(shí)器1為8位自動(dòng)重裝方式
TL1 = 0xFA; //設(shè)定定時(shí)初值
TH1 = 0xFA; //設(shè)定定時(shí)器重裝值
ET1 = 0; //禁止定時(shí)器1中斷
TR1 = 1; //啟動(dòng)定時(shí)器1
EA = 1;
ES = 1;
}
unsigned char NixieTable[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f};//0~F,還有小數(shù)點(diǎn)
sbit DP1 = P0^0;
sbit DP2 = P0^1;
sbit DP3 = P0^2;
sbit DP4 = P0^3;
sbit DP5 = P0^4;
sbit DP6 = P0^5;
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
xms--;
}
}
void Nixie(unsigned char Location,Number)
{
switch(Location)
{
case 1:DP1 = 0;break;
case 2:DP2 = 0;break;
case 3:DP3 = 0;break;
case 4:DP4 = 0;break;
case 5:DP5 = 0;break;
case 6:DP6 = 0;break;
}
P1 = NixieTable[Number];
Delay(1);//先延時(shí)1毫米,為避免過早清零讓數(shù)碼管太暗
//P1 = 0x00;//將上一位段選清零,避免上一位段選的數(shù)據(jù)進(jìn)入下一位的位選,且讓清零的數(shù)據(jù)進(jìn)入位選,就沒影響,不過這里好像沒啥用
//計(jì)算機(jī)進(jìn)行:位選 段選 位選 段選.......
P0 = 0xff;
}
void Nixie_showentitle(unsigned char *str)
{
while(*str != '\0')
{
if (*str >= '0' && *str <= '9')
{
Nixie(count1, *str++ - 48);//顯示數(shù)字
count1++;
}
else if(*str == '.')
{
Nixie(count1 - 1, 16);//顯示小數(shù)點(diǎn)
*str++;
}
}
}//數(shù)碼管為6位共陽極
void main()
{
UART_Init();
while(1)
{
Nixie_showentitle(Nixie_Buffer);
}
}
void UART_Routine() interrupt 4
{
if(RI)
{
Nixie_Buffer[count] = SBUF;//從發(fā)送緩沖區(qū)發(fā)送文本,例如18.46.23
RI = 0;
count++;
count %= 9;
}
else
{
TI = 0;
}
}
|
|