日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

矩阵键盘程序_独立按键与矩阵按键

發布時間:2023/12/18 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 矩阵键盘程序_独立按键与矩阵按键 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、獨立按鍵原理

按鍵在閉合和斷開時,觸點會存在抖動現象

硬件消抖電路

獨立按鍵控制程

二、獨立按鍵控制程序

#include "reg52.h"

typedef unsigned int u16;

typedef unsigned char u8;

sbit k1=P3^1;?

sbit k2=P3^0;

sbit k3=P3^2;

sbit k4=P3^3;

sbit LSA=P2^2;

sbit LSB=P2^3;

sbit LSC=P2^4;

u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值

void delay(u16 i)

{

while(i--);

}

/*******************************************

* 函 數 名? ? ?: keypros

* 函數功能 ? ?: 按鍵處理函數,判斷按鍵K1是否按下

******************************************/

void keypros()

{

if(k1==0)? //檢測按鍵K1是否按下

{

delay(1000);? ?//消除抖動 一般大約10ms

if(k1==0) //再次判斷按鍵是否按下

{

P0=smgduan[0];

LSA=0;LSB=0;LSC=0;?

}

while(!k1); //檢測按鍵是否松開

}

if(k2==0)? //檢測按鍵K1是否按下

{

delay(1000);? ?//消除抖動 一般大約10ms

if(k2==0) //再次判斷按鍵是否按下

{

P0=smgduan[1];

LSA=1;LSB=0;LSC=0;?

}

while(!k2); //檢測按鍵是否松開

}

?if(k3==0)? //檢測按鍵K1是否按下

{

delay(1000);? ?//消除抖動 一般大約10ms

if(k3==0) //再次判斷按鍵是否按下

{

P0=smgduan[2];

LSA=0;LSB=1;LSC=0;?

}

while(!k3); //檢測按鍵是否松開

}

if(k4==0)? //檢測按鍵K1是否按下

{

delay(1000);? ?//消除抖動 一般大約10ms

if(k4==0) //再次判斷按鍵是否按下

{

P0=smgduan[3];

LSA=1;LSB=1;LSC=0;?

}

while(!k4); //檢測按鍵是否松開

}

}

void main()

{

while(1)

{

keypros();? //按鍵處理函數

}

}

一、矩陣按鍵

矩陣按鍵掃描原理

方法一:

? ?逐行掃描:我們可以通過高四位輪流輸出低電平來對矩陣鍵盤進行逐行掃描,當低四位接收到的數據不全為1的時候,說明有按鍵按下,然后通過接收到的數據是哪一位為0來判斷是哪一個按鍵被按下

方法二:

方法二:

??行列掃描:我們可以通過高四位全部輸出低電平,低四位輸出高電平。當接收到的數據,低四位不全為高電平時,說明有按鍵按下,然后通過接收的數據值,判斷是哪一列有按鍵按下,然后再反過來,高四位輸出高電平,低四位輸出低電平,然后根據接收到的高四位的值判斷是那一行有按鍵按下,這樣就能夠確定是哪一個按鍵按下了。

二、實驗程序

實現現象:下載程序后數碼管顯示0,按下矩陣按鍵上的按鍵顯示對應的數字

S1-S4:0-3

S5-S8:4-7

S9-S12:8-B

S13-S16:C-F。

***************************************************************************************/

#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)) //檢測按鍵松手檢測,按鍵一直按下,條件2成立,這時進入while 循環,當不滿足條件1時,跳出循環體,表明按鍵被強制松開。

{

delay(1000);

a++;

}

}

}

}

/*******************************************************************************

* 函 數 名? ? ? ?: main

* 函數功能 : 主函數

* 輸? ? 入? ? ? ?: 無

* 輸? ? 出? ? ?: 無

*******************************************************************************/

void main()

{

LSA=0; //給一個數碼管提供位選

LSB=0;

LSC=0;

while(1)

{

KeyDown();? ?//按鍵判斷函數

GPIO_DIG=smgduan[KeyValue];? //

}

}

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的矩阵键盘程序_独立按键与矩阵按键的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。