找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2208|回复: 1
打印 上一主题 下一主题
收起左侧

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)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:366752 发表于 2018-7-8 02:27 来自触屏版 | 只看该作者
谢谢分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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