资源简介

用有限状态机思想实现矩阵按键扫描,初学者做实验可参考,写的很好,51单片机矩阵按键控制实验51单片机矩阵按键控制实验51单片机矩阵按键控制实验

资源截图

代码片段和文件信息

// 尝试利用有限状态机思想完成行列矩阵键盘的扫描。
#include 

#define uchar unsigned char
#define uint unsigned int
#define key_state0 0 //状态0,此时无按键按下
#define key_state1 1 //状态1,此时处于确定按键是否按下
#define key_state2 2 //状态2,此时判断按键是否释放

sbit dula = P2 ^ 6;
sbit wela = P2 ^ 7;

code uchar codenum[] = {
    0x3f 0x06 0x5b 0x4f
    0x66 0x6d 0x7d 0x07
    0x7f 0x6f 0x77 0x7c
    0x39 0x5e 0x79 0x71
    0x00};

uint flag = 0; //按键扫描标志,每中断一次,扫描一次

void Display_init()
{
    P0 = 0x00; //将所有的位选打开,所有数码管同时亮,
    wela = 1;
    wela = 0;
    P0 = 0x00; //将段选关闭,也就是刚开始的时候数码管都不亮
    dula = 1;
    dula = 0;
}

void Display(uchar num1)
{
    dula = 1;
    P0 = codenum[num1];
    dula = 0;
}

uchar Keyscan()
{
    uchar key_state; //状态指示
    uchar key_value; //键值返回
    uchar key_temp;
    uchar key1 key2;

    P3 = 0xf0;
    key1 = P3;
    key1 = P3 & 0xf0; //确定哪一行的按键按下
    P3 = 0x0f;
    key2 = P3;
    key2 = P3 & 0x0f;       //确定哪一列的按键按下
    key_temp = key1 | key2; //确定按键位置

    switch (key_state) //检测当前状态
    {
    case key_state0:          //之前无按键被按下
        if (key_temp != 0xff) //说明有按键按下或者抖动
        {
            key_state = key_state1; //转换为状态1,然后去判断是否真的按下
        }
        break;

    case key_state1:          //状态1,说明之前已经有按键按下或者抖动
        if (key_temp == 0xff) //全为高电平,说明是抖动
        {
            key_state = key_state0; //返回到状态1,
        }
        else //确实有按键被按下
        {
            switch (key_temp) //当确定按键按下后,列举所有的按键情况
            {
            case 0xee:
                key_value = 0;
                break;
            case 0xde:
                key_value = 1;
                break;
            case 0xbe:
                key_value = 2;
                break;
            case 0x7e:
                key_valu

评论

共有 条评论