presslife 2021-10-25 17:22 采纳率: 100%
浏览 44
已结题

请教51单片机设计问题 拨号系统改进问题

例如,我采用51单片机开发平台,实现模拟拨号,数位显示在 2 4 6 8数码管上,此时我该在if(KeyValue ==18)后增加怎样的延时函数,才能使我已经输入的四位数字,在8位数码管上自右向左滚动显示。请教

#include <reg52.h>
#define uchar unsigned char
#define uint  unsigned int
sbit we = P2^7;
sbit du = P2^6;
uchar KeyValue,temp,i,j,k,t;
uchar code leddata[]={ 
 
                0x3F,  //"0"
                0x06,  //"1"
                0x5B,  //"2"
                0x4F,  //"3"
                0x66,  //"4"
                0x6D,  //"5"
                0x7D,  //"6"
                0x07,  //"7"
                0x7F,  //"8"
                0x6F,  //"9"
                         };


extern unsigned char  ledbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char n;
extern unsigned char a[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
    
void delay(uint z)
{
    uint x,y;
    for(x = z; x > 0; x--)
        for(y = 114; y > 0 ; y--);
}

//检测20个按键的键盘扫描函数
void KeyScan()    //带返回值的子函数
{
    P3 = 0xf0;//判断哪一列被按下
    if(P3 != 0xf0)
    {
        delay(5);//软件消抖
        if( P3 != 0xf0)
        {
            switch(P3)
            {
                case 0xe0:    KeyValue = 0;    break;
                case 0xd0:    KeyValue = 1;    break;
                case 0xb0:    KeyValue = 2;    break;
                case 0x70:    KeyValue = 3;    break;
            }
            P3 = 0x0f;//判断哪一行被按下
            switch(P3)
            {
                case 0x0e:    KeyValue = KeyValue;    break;
                case 0x0d:    KeyValue += 4;    break;
                case 0x0b:    KeyValue += 8;    break;
                case 0x07:    KeyValue += 12;    break;
            }
            while(P3 != 0x0f);//松手检测
            if (a[0]!=0x00)
      {a[0]=0x00;a[1]=0x00;a[2]=0x00;a[3]=0x00;a[4]=0x00;a[5]=0x00;a[6]=0x00;a[7]=0x00;}
            
            a[0]=a[2];a[2]=a[4];a[4]=a[6];
            a[6]=leddata[KeyValue];

            
        }            
    }
    P3 = 0xff;//判断独立按键
    if(P3 != 0xff)
    {
        delay(5);//软件消抖
        if( P3 != 0xff)
        {
            switch(P3)
            {
                case 0xfe:    KeyValue = 16;    break;
                case 0xfd:    KeyValue = 17;    break;
                case 0xfb:    KeyValue = 18;    break;
                case 0xf7:    KeyValue = 19;    break;
            }
            while(P3 != 0xff);//松手检测
            if (KeyValue == 16)
            {
            a[6]=a[4];a[4]=a[2];a[2]=a[0];
            a[0]=0x00;
            }
            if (KeyValue == 19)
            {a[0]=0x00;a[1]=0x00;a[2]=0x00;a[3]=0x00;a[4]=0x00;a[5]=0x00;a[6]=0x00;a[7]=0x00;}
            if (KeyValue == 17)
            {
                temp=a[7];
                a[7]=a[0];a[0]=a[1];a[1]=a[2];a[2]=a[3];a[3]=a[4];a[4]=a[5];a[5]=a[6];a[6]=temp;
            }
                if(KeyValue ==18)
                {
                
                                

                }
        }    
    }    
}



void main()
{
    we = 1;//打开位选
    P0 = 0;//八位数码管全显示
    we = 0;//锁存位选

    du = 1;//打开段选端
    P0 = 0;

while(1)
    {
          KeyScan();
            P0 = ledbit[n];
            we = 1;//打开位选
            we = 0;    //关闭位选

            P0 = a[n];
            du = 1;    //打开段选
            du = 0;    //关闭段选
            delay(2);//延时
          if (n==0){n=8;}
            n--;
    }
}

  • 写回答

1条回答 默认 最新

  • qq_41851997 2021-10-25 18:51
    关注

    每个数码管对应申请一块缓存存放显示的数字,然后程序按照需要将需要显示的内容扔到对应的缓存里去显示
    然后所有数码管定时刷新,定义一个延时去执行刷新功能就行了。
    比如定义一个buf【8】对应8个数码管。显示1则将1赋值到buf【0】,显示12则将buf【0】赋值2,buf【1】赋值1,一次类推,就有滚动效果

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月4日
  • 已采纳回答 10月27日
  • 修改了问题 10月25日
  • 修改了问题 10月25日
  • 展开全部

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料