标题: 51单片机按键的几种驱动方法 以蓝桥杯的单片机板子作为参考 [打印本页]

作者: sinply    时间: 2018-7-5 14:56
标题: 51单片机按键的几种驱动方法 以蓝桥杯的单片机板子作为参考
这里以蓝桥杯的单片机板子作为参考
法一:查询方式
    只要查询其引脚电平是否发生变化,就可以判断按键是否被按下。


其具体的实现函数为:
//按键扫描函数
uchar key_scan(void)
{
        uchar key;
        P3 &= 0x0F;
        switch (P3)
        {
                case 0x0E:
                        key = 7;
                        break;
                case 0x0D:
                        key = 6;
                        break;
                case 0x0B:
                        key = 5;
                        break;
                case 0x07:
                        key = 4;
                        break;
                default:
                        key = 0x0F;        
                        break;
        }
        return key;
}

void key_action(void)
{
        uchar key;
        key = key_scan();
        if(key != 0x0F)
        {
                delay_ms(10);
                key = key_scan();
                if(key != 0x0F)
                {
                        switch(key)
                        {
                                case 7:
                                        led_on();
                                        break;
                                case 6:
                                        led_off();
                                        break;
                                case 5:
                                        relay_on();
                                        break;
                                case 4:
                                        relay_off();
                                        break;
                                default:
                                        break;
                        }
                        while(P3 != 0x0F);
                }
               
        }
}

法二:中断方式
    中断方式的区别在于对改端口的引脚变化进行实时检测,从而及时地判断引脚是否被按下。
其具体的实现函数为:
void int0_handler(void) interrupt 1
{
        static ms_count = 0;
        if(++ms_count == 10)                //10ms进行按键检测
        {
                ms_count = 0;
                key_flag = 1;
        }
        display();
}

void key_check(void)
{
        uchar key = 0;
        static bit key_ready = 0;                //按键数据存储完毕标志位
        static uchar key_save = 0;                //保存键值
        static uchar key_time = 0;                //记录按键的次数
        if(key = key_scan())
        {
                key_time ++;
                if(key_time == KEY_LAST)
                {
                        key_time = 0;
                        key_ready = 1;
                        key_save = key;
                }
        }
        else if(!(key_scan()) && (key_ready == 1))        //wait for key up
        {
                key_ready = 0;
                key_action(key_save);
        }
}

具体工程情况详见附件。

7.int_control_display.zip (35.55 KB, 下载次数: 7) 3.key.zip (29.64 KB, 下载次数: 5)


作者: zhd000    时间: 2018-7-8 02:27
谢谢分享




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1