86爆缸 发表于 2022-10-23 12:15 试了下还是不行,我想我这个应该是定义的变量多了,扫描时间又短,段选位选多个变量造成的乱码? |
wulin 发表于 2022-10-23 08:22 我找到我代码的问题了,位选赋值那的if语句用错了,输出结果就是6个数码管流水灯亮,然后同时每个数码管都赋值6,5,4,3,2,1;难怪我这都是乱码了 |
wulin 发表于 2022-10-23 08:22 大佬你的代码我能看懂没问题,但我自己的代码试了下延长扫描周期,但就是没法显示和你一样的效果; 找不到我的代码错在哪里了 |
wulin 发表于 2022-10-23 08:22 谢谢大佬,你的代码写的很漂亮,我定义的变量还是多了; 不过消影应该是P0=0xff,我这个是共阴极数码管; 同时我试了下用不用消影的区别,数码管显示都正常,没有乱码 |
zhxiufan 发表于 2022-10-23 09:06 先位码后段码的话,段码未赋初值,当dula=1的时候,P0还是位选的数据,会先出现乱码吧,所以我才先段码后位码的 |
定时器定时时间太短,将500改为2000到5000之间。另外显示应该先位码再段码 |
86爆缸 发表于 2022-10-22 22:15 用位消隐和段消隐都一样有效,楼主用500us周期扫描速度太快,削弱了消隐效果。通常扫描一轮不低于20ms不会看出闪烁。一般每个数码管显示1ms,6ms完成一轮扫描为宜。 ![]() 代码修改如下:
|
lkc8210 发表于 2022-10-22 20:29 num=0; numdu--; wela=1; P0=0xff; wela=0; if(numdu==0) numdu=8; dula=1;//送段选数据 P0=table[numdu];//赋值6,5,4,3,2,1显示 dula=0; //P0=0xff;//消影 wela=1;//送位选数据 P0=numwe; numwe=_crol_(numwe,1);//循环左移1位,使6个数码管轮流显示 wela=0; if(numwe==0xbf) numwe=0xfe; |
P0=0xFF;消影消了个寂 正确写法该是 wela=1 P0=0xff wela=0 dula=1 P0=table dula=0 wela=1 P0=numwe wela=0 |
上面是郭天祥老师的解法 |
/*******************************************************************/ /* TX-1C单片机实验板实验例程 */ /*******************************************************************/ /* 利用动态扫描方法在六位数码管上显示出稳定的654321. 时钟频率为11.0592M */ /*********************************************************/ #include<reg52.h> //52单片机头文件 #include <intrins.h> //包含有左右循环移位子函数的库 #define uint unsigned int //宏定义 #define uchar unsigned char //宏定义 sbit dula=P2^6; //数码管段选锁存端 sbit wela=P2^7; ////数码管位选锁存端 uchar code table[]={ //数码管显示编码 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void display(uchar,uchar,uchar,uchar,uchar,uchar); //函数声明 void delay(uint); void main() { while(1) { display(6,5,4,3,2,1); //始终显示 } } void display(uchar one,uchar two,uchar three,uchar four,uchar five,uchar six) { dula=1; P0=table[one]; //送段数据 dula=0; P0=0xff; //送位数据前关闭所有显示,防止打开位选锁存后段选数据通过位选锁存器 wela=1; P0=0xfe; wela=0; delay(1); dula=1; P0=table[two]; dula=0; P0=0xff; wela=1; P0=0xfd; wela=0; delay(1); dula=1; P0=table[three]; dula=0; P0=0xff; wela=1; P0=0xfb; wela=0; delay(1); dula=1; P0=table[four]; dula=0; P0=0xff; wela=1; P0=0xf7; wela=0; delay(1); dula=1; P0=table[five]; dula=0; P0=0xff; wela=1; P0=0xef; wela=0; delay(1); dula=1; P0=table[six]; dula=0; P0=0xff; wela=1; P0=0xdf; wela=0; delay(1); } void delay(uint z) //延时子函数 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } |
一事无成 发表于 2022-10-22 18:52 芯片是89C52RC;P0=table[numdu]这我就是想不明白哪里出错了;中断程序设置的是5ms,来达到数码管动态显示的目的; 这个是郭天祥10天入门单片机里的例题,这个出错的是我的解法 |
讲真看不懂你的中断程序,这个num有啥用?还有P0=table[numdu];中的numdu确定是在1-6之间循环?另外把驱动芯片型号发一下。 |