矩阵键盘程序_独立按键与矩阵按键
一、獨(dú)立按鍵原理
按鍵在閉合和斷開(kāi)時(shí),觸點(diǎn)會(huì)存在抖動(dòng)現(xiàn)象
硬件消抖電路
獨(dú)立按鍵控制程
二、獨(dú)立按鍵控制程序
#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--);
}
/*******************************************
* 函 數(shù) 名? ? ?: keypros
* 函數(shù)功能 ? ?: 按鍵處理函數(shù),判斷按鍵K1是否按下
******************************************/
void keypros()
{
if(k1==0)? //檢測(cè)按鍵K1是否按下
{
delay(1000);? ?//消除抖動(dòng) 一般大約10ms
if(k1==0) //再次判斷按鍵是否按下
{
P0=smgduan[0];
LSA=0;LSB=0;LSC=0;?
}
while(!k1); //檢測(cè)按鍵是否松開(kāi)
}
if(k2==0)? //檢測(cè)按鍵K1是否按下
{
delay(1000);? ?//消除抖動(dòng) 一般大約10ms
if(k2==0) //再次判斷按鍵是否按下
{
P0=smgduan[1];
LSA=1;LSB=0;LSC=0;?
}
while(!k2); //檢測(cè)按鍵是否松開(kāi)
}
?if(k3==0)? //檢測(cè)按鍵K1是否按下
{
delay(1000);? ?//消除抖動(dòng) 一般大約10ms
if(k3==0) //再次判斷按鍵是否按下
{
P0=smgduan[2];
LSA=0;LSB=1;LSC=0;?
}
while(!k3); //檢測(cè)按鍵是否松開(kāi)
}
if(k4==0)? //檢測(cè)按鍵K1是否按下
{
delay(1000);? ?//消除抖動(dòng) 一般大約10ms
if(k4==0) //再次判斷按鍵是否按下
{
P0=smgduan[3];
LSA=1;LSB=1;LSC=0;?
}
while(!k4); //檢測(cè)按鍵是否松開(kāi)
}
}
void main()
{
while(1)
{
keypros();? //按鍵處理函數(shù)
}
}
一、矩陣按鍵
矩陣按鍵掃描原理
方法一:
? ?逐行掃描:我們可以通過(guò)高四位輪流輸出低電平來(lái)對(duì)矩陣鍵盤(pán)進(jìn)行逐行掃描,當(dāng)?shù)退奈唤邮盏降臄?shù)據(jù)不全為1的時(shí)候,說(shuō)明有按鍵按下,然后通過(guò)接收到的數(shù)據(jù)是哪一位為0來(lái)判斷是哪一個(gè)按鍵被按下
方法二:
方法二:
??行列掃描:我們可以通過(guò)高四位全部輸出低電平,低四位輸出高電平。當(dāng)接收到的數(shù)據(jù),低四位不全為高電平時(shí),說(shuō)明有按鍵按下,然后通過(guò)接收的數(shù)據(jù)值,判斷是哪一列有按鍵按下,然后再反過(guò)來(lái),高四位輸出高電平,低四位輸出低電平,然后根據(jù)接收到的高四位的值判斷是那一行有按鍵按下,這樣就能夠確定是哪一個(gè)按鍵按下了。
二、實(shí)驗(yàn)程序
實(shí)現(xiàn)現(xiàn)象:下載程序后數(shù)碼管顯示0,按下矩陣按鍵上的按鍵顯示對(duì)應(yīng)的數(shù)字
S1-S4:0-3
S5-S8:4-7
S9-S12:8-B
S13-S16:C-F。
***************************************************************************************/
#include "reg52.h" //此文件中定義了單片機(jī)的一些特殊功能寄存器
typedef unsigned int u16;? //對(duì)數(shù)據(jù)類(lèi)型進(jìn)行聲明定義
typedef unsigned char u8;
#define GPIO_DIG P0? ?//對(duì)按鍵端口進(jìn)行定義
#define GPIO_KEY P1//發(fā)送斷碼端口定義
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 KeyValue;//用來(lái)存放讀取到的鍵值
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值
/*******************************************************************************
* 函 數(shù) 名? ? ? ? ?: delay
* 函數(shù)功能? ?: 延時(shí)函數(shù),i=1時(shí),大約延時(shí)10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
* 函 數(shù) 名? ? ? ? ?: KeyDown
* 函數(shù)功能? ?: 檢測(cè)有按鍵按下并讀取鍵值
* 輸? ? 入? ? ? ? ?: 無(wú)
* 輸? ? 出? ? ? ? ?: 無(wú)
*******************************************************************************/
void KeyDown(void)
{
char a=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)//讀取按鍵是否按下
{
delay(1000);//延時(shí)10ms進(jìn)行消抖
if(GPIO_KEY!=0x0f)//再次檢測(cè)鍵盤(pán)是否按下
{
//測(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è),按鍵一直按下,條件2成立,這時(shí)進(jìn)入while 循環(huán),當(dāng)不滿(mǎn)足條件1時(shí),跳出循環(huán)體,表明按鍵被強(qiáng)制松開(kāi)。
{
delay(1000);
a++;
}
}
}
}
/*******************************************************************************
* 函 數(shù) 名? ? ? ?: main
* 函數(shù)功能 : 主函數(shù)
* 輸? ? 入? ? ? ?: 無(wú)
* 輸? ? 出? ? ?: 無(wú)
*******************************************************************************/
void main()
{
LSA=0; //給一個(gè)數(shù)碼管提供位選
LSB=0;
LSC=0;
while(1)
{
KeyDown();? ?//按鍵判斷函數(shù)
GPIO_DIG=smgduan[KeyValue];? //
}
}
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的矩阵键盘程序_独立按键与矩阵按键的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 网站爬取工具_浅析阻碍网站内容被蜘蛛抓取
- 下一篇: python sqlsever 时间_P