STM32矩陣鍵盤實現(xiàn)方法收集_第1頁
STM32矩陣鍵盤實現(xiàn)方法收集_第2頁
STM32矩陣鍵盤實現(xiàn)方法收集_第3頁
STM32矩陣鍵盤實現(xiàn)方法收集_第4頁
STM32矩陣鍵盤實現(xiàn)方法收集_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、STM3洲矩陣鍵盤,不帶外部中斷,可以多個按鍵同時按下C代碼:STM32用矩陣鍵盤,不帶外部中斷,可以多個按鍵同時按下/*矩陣鍵盤.h文件*/#ifndef_COMMON_H#define_COMMON_H#include""/*4*4矩陣鍵盤*/voidkeyboard_init(void);voidupdate_key(void);externunsignedcharkey44;#endif/*矩陣鍵盤.c文件*/#include""structGPIO_TypeDef*GPIO_x;unsignedshortGPIO_pin;staticstruc

2、tio_portkey_output4=GPIOD,GPIO_Pin_0,GPIOD,GPIO_Pin_1,GPIOD,GPIO_Pin_2,GPIOD,GPIO_Pin_3io_port;staticstructio_portkey_input4=GPIOD,GPIO_Pin_4,GPIOD,GPIO_Pin_5,GPIOD,GPIO_Pin_6,GPIOD,GPIO_Pin_7;unsignedcharkey44;voidkeyboard_init(void)GPIO_InitTypeDefGPIO_InitStructure;unsignedchari;/*鍵盤行掃描輸出線輸出高電平*/

3、*PA0PA1PA2PA3輸出*/=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;=GPIO_Mode_Out_PP;=GPIO_Speed_50MHz;GPIO_Init(GPIOD,&GPIO_InitStructure);/*鍵盤列掃描輸入線鍵被按時輸入高電平放開輸入低電平*/*PA4PA5PA6PA7輸入*/=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;=GPIO_Mode_IPU;GPIO_Init(GPIOD,&GPIO_InitStructure);for(i=0;i<4;

4、i+)GPIO_SetBits(key_outputi.GPIO_x,key_outputi.GPIO_pin);voidupdate_key(void)unsignedchari,j;for(i=0;i<4;i+)PIO_x,key_outputi.GPIO_pin);for(j=0;j<4;j+)PIO_x,key_inputj.GPIO_pin)=0)keyij=1;elsekeyij=0;GPIO_SetBits(key_outputi.GPIO_x,key_outputi.GPIO_pin);stm32矩陣鍵盤這是硬件上的鍵盤規(guī)劃/|1|2|3|4|-line1PE6/|

5、5|6|7|8|-line2PE5/|9|10|11|12|-line3PE4/|13|14|15|16|-line4PE3/|17|18|19|20|-line5PE2/|/col1col2col3col4/PE0PB5PB8PB9/參考了下基于avr的矩陣鍵盤程序,耐著性子移植到符合上面硬件規(guī)劃的stm32板子上。volatileuint8_tkey_flag=0;voidkey_init(void)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDefGPIO_In

6、itStructure;/keyoutput=GPIO_Mode_Out_PP;=GPIO_Speed_50MHz;=GPIO_Pin_0;GPIO_Init(GPIOE,&GPIO_InitStructure);=GPIO_Pin_5|GPIO_Pin_8|GPIO_Pin_9;GPIO_Init(GPIOB,&GPIO_InitStructure);/keyinput=GPIO_Mode_IPU;/上拉輸入=GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;GPIO_Init(GPIOE,&GPIO_Ini

7、tStructure);/判斷是否有鍵按下函數(shù),對鍵盤進行一次掃描/返回鍵盤接口狀態(tài),有鍵按下時返回鍵值;沒有鍵按下返回?zé)o效標志位uint8_tIs_Key_PressOn(void)volatileuint8_ti,ScanCode;for(i=0;i<4;i+)switch(i)/掃描信號產(chǎn)生case0:GPIOE->BSRR=0x00010000;/PE0=0;GPIOB->BSRR=0x00000320;/PB5=1;PB8=1;PB9=1;key_flag=1;break;case 1:GPIOE->BSRR=0x00000001;/PE0=1;GPIOB-&

8、gt;BSRR=0x00200300;/PB5=0;PB8=1;PB9=1;break;case 2:GPIOE->BSRR=0x00000001;/PE0=1;GPIOB->BSRR=0x01000220;/PB5=1;PB8=0;PB9=1;key_flag=3;break;case 3:GPIOE->BSRR=0x00000001;/PE0=1;GPIOB->BSRR=0x02000120;/PB5=1;PB8=1;PB9=0;key_flag=4;break;default:key_flag=0;break;if(uint8_t)GPIOE->IDR)|0

9、x83)!=0xff)return(uint8_t)GPIOE->IDR|0x83);return(PRESS_INVALID);/找到閉合鍵,判斷延時前后兩次鍵值是否相同,如果相同則返回鍵值uint8_tFind_Key_PressOn(uint8_tKeyCode_before,uint8_tKeyCode_after)if(KeyCode_before=KeyCode_after)return(KeyCode_after);elsereturn(PRESS_INVALID);/計算鍵值,根據(jù)返回的鍵值計算相應(yīng)的返回值uint8_tCalc_Key_PressOn(uint8_tKe

10、yCode)uint8_tTempNum;switch(KeyCode)case0xBF:if(1=key_flag)TempNum=1;break;elseif(2=key_flag)TempNum=2;break;elseif(3=key_flag)TempNum=3;break;elseif(4=key_flag)TempNum=4;break;elsebreak;case0xDF:if(1=key_flag)TempNum=5;break;TempNum=6;break;elseif(3=key_flag)TempNum=7;break;elseif(4=key_flag)TempNu

11、m=8;break;elsebreak;case0xEF:if(1=key_flag)TempNum=9;break;elseif(2=key_flag)TempNum=10;break;elseif(3=key_flag)TempNum=11;break;TempNum=12;break;elsebreak;case0xF7:if(1=key_flag)TempNum=13;break;elseif(2=key_flag)TempNum=14;break;elseif(3=key_flag)TempNum=15;break;elseif(4=key_flag)TempNum=16;break

12、;elsebreak;case0xFB:if(1=key_flag)TempNum=17;break;TempNum=18;break;elseif(3=key_flag)TempNum=19;break;elseif(4=key_flag)TempNum=20;break;elsebreak;default:TempNum=0;break;/發(fā)生錯誤時返回,無效標志return(TempNum);/正常返回值為116/鍵盤掃描主程序uint8_tKeyboard(void)uint8_tkey_temp;/暫存鍵值的變量key_temp=Is_Key_PressOn();/判斷是否有鍵閉合/

13、PORTC=key_temp;調(diào)試過程中使用,正常運行時沒用可以刪除if(key_temp=PRESS_INVALID)/判斷該次掃描中是否有鍵按下return(PRESS_INVALID);/沒有閉合則建立無效標志elsedelay_nus(100);/閉合則延時找到閉合鍵key_temp=Find_Key_PressOn(key_temp,(uint8_t)GPIOE->IDR|0x83);/if(key_temp=PRESS_INVALID)return(key_temp);/若延時前后鍵值不相等則返回?zé)o效標志elsekey_temp=Calc_Key_PressOn(key_te

14、mp);/有效則計算鍵值while(uint8_t)GPIOE->IDR)|0x83)!=0xff)/等待鍵放??磳嶋H情況使用delay_nus(10);return(key_temp);/返回鍵值夢之旅同學(xué)松鼠學(xué)習(xí)筆記(三)之矩陣鍵盤這幾天事情比較多,所以就一直沒有更新,呵呵,今天早上沒課,把之前寫好代碼整理一下,順便說下思路,發(fā)上來,供大家參考參考。首先,本矩陣鍵盤硬件連接如下:思路:我的思路如下,首先,把縱向三線設(shè)置為推挽輸出,然后把橫向三線設(shè)置為下拉輸入,然后讀取橫向三線的值,如果有接口的讀數(shù)為1,說明有按鍵按下了,把該值與0x07相與后放到scana,然后左移4位放到resul

15、t中,這之后把橫向三線設(shè)置為推挽輸出,縱向三線設(shè)置為下拉輸入,然后讀取縱向三線的值,把相應(yīng)的鍵值保存到scanb中,然后通過移位使得低四位表示的是相應(yīng)的按鍵所在橫向的值,然后與result相或放到result的低四位,這樣得到的result高四位就是按鍵所在縱向的值,低四位就是按鍵所在橫向的值,由此就可以檢測到那個按鍵被按下了。效果:按下相應(yīng)的鍵盤,四個led燈會顯示各種不同的狀態(tài),hoho,一共有9種狀態(tài)。#include""voidRCC_Configuration(void);voidGPIO_Configuration(void);voidNVIC_Configur

16、ation(void);voiddelay(void);u8KEY_GPIO_Scanning(void);intmain(void)#ifdefDEBUGdebug();#endifRCC_Configuration();/配置系統(tǒng)時鐘NVIC_Configuration();/配置NVIC和VectorTableGPIO_Configuration();使用的GPIO口/主循環(huán)while(1)/循環(huán)掃描按鍵按鍵按下時對應(yīng)的LED亮switch(KEY_GPIO_Scanning()case(0x18):GPIO_SetBits(GPIOB,GPIO_Pin_12);GPIO_ResetBi

17、ts(GPIOB,GPIO_Pin_13);GPIO_ResetBits(GPIOB,GPIO_Pin_14);GPIO_ResetBits(GPIOB,GPIO_Pin_15);break;case(0x12):GPIO_ResetBits(GPIOB,GPIO_Pin_12);GPIO_SetBits(GPIOB,GPIO_Pin_13);GPIO_ResetBits(GPIOB,GPIO_Pin_14);GPIO_ResetBits(GPIOB,GPIO_Pin_15);break;case(0x14):GPIO_SetBits(GPIOB,GPIO_Pin_12);GPIO_SetBi

18、ts(GPIOB,GPIO_Pin_13);GPIO_ResetBits(GPIOB,GPIO_Pin_14);GPIO_ResetBits(GPIOB,GPIO_Pin_15);break;case(0x28):GPIO_ResetBits(GPIOB,GPIO_Pin_12);GPIO_ResetBits(GPIOB,GPIO_Pin_13);GPIO_SetBits(GPIOB,GPIO_Pin_14);GPIO_ResetBits(GPIOB,GPIO_Pin_15);break;case(0x24):GPIO_SetBits(GPIOB,GPIO_Pin_12);GPIO_Reset

19、Bits(GPIOB,GPIO_Pin_13);GPIO_SetBits(GPIOB,GPIO_Pin_14);GPIO_ResetBits(GPIOB,GPIO_Pin_15);break;case(0x48):GPIO_SetBits(GPIOB,GPIO_Pin_12);GPIO_SetBits(GPIOB,GPIO_Pin_13);GPIO_SetBits(GPIOB,GPIO_Pin_14);GPIO_ResetBits(GPIOB,GPIO_Pin_15);break;case(0x42):GPIO_ResetBits(GPIOB,GPIO_Pin_12);GPIO_ResetBi

20、ts(GPIOB,GPIO_Pin_13);GPIO_ResetBits(GPIOB,GPIO_Pin_14);GPIO_SetBits(GPIOB,GPIO_Pin_15);break;case(0x44):GPIO_SetBits(GPIOB,GPIO_Pin_12);GPIO_ResetBits(GPIOB,GPIO_Pin_14);GPIO_SetBits(GPIOB,GPIO_Pin_15);break;case(0x22):GPIO_SetBits(GPIOB,GPIO_Pin_12);GPIO_SetBits(GPIOB,GPIO_Pin_13);GPIO_SetBits(GPI

21、OB,GPIO_Pin_14);GPIO_SetBits(GPIOB,GPIO_Pin_15);break;voidRCC_Configuration(void)ErrorStatusHSEStartUpStatus;RCC_DeInit();/將外設(shè)RCC寄存器重設(shè)為缺省值RCC_HSEConfig(RCC_HSE_ON);/設(shè)置外部高速晶振(HSE)HSEStartUpStatus=RCC_WaitForHSEStartUp();/等待HSE起振if(HSEStartUpStatus=SUCCESS)FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_

22、Enable);/預(yù)取指緩存使能FLASH_SetLatency(FLASH_Latency_2);/設(shè)置代碼延時值FLASH_Latency_22延時周期RCC_HCLKConfig(RCC_SYSCLK_Div1);/設(shè)置AHB時鐘(HCLK)AHB 時 鐘RCC_PCLK2Config(RCC_HCLK_Div2);/設(shè)置高速(PCLK2)RCC_HCLK_Div2APB1時鐘=HCLK/2RCC_PCLK1Config(RCC_HCLK_Div2);/設(shè)置低速AHB時鐘(PCLK1)RCC_HCLK_Div2APB1時鐘=HCLK/2RCC_PLLConfig(RCC_PLLSourc

23、e_HSE_Div1,RCC_PLLMul_9);/PLLCLK=8MHz*9=72MHz設(shè)置PLL時鐘源及倍頻系數(shù)RCC_PLLCmd(ENABLE);使能或者失能PLLwhile(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)=RESET)/等待指定的RCC標志位設(shè)置成功等待PLL初始化成功RCC_SYSCLKCon巾g(RCC_SYSCLKSource_PLLCLK);設(shè)置系統(tǒng)時鐘(SYSCLK設(shè)置PLL為系統(tǒng)時鐘源while(RCC_GetSYSCLKSource()!=0x08)/等待PLL成功用作于系統(tǒng)時鐘的時鐘源0x00:HSI作為系統(tǒng)時鐘0x04:HSE作

24、為系統(tǒng)時鐘0x08:PLL作為系統(tǒng)時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);/使能或者失能APB2外設(shè)時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);voidGPIO_Configuration(void)GPIO_InitTypeDefGPIO_InitStructure;=GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;=GPIO_Speed_50MHz;/LED端口設(shè)置為推挽輸出=GPIO_Mode_Out_OD;G

25、PIO_Init(GPIOB,&GPIO_InitStructure);/鍵盤橫向三線=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;=GPIO_Speed_50MHz;=GPIO_Mode_IPD;GPIO_Init(GPIOA,&GPIO_InitStructure);/鍵盤縱向三線=GPIO_Pin_3;=GPIO_Speed_50MHz;=GPIO_Mode_Out_PP;GPIO_Init(GPIOA,&GPIO_InitStructure);=GPIO_Pin_1|GPIO_Pin_2;=GPIO_Speed_50MHz;=GPIO_Mo

26、de_Out_PP;GPIO_Init(GPIOB,&GPIO_InitStructure);voidGPIO_Reconfiguration(void)GPIO_InitTypeDefGPIO_InitStructure;/鍵盤橫向三線/*Function Name: KEY_GPIO_ScanningDescription:依次才3描4個按鍵 使用一個u8變量的低4位存儲掃描結(jié)果Input: None* Output: None* Return: 掃描的結(jié)果有效數(shù)據(jù)是低 4 位=GPIO_Speed_50MHz;=GPIO_Mode_Out_PP;GPIO_Init(GPIOA,&

27、amp;GPIO_InitStructure);/鍵盤縱向三線=GPIO_Pin_3;=GPIO_Speed_50MHz;=GPIO_Mode_IPD;GPIO_Init(GPIOA,&GPIO_InitStructure);=GPIO_Pin_1|GPIO_Pin_2;=GPIO_Speed_50MHz;=GPIO_Mode_IPD;GPIO_Init(GPIOB,&GPIO_InitStructure);*u8KEY_GPIO_Scanning(void)u8result;u8scana;/單個按鍵掃描變量u8scanb;/四個按鍵總的情況變量scan_sum低四位的每一位對應(yīng)一個按鍵scana=0;scanb=0;result=0;GPIO_SetBits(GPIOA,GPIO_Pin_3);GPIO_SetBits(GPIOB,GPIO_Pin_1);GPIO_SetBits(GPIOB,GPIO_Pi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論