找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于单片机矩阵键盘控制16路led

[复制链接]
跳转到指定楼层
楼主
400黑币

研究了好几天研究不出来,自己0基础想研究呢,看了教程程序也写上就是实现不了, 运行环境就是5V+ -开关控制通路 cd4067想通过矩阵按键控制16路接通某一路,或者加上一个cd4067
就是矩阵按键控制两条路同时接通。

求大神指导一下

最佳答案

查看完整内容

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

使用道具 举报

沙发
ID:332444 发表于 2021-12-23 13:42 | 只看该作者
看我帖子里面
回复

使用道具 举报

板凳
ID:994989 发表于 2021-12-23 13:44 | 只看该作者
单刀16掷开关4067,矩阵键盘1-16按键,按下对应的键位通对应的通路
回复

使用道具 举报

地板
ID:301191 发表于 2021-12-27 04:47 | 只看该作者
顶一下
回复

使用道具 举报

5#
ID:332444 发表于 2021-12-27 06:03 | 只看该作者
太简单了以致于都不想回复,16个按键值对应16个LED亮,看我博客矩阵键盘定义的值为0-15,把0-15+1送给P2的端口,不过电路图引脚接法要改一下,X0-3要对应P20-3,电路图只接2个引脚是不够的。
回复

使用道具 举报

6#
ID:332444 发表于 2021-12-27 07:20 | 只看该作者

太简单了以致于都不想回复,16个按键值对应16个LED亮,看我博客矩阵键盘定义的值为0-15,把0-15+1送给P2的端口,不过电路图引脚接法要改一下,X0-3要对应P20-3,电路图只接2个引脚是不够的。如果亮相反的话,可以把值取反送P2。
回复

使用道具 举报

7#
ID:965189 发表于 2021-12-27 09:01 | 只看该作者
一个按键对应一个LED,这是最简单的程序。
回复

使用道具 举报

8#
ID:303778 发表于 2021-12-27 09:28 | 只看该作者
两条一个数组
回复

使用道具 举报

9#
ID:993066 发表于 2021-12-27 10:21 | 只看该作者
,真是太简单。。。给你一个例子自己看看吧
                                                                                  
**************************************************************************************

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

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

#define GPIO_DIG P0
#define GPIO_KEY P1


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


u8 code smgduan[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
                                        0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//显示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(100);
                a++;
        }
}


/*******************************************************************************
* 函 数 名       : main
* 函数功能                 : 主函数
* 输    入       : 无
* 输    出             : 无
*******************************************************************************/
void main()
{       

        while(1)
        {       
                KeyDown();                   //按键判断函数
                GPIO_DIG=~smgduan[KeyValue];          //
        }               
}
回复

使用道具 举报

10#
ID:57657 发表于 2021-12-27 10:45 | 只看该作者
你的程序是否需要识别多按键同时按下? 加了4067就不行了。
回复

使用道具 举报

11#
ID:332444 发表于 2021-12-27 12:52 | 只看该作者



回复

使用道具 举报

12#
ID:213173 发表于 2021-12-27 22:32 | 只看该作者
楼主这个电路没有多少实际意义。矩阵键盘通过MCU直接控制16个端口驱动LED更合理。不过用这个方式练练手也未尝不可。给你一个示例参考。

  1. #include <reg51.H>
  2. #define uint unsigned int                 //宏定义无符号整型数据
  3. #define uchar unsigned char         //宏定义无符号字符型数据

  4. uchar key=16;                                        //定义键值全局变量

  5. void keyscan()                                        //按键扫描程序
  6. {
  7.         static bit sign=0;                        //按键自锁标志
  8.         static uint count=0;                //消抖计数变量                       
  9.         uchar num=0;                                //临时变量
  10.         P1=0xf0;                                        //赋值P1 1111 0000
  11.         if(P1!=0xf0)                                //检测有按键按下
  12.         {
  13.                 count++;                                //消抖计数
  14.                 if((count>=250)&&(sign==0))        //100~1000,根据主循环周期调整约10~20ms
  15.                 {                       
  16.                         sign=1;                                //按键自锁标志置1
  17.                         num=P1;                                //保存P1值xxxx 0000,x为0或1
  18.                         num|=0x0f;                        //保存num按位或0x0f值xxxx 1111
  19.                         P1=num;                                //赋值P1 xxxx 1111
  20.                         switch(P1)
  21.                         {
  22.                                 case 0xee: key= 0; break;
  23.                                 case 0xde: key= 1; break;
  24.                                 case 0xbe: key= 2; break;
  25.                                 case 0x7e: key= 3; break;
  26.                                 case 0xed: key= 4; break;
  27.                                 case 0xdd: key= 5; break;
  28.                                 case 0xbd: key= 6; break;
  29.                                 case 0x7d: key= 7; break;
  30.                                 case 0xeb: key= 8; break;
  31.                                 case 0xdb: key= 9; break;
  32.                                 case 0xbb: key=10; break;
  33.                                 case 0x7b: key=11; break;
  34.                                 case 0xe7: key=12; break;
  35.                                 case 0xd7: key=13; break;
  36.                                 case 0xb7: key=14; break;
  37.                                 case 0x77: key=15; break;
  38.                         }
  39.                 }
  40.         }
  41.         else                                                //键抬起
  42.         {
  43.                 sign=0;                                        //按键自锁标志清0
  44.                 count=0;                                //消抖计数清0
  45.         }
  46. }

  47. void main()                                                //主函数
  48. {
  49.         while(1)
  50.         {
  51.                 keyscan();                                //按键扫描程序
  52.                 if(key==16)
  53.                         P2=0x40;                                //灯全灭
  54.                 else P2=0xb0|key;                //按键值点亮
  55.         }
  56. }
复制代码




评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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