矩阵键盘程序_独立按键与矩阵按键
一、獨立按鍵原理
按鍵在閉合和斷開時,觸點會存在抖動現象
硬件消抖電路
獨立按鍵控制程
二、獨立按鍵控制程序
#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];? //
}
}
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的矩阵键盘程序_独立按键与矩阵按键的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网站爬取工具_浅析阻碍网站内容被蜘蛛抓取
- 下一篇: 驱动人生2008_驱动人生致敬深圳经济特