如何通过矩阵键盘输入,然后在8位数码管上显示

2019-07-15 11:25发布

就是想计算器那样,我按一个键,然后数码管上特定的位就显示一个数字。大神们求教~~
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
4条回答
wulinwl
2019-07-15 16:46
//4*4矩阵键盘P3口检测程序,按下键后相应的代码显示在数码管上,行、列数显示在P1八个LED,蜂鸣器提示音。
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char

sbit dula=P2^6;                                                //数码管段选
sbit wela=P2^7;                                                //数码管位选
sbit Buzzer=P2^3;                                        //蜂鸣器端口
bit  Buzzer_sign=0;                                        //蜂鸣器使能标志
uchar temp;                                                        //临时变量
uchar key=16;                                                //初始键值,"-"
uchar code table[]={                                //0~F数组,共阳数码管
                0x3f,0x06,0x5b,0x4f,
                0x66,0x6d,0x7d,0x07,
                0x7f,0x6f,0x77,0x7c,
                0x39,0x5e,0x79,0x71,
                0x40,0x80};                                        //0x40,0x80为"-"、"."符号

void display(uchar num)                                //数码管显示程序
{
        P0=table[num];
        dula=1;
        dula=0;
        P0=0xc0;
        wela=1;
        wela=0;
}
/**********************************
        矩阵按键扫描程序
**********************************/
void key_scan()
{
        static bit sign0,sign1,sign2,sign3;                 //按键自锁标志变量                                  
        static uchar count0,count1,count2,count3;//消抖计数变量                       
/*扫描第一行键盘*/
        P3=0xfe;                                                //给P3赋值=1111 1110
        temp=P3;                                                //读取P3值赋于temp=XXXX 1110
        if(temp!=0xfe)                                        //如果temp!=0xfe第一行有键按下
        {
                count0++;                                        //消抖计数器自+1
                if(count0>=250)                                //计数值>=250
                {
                        count0=250;                                //计数值限制250
                        if(sign0==0)                        //如果自锁标志为0
                        {
                                sign0=1;                        //自锁标志置1
                                switch(temp)                //多分支输出键值
                                {
                                        case 0xee:key=0;break;
                                        case 0xde:key=1;break;
                                        case 0xbe:key=2;break;
                                        case 0x7e:key=3;break;
                                }
                                Buzzer_sign=1;                //蜂鸣器使能标志位置1
                                TR0 = 1;                        //启动定时器
                                P1=temp;                        //LED显示
                        }
                }
        }
        else
        {
                count0=0;                                        //消抖计数器清0
                sign0=0;                                        //自锁标志清0
        }
/*扫描第二行键盘*/
        P3=0xfd;
        temp=P3;
        if(temp!=0xfd)
        {
                count1++;
                if(count1>=250)
                {
                        count1=250;
                        if(sign1==0)
                        {
                                sign1=1;
                                switch(temp)
                                {
                                        case 0xed:key=4;break;
                                        case 0xdd:key=5;break;
                                        case 0xbd:key=6;break;
                                        case 0x7d:key=7;break;
                                }
                                Buzzer_sign=1;        //蜂鸣器使能标志位置1
                                TR0 = 1;                //启动定时器
                                P1=temp;                //LED显示
                        }
                }
        }
        else
        {
                count1=0;
                sign1=0;
        }
/*扫描第三行键盘*/
        P3=0xfb;
        temp=P3;
        if(temp!=0xfb)
        {
                count2++;
                if(count2>=250)
                {
                        count2=250;
                        if(sign2==0)
                        {
                                sign2=1;
                                switch(temp)
                                {
                                        case 0xeb:key=8;break;
                                        case 0xdb:key=9;break;
                                        case 0xbb:key=10;break;
                                        case 0x7b:key=11;break;
                                }
                                Buzzer_sign=1;        //蜂鸣器使能标志位置1
                                TR0 = 1;                //启动定时器
                                P1=temp;                //LED显示
                        }
                }
        }
        else
        {
                count2=0;
                sign2=0;
        }
/*扫描第四行键盘*/
        P3=0xf7;
        temp=P3;
        if(temp!=0xf7)
        {
                count3++;
                if(count3>=250)
                {
                        count3=250;
                        if(sign3==0)
                        {
                                sign3=1;
                                switch(temp)
                                {
                                        case 0xe7:key=12;break;
                                        case 0xd7:key=13;break;
                                        case 0xb7:key=14;break;
                                        case 0x77:key=15;break;
                                }
                                Buzzer_sign=1;        //蜂鸣器使能标志位置1
                                TR0 = 1;                //启动定时器
                                P1=temp;                //LED显示
                        }
                }
        }
        else
        {
                count3=0;
                sign3=0;
        }
}

/*****************************************
        定时器初始化程序
*****************************************/
void Timer0Init()                                //200微秒@11.0592MHz
{
        TMOD = 0x02;                                //设置定时器8位自动重载模式
        TL0  = 0x48;                                //设置定时初值
        TH0  = 0x48;                                //设置定时重载值
        EA=1;                                                //开总中断
        ET0=1;                                                //开定时器0中断       
}
void main()
{
        Timer0Init();                                //初始化定时器0
        Buzzer=1;                                        //初始化蜂鸣器端口
        Buzzer_sign=1;                                //蜂鸣器使能标志位置1,开机提示音
        dula=0;                                                //数码管段选0
        wela=0;                                                //数码管位选0
        while(1)
        {
                key_scan();                                //运行键盘扫描程序
                display(key);                        //运行数码管显示程序
        }
}

void timer0() interrupt        1                //中断服务程序(蜂鸣器震荡)
{
        static uint Cnt200us=0;                //变量Cnt200us
        if(Buzzer_sign==1)                        //如果蜂鸣器使能标志1
        {
                Cnt200us++;                                //定时器中断变量Cnt200us自+1
                Buzzer=~Buzzer;                        //蜂鸣器端口取反
                if(Cnt200us>=1000)                //检测中断的次数0.2秒
                {
                        Cnt200us=0;                        //计数清0       
                        Buzzer_sign=0;                //蜂鸣器使能标志清0                               
                        Buzzer=1;                        //蜂鸣器端口清0
                        TR0=0;                                //关闭定时器
                }
        }
}

一周热门 更多>