国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

51單片機入門——矩陣鍵盤(附51代碼)

這篇具有很好參考價值的文章主要介紹了51單片機入門——矩陣鍵盤(附51代碼)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1.硬件介紹

矩陣鍵盤電路圖

51單片機入門——矩陣鍵盤(附51代碼)
硬件如圖非常簡單,將一個4*4的矩陣鍵盤的8個管腳引到端子上,在連接到8個I/O口上,ARRAY_H代表著行,ARRAY_L代表著列,當行與列的電平都置低的時候,就選中的相應的矩陣按鍵,比如當s1按下時,ARRAY_H1會置低,其他ARRAY_H給高電平,那么選中的就是第一行,然后到列,ARRAY_L1低電平,其他ARRAY_L高電平,知道了這個我們就能在代碼里根據(jù)I/O的狀態(tài)判斷當前是哪個按鍵按下了,做出相應的操作,為了能夠能操控這16個按鍵,我們需要一個按鍵掃描的函數(shù),實時的掃描哪個鍵按下了,一般采用的方法就是行列掃描法。

行列掃描法

首先我們先讓一行為低電平,其他行為高電平(此時我們確定了行數(shù)),然后立即檢測各列是否有低電平,如果檢測到低電平(此時確定了列數(shù)),那我們就知道了當前被按下的是哪一行哪一列,然后用同樣的方法,一直保持掃描。文章來源地址http://www.zghlxwxcb.cn/news/detail-511008.html

實現(xiàn)代碼(僅供參考)

/**************************************************************************************
實驗名稱:矩陣按鍵實驗
接線說明:	
實驗現(xiàn)象:下載程序后,按下“矩陣按鍵”模塊中S1-S16鍵,對應靜態(tài)數(shù)碼管顯示0-F
注意事項:																				  
***************************************************************************************/
#include "reg52.h"

typedef unsigned int u16;	//對系統(tǒng)默認數(shù)據(jù)類型進行重定義
typedef unsigned char u8;
#define KEY_MATRIX_PORT	P1	//使用宏定義矩陣按鍵控制口	
void KeyScan();//按鍵掃描
void KeyDriver();//按鍵驅(qū)動
/*
根據(jù)矩陣鍵盤的硬件設計一個4*4的矩陣鍵盤
給P1口賦值 
高4位bit選擇一行中的哪一位	
低4位bit決定了是哪一列	0xf7(第一列) 0xfb 0xfd 0xfe
在確定列 在確定行 從而確定是哪一個按鍵
*/
u8 keysta[4][4] = { {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1} };//全部矩陣鍵盤的當前狀態(tài)
u8 backup[4][4] = { {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1} };//鍵值保存值,保持前值,用于判斷按鍵是彈起還是按下
u8 keybuf[4][4] = { {0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff} };//按鍵掃描緩沖區(qū)
u8 key_index = 0;//keybuf的索引
u8 i;
u8 j;
u8 k;
	
	
#define SMG_A_DP_PORT	P0	//使用宏定義數(shù)碼管段碼口
//共陰極數(shù)碼管顯示0~F的段碼數(shù)據(jù)
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
				0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};	
				
/*******************************************************************************
* 函 數(shù) 名       : HalInit
* 函數(shù)功能		 : 硬件層初始化
* 輸    入       : 無
* 輸    出    	 : 無
*******************************************************************************/
void HalInit() {
	//定時器t0初始化
	TMOD |= 0X01;//選擇為定時器0模式,工作方式1
	TH0 = 0XFC;	//給定時器賦初值,定時1ms
	TL0 = 0X18;
	ET0 = 1;//打開定時器0中斷允許
	EA = 1;//打開總中斷
	TR0 = 1;//關(guān)閉定時器		
}

/*******************************************************************************
* 函 數(shù) 名       : KeyScan() KeyDriver()
* 函數(shù)功能		 : 
* 輸    入       : 無
* 輸    出    	 : 
				   
*******************************************************************************/
void KeyScan()
{	
	//第一行的四個按鍵的P1值,其他以此類推
	//0111 0111
	//0111 1011
	//0111 1101
	//0111 1110
	//確定是第幾行的第幾列,從而確定按下的按鍵
	keybuf[key_index][0] = (keybuf[key_index][0] << 1) | (KEY_MATRIX_PORT & 0x08) >> 3;//獲取第1列的bit3是0還是1
	keybuf[key_index][1] = (keybuf[key_index][1] << 1) | (KEY_MATRIX_PORT & 0x04) >> 2;//獲取第1列的bit2是0還是1
	keybuf[key_index][2] = (keybuf[key_index][2] << 1) | (KEY_MATRIX_PORT & 0x02) >> 1;//獲取第1列的bit1是0還是1
	keybuf[key_index][3] = (keybuf[key_index][3] << 1) | (KEY_MATRIX_PORT & 0x01) >> 0;//獲取第1列的bit0是0還是1

	//消抖后更新按鍵狀態(tài)
	for (i = 0; i < 4; i++) {
		if ((keybuf[key_index][i] & 0x0f) == 0x00) {//按下
			//0x0f連續(xù)掃描4次是0說明已穩(wěn)定按下,1ms中斷掃描4次
			keysta[key_index][i] = 0;
		}else if ((keybuf[key_index][i] & 0x0f) == 0x0f) {//彈起
			//0x0f連續(xù)掃描4次是0說明已穩(wěn)定抬起
			keysta[key_index][i] = 1;
		}
	}

	key_index++;
	key_index &= 0x03;//如果key_index為4則重置為0
	switch (key_index) {
		case 0:KEY_MATRIX_PORT = 0x7f; break;//第一行按鍵
		case 1:KEY_MATRIX_PORT = 0xbf; break;//第二行按鍵
		case 2:KEY_MATRIX_PORT = 0xdf; break;//第三行按鍵
		case 3:KEY_MATRIX_PORT = 0xef; break;//第四行按鍵
	}
}

void KeyDriver() {
	for (j = 0; j < 4; j++) {
		for (k = 0; k < 4; k++) {
			if (backup[j][k] != keysta[j][k]) {//檢測到按鍵動作
				if (backup[j][k] == 1) {//被按下
					SMG_A_DP_PORT = gsmg_code[j * 4 + k];//顯示相應的數(shù)碼管
				} else if (backup[j][k] == 0) {//彈起

				}
				backup[j][k] != keysta[j][k];//更新鍵值
			}
		}
	}
}

/*******************************************************************************
* 函 數(shù) 名       : main
* 函數(shù)功能		 : 主函數(shù)
* 輸    入       : 無
* 輸    出    	 : 無
*******************************************************************************/
void main()
{	
	HalInit();//定時器初始化
	while(1)
	{
		KeyDriver();
	}		
}

//中斷函數(shù)
void time0() interrupt 1 //定時器0中斷函數(shù)
{
	TH0 = 0XFC;	//給定時器賦初值,定時1ms
	TL0 = 0X18;
	KeyScan();//1ms掃描一次
}

到了這里,關(guān)于51單片機入門——矩陣鍵盤(附51代碼)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • 51單片機(六)矩陣鍵盤和矩陣鍵盤密碼鎖

    51單片機(六)矩陣鍵盤和矩陣鍵盤密碼鎖

    ?? 專欄簡介:本專欄記錄了從零學習單片機的過程,其中包括51單片機和STM32單片機兩部分;建議先學習51單片機,其是STM32等高級單片機的基礎;這樣再學習STM32時才能融會貫通。 ?? 專欄適用人群 :適用于想要從零基礎開始學習入門單片機,且有一定C語言基礎的的童鞋

    2024年02月04日
    瀏覽(25)
  • 6.51單片機之矩陣鍵盤

    6.51單片機之矩陣鍵盤

    ?? 1.矩陣鍵盤的介紹 在鍵盤中按鍵數(shù)量較多時,為了減少I/O口的占用,通常將按鍵排列成矩陣形式。 采用逐行或逐列的“掃描”,就可以讀出任何位置按鍵的狀態(tài)。 結(jié)構(gòu):在鍵盤中按鍵數(shù)量較多時,為了減少I/O口的占用,通常將按鍵排列成矩陣形式。在矩陣式鍵盤中,每條

    2024年02月07日
    瀏覽(17)
  • 51單片機學習筆記-4矩陣鍵盤

    51單片機學習筆記-4矩陣鍵盤

    [toc] 注:筆記主要參考B站江科大自化協(xié)教學視頻“51單片機入門教程-2020版 程序全程純手打 從零開始入門”。 注:工程及代碼文件放在了本人的Github倉庫。 在鍵盤中按鍵數(shù)量較多時,為了減少I/O口的占用,通常將按鍵排列成矩陣形式。采用逐行或逐列的“掃描”,就可以讀

    2024年02月06日
    瀏覽(24)
  • 51單片機矩陣鍵盤——LCD1602顯示

    51單片機矩陣鍵盤——LCD1602顯示

    本次的實驗需要用到LCD1602液晶屏,需要用到LCD1602.c 與LCD1602.h文件鏈接: https://download.csdn.net/download/YLG_lin/86404949 使用矩陣鍵盤隨意按下按鍵,LCD1602第二行前兩位就會顯示對應按鍵按下的數(shù)字。 在鍵盤中按鍵數(shù)量較多時,為了減少I/O口的占用,通常將按鍵排列成矩陣形式 采用

    2023年04月09日
    瀏覽(33)
  • 51單片機實現(xiàn)矩陣鍵盤密碼鎖

    51單片機實現(xiàn)矩陣鍵盤密碼鎖

    使用51單片機的矩陣鍵盤模塊以及l(fā)ed1602顯示屏,實現(xiàn)模擬密碼鎖。 當程序燒錄到單片機中后,led1602屏幕會顯示文字。 第一行會顯示單詞“PASSWORD”,第二行顯示4個0,表示我們要寫入的四位密碼,每位默認為0。 矩陣鍵盤前兩行與第三行的前兩個分別代表輸入1-9與0,第三行第

    2024年02月03日
    瀏覽(25)
  • 51單片機矩陣鍵盤——數(shù)碼管顯示

    當我們熟悉了數(shù)碼管的位選與段選,并了解的矩陣鍵盤的掃描之后就可以編寫程序了。 按下矩陣鍵盤S1并松開,數(shù)碼管第一位(LED8)顯示0;按下矩陣鍵盤S2并松開,數(shù)碼管第一位顯示1;...按下矩陣鍵盤S16并松開,數(shù)碼管第一位顯示F; 矩陣鍵盤掃描(輸入掃描) ?? ?原理:

    2024年02月11日
    瀏覽(22)
  • 51單片機學習--矩陣鍵盤、電子密碼鎖

    51單片機學習--矩陣鍵盤、電子密碼鎖

    矩陣鍵盤的模塊原理圖: 功能:按下矩陣按鍵,在LCD上顯示對應的數(shù)值。 采用模塊化編程,在此只給出MatrixKey.c 和 main.c 兩部分代碼 這里要注意必須先判斷KeyNum是否為0,否則while不斷循環(huán)會不斷顯示0,導致看不到按下按鈕顯示的數(shù)字 要利用寫好的矩陣鍵盤來制作一個密碼鎖

    2024年02月16日
    瀏覽(26)
  • 基于51單片機的矩陣鍵盤(線反轉(zhuǎn)法)

    基于51單片機的矩陣鍵盤(線反轉(zhuǎn)法)

    矩陣鍵盤使用的方法與獨立按鍵類似,但是比獨立按鍵節(jié)省I/O,同時使用方法變得相對復雜了,首先展示硬件連接。 上圖所示就是4X4矩陣鍵盤的常見接法,按行來看,每個按鍵的左端接在一起,按列來看,每個按鍵的右端接在一起,共占用8個I/O,接到51單片機的P1端口。 對于

    2024年02月11日
    瀏覽(21)
  • 51單片機設計16個按鍵的矩陣鍵盤

    51單片機設計16個按鍵的矩陣鍵盤

    首先如圖所示導入各個元器件,并連線。 因為P3口連接著矩陣鍵盤,所以上來要先付個初值,從高位到低位H0,H1,H2,H3,L0,L1,L2,L3的值是11110000,高位全是1,低位全是0,十六進制就是0xF0,也就是P3=0xF0。如果有按鍵按下了,肯定就不是這個值了。 比如說: 第一行789+中的任何一個按

    2024年02月05日
    瀏覽(30)
  • 如何在51單片機上實現(xiàn)矩陣鍵盤功能

    本文詳細介紹了在51單片機上實現(xiàn)矩陣鍵盤功能的方法,包括按鍵檢測、消抖處理和鍵值映射等關(guān)鍵步驟。通過本文的學習,你將能夠掌握在嵌入式系統(tǒng)中處理矩陣鍵盤輸入的技術(shù)。

    2024年04月10日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包