gvwfdrlx 发表于 2025-9-7 19:27:18

关于数码管的程序问题

#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit dula=P2^0;sbit wela=P2^1;uchar num;uchar code table[]={0x3f,0x06,0x5b,0x4f,                   0x66,0x6d,0x7d,0x07,                   0x7f,0x6f,0x77,0x7c,                   0x39,0x5e,0x79,0x71};void delayms(uint);void main(){        wela=1;        P0=0x0f;        wela=0;        while(1)        {                for(num=15; num>=0; num--)                {                        dula=1;                  P0=table;                  dula=0;                  delayms(500);                }        }}void delayms(uint xms){        uint i,j;        for(i=xms; i>0; i--)                for(j=110; j>0; j--);} 学了一个用数组让数码管循环显示0-f的程序,原本的for循环语句是这样的:for(num=0; num<16; num++),我想让它从f-0显示,改了一下,用proteus仿真,发现数码管从F显示到0后就无显示了,而我的理解是它应该停在显示0这个字符上,我是这样理解的,当num减到0时,表达式等于0的条件一直成立,所以for就一直循环执行大括号里的程序,num等于0对应该数组里的字符是0x3f,对应数码管0,所以我认为应该一直显示0才对,但实际上并不是,所以这点我不能理解,还请各位大神给指点迷津,谢谢!

gvwfdrlx 发表于 2025-9-7 19:35:26

我改了一下,又发现一个问题,将for循环里的num参数改成16时,访真时发现数码管是从一个不是数字的乱码开始的,原本的0没有了,这个乱码是不是就是0?如果是0的话那这个程序为什么不是从F开始,而是从0呢,而且这个0还是显示错误的?

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^0;
sbit wela=P2^1;
uchar num;
uchar code table[]={0x3f,0x06,0x5b,0x4f,
                          0x66,0x6d,0x7d,0x07,
                          0x7f,0x6f,0x77,0x7c,
                          0x39,0x5e,0x79,0x71};
void delayms(uint);
void main()
{
        wela=1;
        P0=0x0f;
        wela=0;
        while(1)
        {
                for(num=16; num>0; num--)
                {
                        dula=1;
                  P0=table;
                  dula=0;
                  delayms(500);
                }
        }
}
void delayms(uint xms)
{
        uint i,j;
        for(i=xms; i>0; i--)
                for(j=110; j>0; j--);
}


DebugLab 发表于 2025-9-7 21:24:28

num=0时,num>=0也成立,uchar 0-1=255,溢出了,num>=0改成num>0
页: [1]
查看完整版本: 关于数码管的程序问题