0
问答首页 最新问题 热门问题 等待回答标签广场
我要提问

单片机

单片机矩阵键盘新手问题

#include

#define GPIO_DIG P0

#define GPIO_KEY P1

sbit LSA=P2^2;

sbit LSB=P2^3;

sbit LSC=P2^4;

unsigned char code DIG_CODE[17]={

0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码

unsigned char KeyValue;

//用来存放读取到的键值

void Delay10ms();   //延时10ms

void KeyDown();                 //检测按键函数

void main(void)

{

        LSA=0; //给一个数码管提供位选

        LSB=0;

        LSC=0;

        while(1)

        {

                KeyDown();

                GPIO_DIG=DIG_CODE[KeyValue];

        }                                

}

void KeyDown(void)

{

        char a=0;

        GPIO_KEY=0x0f;

        if(GPIO_KEY!=0x0f)//读取按键是否按下

        {

                Delay10ms();//延时10ms进行消抖

                if(GPIO_KEY!=0x0f)//再次检测键盘是否按下

                {

                        

                        //测试列

                        GPIO_KEY=0X0F;

                        switch(GPIO_KEY)

                        {

                                case(0X07):        KeyValue=0;break;

                                case(0X0b):        KeyValue=1;break;

                                case(0X0d): KeyValue=2;break;

                                case(0X0e):        KeyValue=3;break;

                        }

                        //测试行

                        GPIO_KEY=0XF0;

                        switch(GPIO_KEY)

                        {

                                case(0X70):        KeyValue=KeyValue;break;

                                case(0Xb0):        KeyValue=KeyValue+4;break;

                                case(0Xd0): KeyValue=KeyValue+8;break;

                                case(0Xe0):        KeyValue=KeyValue+12;break;

                        }

                        while((a<50)&&(GPIO_KEY!=0xf0))         //检测按键松手检测

                        {

                                Delay10ms();

                                a++;

                        }

                }

        }

}

void Delay10ms(void)   //误差 0us

{

    unsigned char a,b,c;

    for(c=1;c>0;c--)

        for(b=38;b>0;b--)

            for(a=130;a>0;a--);

}

为什么测试列的时候还要重新赋值GPIO_KEY=0X0F,不是已经在char a=0;后赋值GPIO_KEY=0x0f;那为什么还要测试列的时候赋值GPIO_KEY=0X0F

提问者:lksmcd 地点:- 浏览次数:7304 提问时间:10-22 16:33
我有更好的答案
提 交
1条回答
建企商务服务 09-22 07:57
如果你没有这一步的话,,当你第一次按下按键的情况下,程序会在if中一直运行,你再按键都没反应,但当你有这一步是,就不会出现这种情况
撰写答案
提 交
1 / 3
1 / 3
相关单片机
具有音调控制的单片机立体声前置放大器
用于单片机与电子装置中的开关电源
单片机软硬件复位的条件都有啥
电动机的单片机控制
单片机应用系统开发实例导航