找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3259|回復(fù): 11
打印 上一主題 下一主題
收起左側(cè)

關(guān)于單片機(jī)矩陣鍵盤控制16路led

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:994989 發(fā)表于 2021-12-23 13:42 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
400黑幣

研究了好幾天研究不出來,自己0基礎(chǔ)想研究呢,看了教程程序也寫上就是實(shí)現(xiàn)不了, 運(yùn)行環(huán)境就是5V+ -開關(guān)控制通路 cd4067想通過矩陣按鍵控制16路接通某一路,或者加上一個(gè)cd4067
就是矩陣按鍵控制兩條路同時(shí)接通。

求大神指導(dǎo)一下

最佳答案

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:332444 發(fā)表于 2021-12-23 13:42 | 只看該作者
看我帖子里面
回復(fù)

使用道具 舉報(bào)

板凳
ID:994989 發(fā)表于 2021-12-23 13:44 | 只看該作者
單刀16擲開關(guān)4067,矩陣鍵盤1-16按鍵,按下對(duì)應(yīng)的鍵位通對(duì)應(yīng)的通路
回復(fù)

使用道具 舉報(bào)

地板
ID:301191 發(fā)表于 2021-12-27 04:47 | 只看該作者
頂一下
回復(fù)

使用道具 舉報(bào)

5#
ID:332444 發(fā)表于 2021-12-27 06:03 | 只看該作者
太簡單了以致于都不想回復(fù),16個(gè)按鍵值對(duì)應(yīng)16個(gè)LED亮,看我博客矩陣鍵盤定義的值為0-15,把0-15+1送給P2的端口,不過電路圖引腳接法要改一下,X0-3要對(duì)應(yīng)P20-3,電路圖只接2個(gè)引腳是不夠的。
回復(fù)

使用道具 舉報(bào)

6#
ID:332444 發(fā)表于 2021-12-27 07:20 | 只看該作者

太簡單了以致于都不想回復(fù),16個(gè)按鍵值對(duì)應(yīng)16個(gè)LED亮,看我博客矩陣鍵盤定義的值為0-15,把0-15+1送給P2的端口,不過電路圖引腳接法要改一下,X0-3要對(duì)應(yīng)P20-3,電路圖只接2個(gè)引腳是不夠的。如果亮相反的話,可以把值取反送P2。
回復(fù)

使用道具 舉報(bào)

7#
ID:965189 發(fā)表于 2021-12-27 09:01 | 只看該作者
一個(gè)按鍵對(duì)應(yīng)一個(gè)LED,這是最簡單的程序。
回復(fù)

使用道具 舉報(bào)

8#
ID:303778 發(fā)表于 2021-12-27 09:28 | 只看該作者
兩條一個(gè)數(shù)組
回復(fù)

使用道具 舉報(bào)

9#
ID:993066 發(fā)表于 2021-12-27 10:21 | 只看該作者
,真是太簡單。。。給你一個(gè)例子自己看看吧
                                                                                  
**************************************************************************************

*/
#include "reg52.h"                         //此文件中定義了單片機(jī)的一些特殊功能寄存器

typedef unsigned int u16;          //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
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的值

/*******************************************************************************
* 函 數(shù) 名         : delay
* 函數(shù)功能                   : 延時(shí)函數(shù),i=1時(shí),大約延時(shí)10us
*******************************************************************************/
void delay(u16 i)
{
        while(i--);       
}

/*******************************************************************************
* 函 數(shù) 名         : KeyDown
* 函數(shù)功能                   : 檢測(cè)有按鍵按下并讀取鍵值
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
void KeyDown(void)
{
        char a=0;
        GPIO_KEY=0x0f;
        if(GPIO_KEY!=0x0f)//讀取按鍵是否按下
        {
                delay(1000);//延時(shí)10ms進(jìn)行消抖
                if(GPIO_KEY!=0x0f)//再次檢測(cè)鍵盤是否按下
                {       
                        //測(cè)試列
                        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;
                        }
                        //測(cè)試行
                        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))         //檢測(cè)按鍵松手檢測(cè)
        {
                delay(100);
                a++;
        }
}


/*******************************************************************************
* 函 數(shù) 名       : main
* 函數(shù)功能                 : 主函數(shù)
* 輸    入       : 無
* 輸    出             : 無
*******************************************************************************/
void main()
{       

        while(1)
        {       
                KeyDown();                   //按鍵判斷函數(shù)
                GPIO_DIG=~smgduan[KeyValue];          //
        }               
}
回復(fù)

使用道具 舉報(bào)

10#
ID:57657 發(fā)表于 2021-12-27 10:45 | 只看該作者
你的程序是否需要識(shí)別多按鍵同時(shí)按下? 加了4067就不行了。
回復(fù)

使用道具 舉報(bào)

11#
ID:332444 發(fā)表于 2021-12-27 12:52 | 只看該作者



回復(fù)

使用道具 舉報(bào)

12#
ID:213173 發(fā)表于 2021-12-27 22:32 | 只看該作者
樓主這個(gè)電路沒有多少實(shí)際意義。矩陣鍵盤通過MCU直接控制16個(gè)端口驅(qū)動(dòng)LED更合理。不過用這個(gè)方式練練手也未嘗不可。給你一個(gè)示例參考。

  1. #include <reg51.H>
  2. #define uint unsigned int                 //宏定義無符號(hào)整型數(shù)據(jù)
  3. #define uchar unsigned char         //宏定義無符號(hào)字符型數(shù)據(jù)

  4. uchar key=16;                                        //定義鍵值全局變量

  5. void keyscan()                                        //按鍵掃描程序
  6. {
  7.         static bit sign=0;                        //按鍵自鎖標(biāo)志
  8.         static uint count=0;                //消抖計(jì)數(shù)變量                       
  9.         uchar num=0;                                //臨時(shí)變量
  10.         P1=0xf0;                                        //賦值P1 1111 0000
  11.         if(P1!=0xf0)                                //檢測(cè)有按鍵按下
  12.         {
  13.                 count++;                                //消抖計(jì)數(shù)
  14.                 if((count>=250)&&(sign==0))        //100~1000,根據(jù)主循環(huán)周期調(diào)整約10~20ms
  15.                 {                       
  16.                         sign=1;                                //按鍵自鎖標(biāo)志置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;                                        //按鍵自鎖標(biāo)志清0
  44.                 count=0;                                //消抖計(jì)數(shù)清0
  45.         }
  46. }

  47. void main()                                                //主函數(shù)
  48. {
  49.         while(1)
  50.         {
  51.                 keyscan();                                //按鍵掃描程序
  52.                 if(key==16)
  53.                         P2=0x40;                                //燈全滅
  54.                 else P2=0xb0|key;                //按鍵值點(diǎn)亮
  55.         }
  56. }
復(fù)制代碼




評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表