欢迎来到泰骏兴电子,大家有问题可以直接联系管理员QQ:233619809单片机 QQ群:59194556 各位游客也可以注册玩玩,享受更多权益。温馨提示:本网站仅提供平台学习以及渠道,一切后果自行承担,还望广大用户提高自我意识,请不要轻易相信他人,请不要轻易相信他人,请不要轻易相信他人。为了更好的管理论坛工作,所以现在使用邮箱注册,如果以前的邮箱不能修改的,请联系管理员代为修改

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 129|回复: 0

STC单片机矩阵键盘

[复制链接]
发表于 2022-12-11 11:54:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
/**************************************************************************************
*                      矩阵按键实验                                                  *
实现现象:下载程序后数码管显示0,按下矩阵按键上的按键显示对应的数字
            S1-S4:0-3
            S5-S8:4-7
            S9-S12:8-B
            S13-S16:C-F。
注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。                                                                                 
***************************************************************************************/

#include "reg52.h"             //此文件中定义了单片机的一些特殊功能寄存器

typedef unsigned int u16;      //对数据类型进行声明定义
typedef unsigned char u8;

#define GPIO_DIG P0
#define GPIO_KEY P1

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

u8 KeyValue;    //用来存放读取到的键值


u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                    0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值

/*******************************************************************************
* 函 数 名         : delay
* 函数功能           : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
    while(i--);   
}

/*******************************************************************************
* 函 数 名         : KeyDown
* 函数功能           : 检测有按键按下并读取键值
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void KeyDown(void)
{
    char a=0;
    GPIO_KEY=0x0f;
    if(GPIO_KEY!=0x0f)//读取按键是否按下
    {
        delay(1000);//延时10ms进行消抖
        if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
        {   
            //测试列
            GPIO_KEY=0X0F;
            switch(GPIO_KEY)
            {
                case(0X07):    KeyValue=0;break;
                case(0X0b):    KeyValue=1;break;
                case(0X0d): KeyValue=2;break;
                case(0X0e):    KeyValue=3;break;
            }
            //测试行
            GPIO_KEY=0XF0;
            switch(GPIO_KEY)
            {
                case(0X70):    KeyValue=KeyValue;break;
                case(0Xb0):    KeyValue=KeyValue+4;break;
                case(0Xd0): KeyValue=KeyValue+8;break;
                case(0Xe0):    KeyValue=KeyValue+12;break;
            }
            while((a<50)&&(GPIO_KEY!=0xf0))     //检测按键松手检测
            {
                delay(1000);
                a++;
            }
        }
    }
}


/*******************************************************************************
* 函 数 名       : main
* 函数功能         : 主函数
* 输    入       : 无
* 输    出         : 无
*******************************************************************************/
void main()
{   
    LSA=0; //给一个数码管提供位选
    LSB=0;
    LSC=0;
    while(1)
    {   
        KeyDown();           //按键判断函数
        GPIO_DIG=smgduan[KeyValue];      //
    }        
}


void key();
{
    uchar a;
    P1=0x0f;
    if(P1!=0x0f)
    {
        delayms(10);
        if(P1!=0x0f)
        {
            P1=0x0f;
            switch(P1)
            {
                case(0x07):key=0;break;
                case(0x0b):key=1;break;
                case(0x0d):key=2;break;
                case(0x0e):key=3;break;
            }
            P1=0xf0;
            switch(P1);
            {
                case(0x70):key=key;break;
                case(0x0b):key=key+4;break;
                case(0x0d):key=key+8;break;
                case(0x0e):key=key+12;break;
            }
            while((a<50)&&(P1!=0xf0))
            {
                a++;
            }
        }
    }
}


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

本版积分规则

QQ|手机版|泰骏兴电子科技有限公司 ( 粤ICP备2023060260号-1 ) 单片机爱好者

GMT+8, 2026-1-10 12:07

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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