找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4048|回复: 4
收起左侧

如何保证按键控制数码管的稳定显示?

[复制链接]
ID:109813 发表于 2017-1-20 14:11 | 显示全部楼层 |阅读模式
PS:需要按一下按键加一或者减一,同时要保证数字的稳定显示(现在只能在没有松手检测的时候稳定显示)
#include <reg52.h>
#define uchar unsigned char
#define uint  unsigned int
sbit we = P1^1;
sbit du = P1^2;
sbit lcden = P3^4;
uchar num1 = 1, num3=1;
uint  num2=1;
uchar leddata[]={
                        0xC0,  //"0"
                        0xF9,  //"1"
                        0xA4,  //"2"
                        0xB0,  //"3"
                        0x99,  //"4"
                        0x92,  //"5"
                        0x82,  //"6"
                        0xF8,  //"7"
                        0x80,  //"8"
                        0x90,  //"9"        
                                       };

void delay(uint z);
void KeyScan();        //带返回值的子函数
void show_num_2bit();                          //2位数码管显示程序
void show_num_3bit_1();                          //第一个3位数码管显示程序
void show_num_3bit_2();                          //第二个3位数码管显示程序
void show_num();
/*------------------------------------------------*/
void main()
{        
               
                lcden = 0;                                                
        TMOD = 0x01;                                       
        TH0 = (65536 - 0)/256;
        TL0 = (65536 - 0)%256;
        EA = 1;
        ET0 = 1;
        TR0 = 1;
               
                while(1)
                {
                        show_num();
                }
        
}

/*------------------------------------------------*/

void Interrupt_T0()interrupt 1
{
        TH0 = (65536 - 0)/256;
        TL0 = (65536 - 0)%256;

               KeyScan();        
}

void delay(uint z)
{
        uint x,y;
        for(x = z; x > 0; x--)
                for(y = 114; y > 0 ; y--);
}


void KeyScan()        //带返回值的子函数
{
        uchar cord_l,cord_h;//声明列线和行线的值的储存变量
        P2 = 0xf8;//1111 0000
        if( (P2 & 0xf8) != 0xf8)//判断是否有按键按下
        {
                delay(5);//软件消抖
                if( (P2 & 0xf8) != 0xf8)//判断是否有按键按下
                {
                          cord_l = P2 & 0xf8;// 储存列线值
                          P2 = cord_l | 0x07;
                          cord_h = P2 & 0x7;// 储存行线值
                        
                         switch( cord_l + cord_h )
                         {
                                         //第一行键值码         控制二位数码管
                                        case 0xf6: if(num1>=0&&num1<=98) num1++; break;                         //+1
                                        case 0xee: if(num1>=1&&num1<=99) num1--; break;                         //-1
                                        case 0xde:                 break;
                                        case 0xbe:                 break;
                                        case 0x7e:                 break;
                                       
                                        //第二行键值码         控制第一个三位数码管
                                        case 0xf5: if(num2>=1&&num2<=199) num2++; break;                         //+1
                                        case 0xed: if(num2>=2&&num2<=200) num2--; break;                         //-1
                                        case 0xdd:                 break;
                                        case 0xbd:                 break;
                                        case 0x7d:                 break;
                        
                        
                                        //第三行键值码         控制第二个三位数码管
                                        case 0xf3: if(num3>=1&&num3<=199) num3++; break;                         //+1
                                        case 0xeb: if(num3>=2&&num3<=200) num3--; break;                         //-1
                                        case 0xdb:         break;
                                        case 0xbb:         break;
                                        case 0x7b:         break;
               
                                
                         }        
                }
               
        }
               
}

void show_num_2bit()                          //2位数码管显示程序
{
        uchar ge, shi;
        shi =num1/10;
        ge =num1%10;         

        P0 = 0x01;                                                                 //十位显示
        we = 1;
        we = 0;

          if(shi==0)
                {
                        P0 = 0xFF;
                        du=1;
                        du=0;
                        delay(2);
                }
        else if(shi!=0)
                {
                        P0 = leddata[shi];
                        du=1;
                        du=0;
                        delay(2);
                }

        P0 = 0x02;                                                          //个位显示
        we = 1;
        we = 0;
        
        P0 = leddata[ge];
        du=1;
        du=0;
        delay(2);
                 
}

void show_num_3bit_1()                          //第一个3位数码管显示程序
{
        uchar ge, shi, bai;
        bai =num2/100;
        shi =num2%100/10;
        ge =num2%10;         
               
        P0 = 0x04;                                                //百位显示
        we = 1;
        we = 0;

          if(bai==0)
                {
                        P0 = 0xFF;
                        du=1;
                        du=0;
                        delay(2);
                }
        else if(bai!=0)
                {
                        P0 = leddata[bai];
                        du=1;
                        du=0;
                        delay(2);
                }

        P0 = 0x08;                                                                 //十位显示
        we = 1;
        we = 0;

          if(shi==0&&bai==0)
                {
                        P0 = 0xFF;
                        du=1;
                        du=0;
                        delay(2);
                }
        else if(shi!=0||bai!=0)
                {
                        P0 = leddata[shi];
                        du=1;
                        du=0;
                        delay(2);
                }

        P0 = 0x10;                                                          //个位显示
        we = 1;
        we = 0;
        
        P0 = leddata[ge];
        du=1;
        du=0;
        delay(2);
                 
}

void show_num_3bit_2()                          //第二个3位数码管显示程序
{
        uchar ge, shi, bai;
        bai =num3/100;
        shi =num3%100/10;
        ge =num3%10;         
               
        P0 = 0x20;                                                //百位显示
        we = 1;
        we = 0;

          if(bai==0)
                {
                        P0 = 0xFF;
                        du=1;
                        du=0;
                        delay(2);
                }
        else if(bai!=0)
                {
                        P0 = leddata[bai];
                        du=1;
                        du=0;
                        delay(2);
                }

        P0 = 0x40;                                                                 //十位显示
        we = 1;
        we = 0;

          if(shi==0&&bai==0)
                {
                        P0 = 0xFF;
                        du=1;
                        du=0;
                        delay(2);
                }
        else if(shi!=0||bai!=0)
                {
                        P0 = leddata[shi];
                        du=1;
                        du=0;
                        delay(2);
                }

        P0 = 0x80;                                                          //个位显示
        we = 1;
        we = 0;
        
        P0 = leddata[ge];
        du=1;
        du=0;
        delay(2);
                 
}

void show_num()
{
                show_num_2bit();
                show_num_3bit_1();
                show_num_3bit_2();
}
回复

使用道具 举报

ID:111634 发表于 2017-1-21 12:56 | 显示全部楼层
“按键加一或者减一,同时要保证数字的稳定显示"  只要程序斜对了,自然能达到目的。
回复

使用道具 举报

ID:162736 发表于 2017-1-22 17:27 | 显示全部楼层
消抖的延迟时间短了,通常要在20ms左右
回复

使用道具 举报

ID:154786 发表于 2017-1-22 21:01 | 显示全部楼层
那就说明你程序写的大部分是正确的,但消抖和延时要注意下
回复

使用道具 举报

ID:153041 发表于 2017-1-23 12:55 | 显示全部楼层
这个程序没有看到按键释放检测部分,我猜是按键释放检测时(当一直按住按钮的时候,程序一直在检测按键释放的循环里,无法退出中断,当然也就没办法再去扫数码管了,相当于显示扫描被暂时停止了);; 建议:把显示数码管的代码放到定时器中断里,把按键扫描放在主程序里,换个位置。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表