电子产业一站式赋能平台

PCB联盟网

搜索
查看: 4035|回复: 1
收起左侧

单片机C语言实例-164-矩阵键盘

[复制链接]
发表于 2022-1-28 17:18:42 | 显示全部楼层 |阅读模式
单片机C语言实例-164-矩阵键盘

/********************************************************************
* 文件名  : 矩阵键盘.c
* 描述    :  该文件实现了 4 * 4 键盘的试验。通过数码管的最后一位来显示
                         当前的按键值。                 
* 创建人  : 东流,2009年4月10日
* 版本号  : 2.0
*********************************************************************/
#include<reg51.h>
#include<intrins.h>

#define uint unsigned int
#define uchar unsigned char

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

/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)//1ms延时
{
        uchar x,j;
        for(j=0;j<i;j++)
        for(x=0;x<=148;x++);       
}


/********************************************************************
* 名称 : Keyscan()
* 功能 : 实现按键的读取。下面这个子程序是按处理 矩阵键盘 的基本方法处理的。
* 输入 : 无
* 输出 : 按键值
***********************************************************************/
uchar Keyscan(void)
{
        uchar i,j, temp, Buffer[4] = {0xfe, 0xfd, 0xfb, 0xf7};                        //让矩阵键盘的每行分别为低电平
        for(j=0; j<4; j++)
        {
                P1 = Buffer[j];
                temp = 0x10;                                                                                                                                                                    
                for(i=0; i<4; i++)
                {
                        if(!(P1 & temp))                 //判断P1口高4位某一行为低电平
                        {
                                return (i+j*4);                //返回键码
                        }
                        temp <<= 1;
                }       
        }
}

/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
        uchar Key_Value;  //读出的键值
        while(1)
        {
                P1 = 0xf0;                               
                if(P1 != 0xf0)                        //判断有无按键按下
                {
                        Delay_1ms(20);                //按键消抖
                        if(P1 != 0xf0)                //第二次判断有无按键按下
                        {
                                Delay_1ms(20);  //按键消抖
                                if(P1 != 0xf0)        //第三次判断有无按键按下
                                {
                                        Key_Value = Keyscan();               
                                }
                        }
                }
                P0 = table[Key_Value];
                P2 = 0x07;       
        }
}


更多详情参考附件文档
+08:00C429联盟网1954.png
游客,如果您要查看本帖隐藏内容请回复

回复

使用道具 举报

87

主题

3082

帖子

1万

积分

论坛元老

Rank: 7Rank: 7Rank: 7

积分
16671
发表于 2022-1-30 14:36:18 | 显示全部楼层
谢谢分享好资料
回复 支持 反对

使用道具 举报

发表回复

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

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表