yzhkpli 发表于 2025-2-5 14:42:44

普中单片机动态显示多位数字错误显示

显示的是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]
查看完整版本: 普中单片机动态显示多位数字错误显示