普中单片机动态显示多位数字错误显示
显示的是22085.#include <STC89C5xRC.H>
#include "INTRINS.H"
typedef unsigned char u8;
typedef unsigned int u16;
#define SMG_A_DP_PORT P0
u8 gsmg_code={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7C,0x39,0x5e,0x79,0x71};
void delay_1us(u16 n){
while(n--);
}
void displayDigit(unsigned char index,unsigned char digit){
// 清除指定位置的位,然后设置需要的位
P2 &= ~(0x01 << 2); // 先清除P2端口第2位
P2 |= (((index >> 0) & 0x01) << 2); // 根据index最低位设置P2端口第2位
P2 &= ~(0x01 << 3); // 清除P2端口第3位
P2 |= (((index >> 1) & 0x01) << 3); // 根据index次低位设置P2端口第3位
P2 &= ~(0x01 << 4); // 清除P2端口第4位
P2 |= (((index >> 2) & 0x01) << 4); // 根据index更高一位设置P2端口第4位
SMG_A_DP_PORT=gsmg_code;
delay_1us(300);
SMG_A_DP_PORT=0x00;
}
void setDisplay(u16 n){
unsigned char i=0;
while(n>=1){
//n=n%10;
displayDigit(i,n%10);
n=n/10;
i++;
}
}
void main(){
while(1){
setDisplay(2024102);
}
}
其实 setdisplay函数中displayDigit(i,n%10);是错误的。
通义的解释是
void setDisplay(u16 n) {
unsigned char digits = {0}; // 假设最多显示8位数字
int i = 0;
// 将数字分解成单个数字并保存
while (n > 0 && i < 8) {
digits = n % 10;
n /= 10;
}
// 从最高有效位到最低有效位显示数字
for (int j = i - 1; j >= 0; j--) {
displayDigit(7 - (i - 1 - j), digits); // 假设数码管从右到左编号0-7
// 如果数码管从左到右编号,则使用displayDigit(i - 1 - j, digits);
}
}
这段代码首先将输入的数字n拆解成单个数字并存储在数组digits中,
然后逆序遍历该数组,从最高位到最低位依次调用displayDigit函数进行显示。注意这里的7 - (i - 1 - j)是为了适配从右至左编号的数码管(0-7)。
如果数码管是从左到右编号,请相应地调整索引计算部分。这样就能正确显示如20241022这样的数字了。
问题是,通义也没有给出为什么要显示2014102,但是显示的是另外一个不想干的数字!
页:
[1]