单片机学习小组
直播中

刘桂英

7年用户 1134经验值
私信 关注

单片机按键实现的功能有哪些

单片机按键实现的功能有哪些?
怎样去编写矩阵按键的函数呢?

回帖(1)

宋宾

2022-2-23 10:29:03
如果你和我一样正在学习 微机原理。希望我写的东西对你有帮助。


实现的功能:
对应按键按下,仿真出对应波形。
只写了三个波形,不过按键有16个。

#include
#include
#define DAC0832 XBYTE[0XF7FF]
#define uint unsigned int
#define uchar unsigned char
unsigned char i, dat, flag = 1;
uint j = 0;
uchar line, row, kvalue, kscan;

// 延时消抖函数
// void delay() //T0
// {
//     TMOD = 0X01;
//     TH0 = (65536 - 20000) / 256;
//     TL0 = (65536 - 20000) % 256;
//     TR0 = 1;
//     do
//     {
//         /* code */
//     } while (!TF0);
//     TF0 = 0;
// }

void delay1ms(uint n) //粗略延时n ms
{
    uint m, h, k;
    for (k = n; k > 0; k--)
        for (m = 195; m > 0; m--)
            for (h = 4; h > 0; h--)
                ;
}
/*矩阵按键函数*/
// 键盘扫描法
uchar keyScanning()
{
    P1 = 0xf0;
    row = P1;
    if (row != 0xf0)
    {
        delay1ms(20);
        /* 粗扫描 */
        row = P1;
        if (row != 0xff)
        {
            /*按键确实被按下,开始细扫描*/
            line = 1;
            P1 = ~line;
            row = P1 & 0xf0;
            do
            {
                /* code */
                if (row == 0xf0)
                {
                    /*逐行取0,判断列的状态 */
                    line = line << 1;
                    if (line == 0x10)
                    {
                        /* 最后一行,无键 */ return 0xff;
                    }
                }
            } while (row == 0xf0);
            line = ~line & 0x0f;
            kscan = line | row;
            return kscan;
        }
    }
    return 0xff;
}

// 行列反转法
uchar keyRowLine()
{
    P1 = 0x0f;
    line = P1;
    if (line != 0x0f)
    {
        /* 判断行状态 */
        delay1ms(20);
        line = P1;
        if (line != 0x0f)
        {
            /* 有按键按下 */
            line = line & 0x0f;
            P1 = 0xf0;
            delay1ms(1); //等待变化时间
            row = P1;
            row = row & 0xf0;
            kscan = line | row;
            return kscan;
        }
    }
    return 0xff;
}

// 获得键编码
void getKeyVaule()
{
    uchar Kscan;
    // Kscan = keyScanning();
    Kscan = keyRowLine();
    switch (Kscan)
    {
    case 0xee:
        kvalue = 0;
        break;
    case 0xde:
        kvalue = 1;
        break;
    case 0xbe:
        kvalue = 2;
        break;
    case 0x7e:
        kvalue = 3;
        break;
    case 0xed:
        kvalue = 4;
        break;
    case 0xdd:
        kvalue = 5;
        break;
    case 0xbd:
        kvalue = 6;
        break;
    case 0x7d:
        kvalue = 7;
        break;
    case 0xeb:
        kvalue = 8;
        break;
    case 0xdb:
        kvalue = 9;
        break;
    case 0xbb:
        kvalue = 10;
        break;
    case 0x7b:
        kvalue = 11;
        break;
    case 0xe7:
        kvalue = 12;
        break;
    case 0xd7:
        kvalue = 13;
        break;
    case 0xb7:
        kvalue = 14;
        break;
    case 0x77:
        kvalue = 15;
        break;
    default:
        break;
    }
}
/*矩阵按键函数*/

// 按键函数,单个。
void key_board()
{
    P1 = 0xff;
    if (0xff != P1)
    {
        delay1ms(20);
        if (0xff != P1)
        {
            flag++;
        }
    }
    while (0xff != P1)
    {
        /* code */
    }
}
// 主函数
void main()
{
    TMOD = 0X10;
    EA = 1;
    ET1 = 1;
    TR1 = 1;
    while (1)
    {
        /* code */
    }
}
// 锯齿波
void sawtooth()
{
    TH1 = (65536 - 1000) / 256;
    TL1 = (65536 - 1000) % 256;
    DAC0832 = dat;
    dat++;
}
// 方波
void square()
{
    TH1 = (65536 - 2000) / 256;
    TL1 = (65536 - 2000) % 256;
    i++;
    if (i % 2)
    {
        dat = 0x00; //0v
    }
    else
    {
        dat = 0xcc; //4v
    }
    DAC0832 = dat;
}
// 三角波
void triangle()
{
    TH1 = (65536 - 500) / 256;
    TL1 = (65536 - 500) % 256;
    j++;
    if (j >= 0 && j < 0xff)
    {
        dat++;
    }
    else
    {
        dat--;
    }
    if (dat == 0)
    {
        j = 0;
    }
    DAC0832 = dat;
}
// 中断函数
void timer1() interrupt 3
{
    // key_board();
    getKeyVaule();
    if (kvalue == 0)
    {
        sawtooth();
    }
    else if (kvalue == 1)
    {
        square();
    }
    else if (kvalue == 2)
    {
        triangle();
    }
}



  • proteus连线图


举报

更多回帖

发帖
×
20
完善资料,
赚取积分