主要原因是你消隐没有处理好,在传输段码过程中要关闭数码管。否则在仿真时会闪烁,在实际电路中可能会有鬼影。给你把程序修改了一下就正常了。
- #include<reg51.h>
- #include<intrins.h>
- #define u8 unsigned char
- #define u16 unsigned int
- u8 code seg[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xff, 0xaa};
- const u16 m[] = {10000, 1000, 100, 10};//数位分解所用权值表
- u16 val = 42950; //所演示的起始值 //分解以后的存放缓冲
- u8 Buf[5];
- sbit DAT = P3^4; //串行数据线
- sbit CLK = P3^7; //串行时钟线
- sbit Hide= P3^5; //消隐
- void delayms(u16 ms)
- {
- u8 i;
- while(ms--)
- for(i = 0; i < 120; i++);
- }
- void Decompose(u16 x, u8 d[]) //分解显示数据val
- { //分解整数x
- u8 i;
- for(i=0;i<4;i++)
- {
- d[i]= 0;
- while(x>=m[i])
- {
- x -= m[i];
- d[i]++;
- }
- }
- d[4] = x;
- }
- void serial_Output(u8 d)//模拟时序向74HC164串行输出1字节数据
- {
- u8 i;
- for(i=0;i<8;i++)
- {
- d <<= 1;
- DAT = CY; //移出一位,高位优先
- CLK = 0;
- CLK = 1; //上升沿移入数据
- }
- }
- void main()
- {
- u8 i;
- while(1)
- {
- Decompose(val, Buf); //分解显示数据val
- Hide=0;//消隐,关闭数码管电源
- for(i = 4; i != 0xff; i--) //串行发送各数字段码
- {
- serial_Output(seg[Buf[i]]);
- //delayms(2);
- }
- Hide=1;//打开数码管电源
- delayms(500);//延时u8最大255,改为u16
- val++;
- }
- }
复制代码
|