用STC8051U做实验,要求控制三个HC595,分别驱动三个共阳数码管,显示预置的数字“123”,一直显示不正常,是哪里的原因?
以下是完整代码:
#include "AI8051U.H"
// 定义HC595控制引脚
sbit SDI = P2^0; // 对应HC595的14脚(DS)
sbit SCLK = P2^1; // 对应HC595的11脚(SH_CP)
sbit LOAD = P2^2; // 对应HC595的12脚(ST_CP)
// 共阳数码管段码表(0-9)
code unsigned char segTable[] = {
0xC0, // 0
0xF9, // 1
0xA4, // 2
0xB0, // 3
0x99, // 4
0x92, // 5
0x82, // 6
0xF8, // 7
0x80, // 8
0x90 // 9
};
// 要显示的数字
unsigned int count = 123;
// 延时函数(用于动态扫描)
void Delay(unsigned int ms)
{
unsigned int i, j;
for(i = 0; i < ms; i++)
for(j = 0; j < 120; j++); // 根据晶振调整
}
// 向HC595发送一个字节数据
void SendTo595(unsigned char dat)
{
unsigned char i;
for(i = 0; i < 8; i++)
{
SDI = dat & 0x80; // 发送最高位
SCLK = 0; // 上升沿移位
SCLK = 1;
dat <<= 1; // 左移一位
}
}
// 更新数码管显示
void UpdateDisplay()
{
unsigned char hundreds, tens, ones;
// 分解数字为百位、十位和个位
hundreds = count / 100;
tens = (count % 100) / 10;
ones = count % 10;
// 关闭LOAD,准备移位
LOAD = 0;
// 依次发送个位、十位、百位数据(低位在前)
SendTo595(segTable[ones]);
SendTo595(segTable[tens]);
SendTo595(segTable[hundreds]);
// 锁存数据到输出寄存器
LOAD = 1;
LOAD = 0;
}
void main()
{
// 配置P2口为推挽输出模式
P2M0 = 0x07; // P2.0-P2.2为推挽输出
P2M1 = 0x00;
// 初始化端口
P2 = 0xFF; // 默认高电平
while(1)
{
// 持续更新显示
UpdateDisplay();
// 添加短暂延时(可选)
Delay(1);
}
}
|