【新手求助】数码管拖尾怎么消除

2019-07-16 02:55发布

本帖最后由 wnwnwn 于 2013-1-3 13:07 编辑

大家好,本人是纯新手,用单片机实验板运行下面这段程序,数码管相邻位总是出现前一位的阴影。大家帮忙看下这段程序问题出在哪里,功能很简单独立按键控制三个功能加1(P^0)、减1(P1^1)、清0(P1^2)。P0口连接数码管,P2^7是段选,P2^6是位选。



#include <reg52.h>
#include <intrins.h>

typedef unsigned char uchar;
typedef unsigned int uint;

uchar code DSY_CODE[] = {0xc0, 0xf9, 0xa4, 0xb0,
                                             0x99, 0x92, 0x82, 0xf8,
                                             0x80, 0x90, 0xff};
uchar Num_Buffer[] = {0, 0, 0};
uchar Key_Code, Key_Counts = 0;
sbit dula = P2^7;
sbit wela = P2^6;
void Show_Counts_ON_DSY(void);
void DelayMS(uint x);

void main(void)
{
        uchar i;
        P0 = 0xff;
        P1 = 0xff;
//        P2 = 0x00;
        Key_Code = 0xff;
        while (1){
                Show_Counts_ON_DSY();
                P1 = 0xff;
                Key_Code = P1;
                if (Key_Code != 0xff){
//                        DelayMS(10);  // 去抖动会产生数码管闪烁。
//                        if (Key_Code != 0xff){
                                while (P1 != 0xff)
                                        for (i = 0; i < 30; i++)
                                                Show_Counts_ON_DSY();
                }
                switch (Key_Code){
                        case 0xfe: if (Key_Counts < 255) Key_Counts++; break;
                        case 0xfd: if (Key_Counts > 0) Key_Counts--; break;
                        case 0xfb: Key_Counts = 0; break;
                }
                Key_Code = 0xff;
        }
}

void Show_Counts_ON_DSY(void)
{
        uchar i, j = 0xfe;
        Num_Buffer[2] = Key_Counts / 100;
        Num_Buffer[1] = Key_Counts / 10 % 10;
        Num_Buffer[0] = Key_Counts % 10;
        for (i = 0; i < 3; i++){
                P0 = 0x00;         //消隐
                j = _cror_(j, 1);
                P0 = j;
                wela = 1;
                wela = 0;
                P0 = ~DSY_CODE[Num_Buffer];
                dula = 1;
                dula = 0;
                DelayMS(8);       //扫描间隙延迟,太长会造成闪烁,太短会造成重影。就是这个延迟设成1ms拖影很明显,设成                                      10ms就会出现数码管闪烁,取8ms拖影小但还是存在。
        }
}

void DelayMS(uint x)
{
        uchar i;
        while (x--)
                for (i = 0; i < 110; i++);
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
loyou1993
1楼-- · 2019-07-16 04:01
本帖最后由 loyou1993 于 2013-1-3 13:03 编辑

段选清空!P0=0X00;DULA=1;DULA=0;这样才算是写入了!用的是573吧?

评分

参与人数 1积分 +5 收起 理由 zhihuizhou + 5 您的付出是论坛的动力,感谢您一直支持!.

查看全部评分

wnwnwn
2楼-- · 2019-07-16 07:08
loyou1993 发表于 2013-1-3 13:00
段选清空!P0=0X00;DULA=1;DULA=0;这样才算是写入了!用的是573吧?

对是用的573,我去试一下。
wnwnwn
3楼-- · 2019-07-16 10:45
loyou1993 发表于 2013-1-3 13:00
段选清空!P0=0X00;DULA=1;DULA=0;这样才算是写入了!用的是573吧?

问题解决了,谢谢您啦!
sirius08
4楼-- · 2019-07-16 12:20
 精彩回答 2  元偷偷看……
qq312448494
5楼-- · 2019-07-16 16:25
哇噢~一不小心,曾经困扰过的问题被解决了,嘿嘿。另外,在这里建议楼主,利用定时器来控制数码管显示的刷新比较好哦。
wnwnwn
6楼-- · 2019-07-16 21:17
qq312448494 发表于 2013-1-14 14:53
哇噢~一不小心,曾经困扰过的问题被解决了,嘿嘿。另外,在这里建议楼主,利用定时器来控制数码管显示的刷 ...

好的,谢谢您的建议,我刚开始学单片机,以后会多练习定时器滴!!

一周热门 更多>