蓝桥杯单片机比赛矩阵键盘的基本使用方法

如果我的文章帮助到你了,希望给我点赞,加关注哦,你的阅读就是我最大的写作动力。

#include
typedef unsigned char uchar;
typedef unsigned int uint;
#define temp P3
sfr P4=0xc0;
sbit P42=P4^2;
sbit P44=P4^4;
uchar code table[]={0xc0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0Xbf,0XFF};  //0xbf  -   0xff   熄灭  下标为11
uchar disbuff[]={11,11,11,11,11,11,11,11};
uchar discom;
uchar key_value;
uint counter;
void key_process();
void display();
void delay(uint i);
void Timer1Init(void);
void allinit();
void main()
{
    allinit();
    Timer1Init();
    while(1)
    {
        key_process();
    }
}
void Timer1Init(void)        //2毫秒@11.0592MHz
{
    TMOD|=0x20;
    TH0=(65536-1000)/256;
    TL0=(65536-1000)%256;
    EA=1;
    ET1=1;
    TR1=1;
}
void timer1() interrupt 3
{
    if(++counter==2)
    {
        counter=0;              //2ms
        display();
    } 
}
void display()
{

    disbuff[6]=key_value/10;
    disbuff[7]=key_value%10;
    P2=((P2&0X1f)|0xe0);
    P0=0xff;
    P2&=0x1f;

    P2=((P2&0x1f)|0xc0);
    P0=1<     P2&=0x1f;

    P2=((P2&=0X1F)|0XE0);
    P0=table[disbuff[discom]];
    P2&=0x1f;

    if(++discom==8) discom=0;
}
void delay(uint i)
{
    while(i--);
}

void key_process()
{
    temp=0x0f;P44=0;P42=0;
    if(temp!=0x0f)
    {
        delay(1000);
        if(temp!=0x0f)
        {
            switch(temp)
            {
                case (0x0e):key_value=0;break;
                case (0x0d):key_value=4;break;
                case (0x0b):key_value=8;break;
                case (0x07):key_value=12;break;
            }
            temp=0xf0;P44=1;P42=1;
            if(P44==0)
            {
                key_value+=0;while(!P44);
            }
            if(P42==0)
            {
                key_value+=1;while(!P42);
            } 
            if(temp==0xd0)
            {
                key_value+=2;while(temp==0xd0);
            }
            if(temp==0xe0)
            {
                key_value+=3;while(temp==0xe0);
            }
        }
    }
}
void allinit()
{
    P2=0XA0;
    P0=0X00;//关闭蜂鸣器,继电器
    
    P2=0X80;
    P0=0XFF;//关闭LED灯
    
    P2=0XC0;
    P0=0XFF;//选择所有数码管
    P2=0XFF;
}

该代码涉及到了矩阵键盘和数码管的使用:

另外还告诉大家一个数码管代码调试技巧:

解决重影的办法:

1.显示前先将所有数码管熄灭,然后再显示。
2.除了显示数码外,其他时间都是熄灭的。
3.检查是否存在交替显示不同数字。
4.扫描速度要足够快。
闪烁:

如果停留时间太长的话,也就意味着暗的时间太长,人眼没能将亮暗的变化连续起来。就像拍摄电影,如果帧数较少的时候,在激烈动作的时候会出现跳帧。换个例子,就像本来每秒24帧的静态图片可以在人眼中形成连续的画面,你从中间抽取10帧画面,还在一秒内重放这些画面,就会感觉到闪烁。

链接:https://pan.baidu.com/s/1mV9t3hQQQs3deC-HNf1Lpg 
提取码:gs9p 


 

你可能感兴趣的:(单片机开发)