第1位不显示,第2位显示1. 第三位不显示
最后第1,2位不显示 第3位显示0.
d01,和A02也是这么显示的。就好像跑马灯一样。
我把程序贴出来了。谁帮我看看。怎么修改成 U1.0在3位数码一起显示,然后过1秒后,切换到d01显示1秒种,最后切换到A02显示1秒钟,然后又从U1.0开始显示,依次循环。
#include <stc12c5a.h>
#include <intrins.h>
#define NOP() _nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_() /* 定义空指令 */
//74HC595引脚控制
sbit MOSIO =P0^1; //串行数据线 //14脚
sbit R_CLK =P0^2; //数据并行输出控制 //12脚
sbit S_CLK =P0^3; //串行时钟线 //11脚
//数码管位选控制
sbit ADDR0 = P1^3; //第0位数码管
sbit ADDR1 = P1^2; //第1位数码管
sbit ADDR2 = P1^1; //第2位数码管
unsigned char code LedChar[] = { //数码管字形码
~0xC0, ~0xF9, ~0xA4, ~0xB0, ~0x99,
~0x92, ~0x82, ~0xF8, ~0x80, ~0x90,
0x77,0x7c,0x39,0x5e,0x79,0x71,0x3e
};
unsigned char LedBuff[9] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //数码管显示缓冲区,开始都不点亮
//全局变量
unsigned char i = 0; //动态扫描索引
void HC595SendData(unsigned char SendVal);
void ADC_Process();
void Delay1000ms();
void main()
{
while(1)
{
ADC_Process();
}
}
/*********************************************************************************************************
** 函数名称: HC595SendData
** 功能描述: 向SPI总线发送数据
*********************************************************************************************************/
void HC595SendData(unsigned char SendVal)
{
unsigned char i;
for(i=0;i<8;i++)
{
if((SendVal<<i)&0x80) MOSIO=1; //set dataline high 0X80 最高位与SendVal左移的最高位 进行逻辑运算
else MOSIO=0; // 如果为真 MOSIO = 1
S_CLK=0;
NOP(); //短暂延时产生一定宽度的脉冲信号
NOP(); //短暂延时
S_CLK=1;
}
R_CLK=0; //set dataline low
NOP(); //短暂延时
NOP(); //短暂延时
R_CLK=1; //
}
/***********************************************
************************************************/
void ADC_Process()
{
LedBuff[0] = LedChar[16]; //显示U
LedBuff[1] = LedChar[1]|0x80; //显示1.
LedBuff[2] = LedChar[0]; //显示0
LedBuff[3] = LedChar[13]; //显示d
LedBuff[4] = LedChar[0]; //显示0
LedBuff[5] = LedChar[1]; //显示1
LedBuff[6] = LedChar[10]; //显示A
LedBuff[7] = LedChar[0]; //显示0
LedBuff[8] = LedChar[2]; //显示2
HC595SendData(0x00); //消影
switch(i)
{
case 0: ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; i++; HC595SendData(LedBuff[0]);
Delay1000ms();break;
case 1: ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; i++; HC595SendData(LedBuff[1]);
Delay1000ms();break;
case 2: ADDR2 = 1; ADDR1 = 1; ADDR0 = 0; i++; HC595SendData(LedBuff[2]);
Delay1000ms();break;
case 3: ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; i++; HC595SendData(LedBuff[3]);
Delay1000ms();break;
case 4: ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; i++; HC595SendData(LedBuff[4]);
Delay1000ms(); break;
case 5: ADDR2 = 1; ADDR1 = 1; ADDR0 = 0; i++; HC595SendData(LedBuff[5]);
Delay1000ms();break;
case 6: ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; i++; HC595SendData(LedBuff[6]);
Delay1000ms();break;
case 7: ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; i++; HC595SendData(LedBuff[7]);
Delay1000ms(); break;
case 8: ADDR2 = 1; ADDR1 = 1; ADDR0 = 0; i=0; HC595SendData(LedBuff[8]);
Delay1000ms();break;
default :break;
}
}
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 43;
j = 6;
k = 203;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
|