说明:使用普中开发板进行数码管动态显示,显示“1234”
出现问题:第一位显示异常
代码:
#include <STC89C5xRC.H>
#include "stdio.h"
#define u8 unsigned char
#define u16 unsigned int
code unsigned char shownum[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};
u8 COD[8],PSI,COT[10];
u16 seg_delay;
void Timer0_Init(void);
void SEG_Proc();
void main()
{
Timer0_Init();
while(1)
{
SEG_Proc();
}
}
/*********数码管*************/
/*
将字符串转化成数码管代码
*/
void SEG_TSL(u8 *input,u8 *output)
{
u8 i=0,j=0,k=0;
u8 *s_temp=0;
for(i=0;i<8;i++,j++)
{
switch(input[j])
{
case '0':output[i] = shownum[0];break;
case '1':output[i] = shownum[1];break;
case '2':output[i] = shownum[2];break;
case '3':output[i] = shownum[3];break;
case '4':output[i] = shownum[4];break;
case '5':output[i] = shownum[5];break;
case '6':output[i] = shownum[6];break;
case '7':output[i] = shownum[7];break;
case '8':output[i] = shownum[8];break;
case '9':output[i] = shownum[9];break;
}
if(input[j+1] == '.')
{
output[i] |= 0x80;
}
}
}
/*
数码管显示函数
P22,P23,P24协助译码器控制位选,其中P22为最低位
*/
void SEG_Show(u8 COD,u8 PSI)
{
//消影
P0 = 0x00;
//位选
P2 = P2 & 0xe3 | (PSI<<2);
//段选
P0 = COD;
}
/***************定时器***************************/
void Timer0_Init(void) //1毫秒@12MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x18; //设置定时初始值
TH0 = 0xFC; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
//开启中断
EA = 1;
ET0 = 1;
}
void Timer0_IT() interrupt 1
{
TL0 = 0x18; //设置定时初始值
TH0 = 0xFC; //设置定时初始值
if(seg_delay++ == 500)seg_delay = 0;
SEG_Show(COD[PSI],PSI);
if(PSI++ == 8)PSI = 0;
}
/************************************************/
void SEG_Proc()
{
if(seg_delay)return;
seg_delay = 1;
sprintf(COT,"%8u",1234);
SEG_TSL(COT,COD);
}