| 
				打卡等级:以坛为家I打卡总天数:283最近打卡:2025-10-31 07:26:30 金牌会员 
 
 
	积分1659 
 | 
 
| 显示的是22085. 
 #include <STC89C5xRC.H>
 #include "INTRINS.H"
 
 typedef unsigned char u8;
 typedef unsigned int u16;
 
 #define SMG_A_DP_PORT P0
 
 u8 gsmg_code[17]={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[digit];
 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[8] = {0}; // 假设最多显示8位数字
 int i = 0;
 
 // 将数字分解成单个数字并保存
 while (n > 0 && i < 8) {
 digits[i++] = n % 10;
 n /= 10;
 }
 
 // 从最高有效位到最低有效位显示数字
 for (int j = i - 1; j >= 0; j--) {
 displayDigit(7 - (i - 1 - j), digits[j]); // 假设数码管从右到左编号0-7
 // 如果数码管从左到右编号,则使用displayDigit(i - 1 - j, digits[j]);
 }
 }
 这段代码首先将输入的数字n拆解成单个数字并存储在数组digits中,
 然后逆序遍历该数组,从最高位到最低位依次调用displayDigit函数进行显示。注意这里的7 - (i - 1 - j)是为了适配从右至左编号的数码管(0-7)。
 如果数码管是从左到右编号,请相应地调整索引计算部分。这样就能正确显示如20241022这样的数字了。
 
 
 
 问题是,通义也没有给出为什么要显示2014102,但是显示的是另外一个不想干的数字!
 
 
 
 | 
 |