版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、/例程1:掃描法#include "stm32f10x.h"#include "delay.h"/*本文件的函數(shù),主要實(shí)現(xiàn)矩陣鍵盤(pán)的功能。矩陣鍵盤(pán)使用PA0到PA7引腳,其中,PA0到PA3固定為推挽輸出,PA4到PA7固定為下拉輸入。即,無(wú)鍵按下時(shí),對(duì)應(yīng)PA4到PA7為0,有鍵按下時(shí),PA4到PA7中,對(duì)應(yīng)的引腳為高。此程序有一點(diǎn)要注意:要用到的IO口,必須是PX0-PX7,不能是其他連續(xù)的數(shù)字。如果非要改。如:已經(jīng)沒(méi)有連續(xù)的0-7的IO口,需要在幾個(gè)地方修改,請(qǐng)注意!此程序帶有松手檢測(cè)。*/Void InitKey(void)/初始化矩陣鍵盤(pán)要使用的
2、GPIO口。GPIO_InitTypeDef GPIOStru;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIOStru.GPIO_Mode=GPIO_Mode_Out_PP; /定義PA0到PA3為推挽輸出。GPIOStru.GPIO_Speed=GPIO_Speed_50MHz;GPIOStru.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;GPIO_Init(GPIOA,&GPIOStru);GPIOStru.GPIO_Mode=GPIO_Mode_IPD;
3、/定義PA4到PA7為下拉輸入。GPIOStru.GPIO_Speed=GPIO_Speed_50MHz;GPIOStru.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; GPIO_Init(GPIOA,&GPIOStru);s8 key(void)/實(shí)現(xiàn)矩陣鍵盤(pán)。返回值為,各按鍵的鍵值,此鍵值由用戶自己定義。s8 KeyVal =0;/keyVal為最后返回的鍵值。u16 WriteVal =0;/WriteVal為要寫(xiě)給PA口的數(shù)據(jù)。GPIO_Write(GPIOA,(GPIOA->ODR&0xfff0|0x
4、f);/先讓PA0到PA3全部輸出高。if(GPIOA->IDR&0x00f0)=0x0000)/如果,PA4到PA7全為0,則,沒(méi)有鍵按下。此時(shí),返回值為-1.Return -1;elsedelay_ms(5);/延時(shí)5ms去抖動(dòng)。if(GPIOA->IDR & 0x00f0)=0x0000)/延時(shí)5ms后PA4到PA7又全為0,則剛才的電位變化是抖動(dòng)產(chǎn)生的.Return -1;GPIO_Write(GPIOA,(GPIOA->ODR&0xfff0|0x1);/讓PA3到PA0輸出二進(jìn)制的0001.switch(GPIOA->IDR &
5、 0x00f0)/對(duì)PA4到PA7的值進(jìn)行判斷,以輸出不同的鍵值。Case 0x0010: KeyVal=15;break;Case 0x0020: KeyVal=11;break;Case 0x0040: KeyVal=7;break;Case 0x0080: KeyVal=3; break;GPIO_Write(GPIOA,(GPIOA->ODR & 0xfff0 | 0x2);/讓PA3到PA0輸出二進(jìn)制的0010.switch(GPIOA->IDR & 0x00f0)/對(duì)PA4到PA7的值進(jìn)行判斷,以輸出不同的鍵值。Case 0x0010: KeyVal=1
6、4;break;Case 0x0020: KeyVal=10;break;Case 0x0040: KeyVal=6; break;Case 0x0080: KeyVal=2; break;GPIO_Write(GPIOA,(GPIOA->ODR & 0xfff0 | 0x4);/讓PA3到PA0輸出二進(jìn)制的0100.switch(GPIOA->IDR & 0x00f0)/對(duì)PA4到PA7的值進(jìn)行判斷,以輸出不同的鍵值。Case 0x0010: KeyVal=13;break;Case 0x0020: KeyVal=9; break;Case 0x0040: Key
7、Val=5; break;Case 0x0080: KeyVal=1; break;GPIO_Write(GPIOA,(GPIOA->ODR & 0xfff0 | 0x8);/讓PA3到PA0輸出二進(jìn)制的1000.switch(GPIOA->IDR & 0x00f0)/對(duì)PA4到PA7的值進(jìn)行判斷,以輸出不同的鍵值。Case 0x0010: KeyVal=12;break;Case 0x0020: KeyVal=8; break;Case 0x0040: KeyVal=4; break;Case 0x0080: KeyVal=0; break;Return KeyV
8、al;/例程2:掃描法,等待釋放/*-*矩陣鍵盤(pán)驅(qū)動(dòng)文件: keyboard.c *編寫(xiě)人:LiuHui *描述:掃描4x4矩陣鍵盤(pán)輸入,并返回鍵值 *適用范圍:驅(qū)動(dòng)采用ST3.5庫(kù)編寫(xiě),適用于STM32F10x系列單片機(jī)*所用引腳:PA0-PA7 *編寫(xiě)時(shí)間:2014年5月20日-*/#include "stm32f10x.h"#include "keyboard.h"#include "dealy.h"/*-矩陣鍵盤(pán)初始化-*功能:初始化stm32單片機(jī)GPIO/PA0-PA7*參數(shù)傳遞:*輸入:無(wú)*返回值:無(wú)-*/Void Ke
9、yBoard_Init(void)GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=GPI
10、O_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);/輸出高電平GPIO_ResetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO
11、_Pin_7);/再次下拉為低電平/*-矩陣鍵盤(pán)掃描-*功能:掃描矩陣鍵盤(pán),并返回鍵值*參數(shù):*輸入:無(wú)*返回:有鍵按下返回該鍵值*無(wú)鍵按下時(shí)則返回0-*/u8 Read_KeyValue(void)u8 KeyValue=0;if(GPIO_ReadInputData(GPIOA)&0xff)!=0x0f)Delay_ms(10);if(GPIO_ReadInputData(GPIOA)&0xff)!=0x0f)GPIO_SetBits(GPIOA,GPIO_Pin_0);GPIO_ResetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_
12、3);switch(GPIO_ReadInputData(GPIOA)&0xff)case 0x11: KeyValue = 1; break;case 0x21: KeyValue = 5; break;case 0x41: KeyValue = 9; break;case 0x81: KeyValue = 13;break;GPIO_SetBits(GPIOA,GPIO_Pin_1);GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3);switch(GPIO_ReadInputData(GPIOA)&0xff)cas
13、e 0x12: KeyValue = 2; break;case 0x22: KeyValue = 6; break;case 0x42: KeyValue = 10;break;case 0x82: KeyValue = 14;break;GPIO_SetBits(GPIOA,GPIO_Pin_2);GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_3);switch(GPIO_ReadInputData(GPIOA)&0xff)Case 0x14: KeyValue =3; break;Case 0x24: KeyValue =
14、7; break;Case 0x44: KeyValue =11; break;Case 0x84: KeyValue =15; break;GPIO_SetBits(GPIOA,GPIO_Pin_3);GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2);switch(GPIO_ReadInputData(GPIOA)&0xff)Case 0x18:KeyValue=4;break;Case 0x28:KeyValue=8;break;Case 0x48:KeyValue=12;break;Case 0x88:KeyValue=
15、16;break;GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);GPIO_ResetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);while(GPIO_ReadInputData(GPIOA)&0xff)!=0x0f);return KeyValue;Return 0;/*-THE END-*/矩陣鍵盤(pán)驅(qū)動(dòng)*文件:keyboard.h*編寫(xiě)人:LiuHui*描述:掃描4x4矩陣鍵盤(pán)輸入,并返回鍵值*適用范圍:驅(qū)動(dòng)為ST3.5庫(kù)編寫(xiě),適用于S
16、TM32F10x系列單片機(jī)*所用引腳:PA0-PA7*編寫(xiě)時(shí)間:2013年11月22日*版本:1.0-*/#ifndef _KEYBOARD_H#define _KEYBOARD_HVoid KeyBoard_Init(void);u8 Read_KeyValue(void);#endif/*-THE END-*/例程3:掃描法,掃描有錯(cuò)誤?#include "stm32f10x.h"#include "delay.h"#include "key.h"/*本文件的函數(shù),主要實(shí)現(xiàn)矩陣鍵盤(pán)的功能。矩陣鍵盤(pán)使用PB0到PB7引腳,其中,PB
17、0到PB3固定為上拉輸入,PB4到PB7固定為下拉輸入。即,無(wú)鍵按下時(shí),對(duì)應(yīng)PB4到PB7為0,有鍵按下時(shí),PB4到PB7中,對(duì)應(yīng)的引腳為高。*/void KEY_Init(void) /初始化矩陣鍵盤(pán)要使用的GPIO口。 GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; /定義PB0到PB3為上拉輸入、。 GPIO_InitStructure.GPIO_Speed= GPI
18、O_Speed_50MHz; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3; GPIO_Init(GPIOB,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; /定義PB4到PB7為下拉輸入。 GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_
19、Pin_6|GPIO_Pin_7;GPIO_Init(GPIOB,&GPIO_InitStructure);S8 KEY_Scan(void) /實(shí)現(xiàn)矩陣鍵盤(pán)。返回值為,各按鍵的鍵值,此鍵值由用戶自己定義。 s8 KeyVal; /keyVal為最后返回的鍵值。 GPIO_Write(GPIOB,(GPIOB->ODR & 0xfff0 | 0xf); /先讓PB0到PB3全部輸出高。if(GPIOB->IDR & 0x00f0)=0x000f) /如果PB4到PB7全為0,則沒(méi)有鍵按下。此時(shí),返回值為-1. return -1; else delay_ms
20、(5); /延時(shí)5ms去抖動(dòng)。 if(GPIOB->IDR & 0x00f0)=0x000f)/延時(shí)5ms后PB4到PB7又全為0,則剛才電位變化是抖動(dòng)產(chǎn)生的. return -1; GPIO_Write(GPIOB,(GPIOB->ODR & 0xfff0 | 0xe); /讓PB3到PB0輸出二進(jìn)制的1110. switch(GPIOB->IDR & 0x00f0)/對(duì)PB4到PB7的值進(jìn)行判斷,以輸出不同的鍵值。 case 0x00e0: KeyVal=15; break; case 0x00d0: KeyVal=11; break; case
21、0x00b0: KeyVal=7; break; case 0x0070: KeyVal=3; break; GPIO_Write(GPIOB,(GPIOB->ODR & 0xfff0 | 0xd); /讓PB3到PB0輸出二進(jìn)制的1101. switch(GPIOB->IDR & 0x00f0)/對(duì)PB4到PB7的值進(jìn)行判斷,以輸出不同的鍵值。 case 0x00e0: KeyVal=14; break; case 0x00d0: KeyVal=10; break; case 0x00b0: KeyVal=6; break; case 0x0070: KeyVal
22、=2; break; GPIO_Write(GPIOB,(GPIOB->ODR & 0xfff0 | 0xb); /讓PB3到PB0輸出二進(jìn)制的1011. switch(GPIOB->IDR & 0x00f0)/對(duì)PB4到PB7的值進(jìn)行判斷,以輸出不同的鍵值。 case 0x00e0: KeyVal=13; break; case 0x00d0: KeyVal=9; break; case 0x00b0: KeyVal=5; break; case 0x0070: KeyVal=1; break; GPIO_Write(GPIOB,(GPIOB->ODR &a
23、mp; 0xfff0 | 0x7); /讓PB3到PB0輸出二進(jìn)制的0111. switch(GPIOB->IDR & 0x00f0) /對(duì)PB4到PB7的值進(jìn)行判斷,以輸出不同的鍵值。 case 0x00e0: KeyVal=12; break; case 0x00d0: KeyVal=8; break; case 0x00b0: KeyVal=4; break; case 0x0070: KeyVal=0; break; return KeyVal;/例程4:反轉(zhuǎn)法u8 check_Key(void)/ u16 cord_h,cord_l;/行列值中間變量 高位為行 ,低位為
24、列;u8 Val = 0xFF;/i=(GPIOG->ODR)&0xFFFF;GPIOG->CRL=0x33888844; /2-5上下拉輸入,6-9PP輸出GPIOG->CRH=0x44444433; Delay_1us();GPIOG->ODR = 0xFC3F; /行線輸出全為0/1111 1100 0011 1111,列線上拉輸入Delay_1us();cord_h = GPIOG->IDR & 0x003C; /讀入列線值 /0000 0000 0011 1100if(cord_h != 0x003C) /先檢測(cè)有無(wú)按鍵按下 /0000
25、0000 0011 1100Delay_Nms(100); /去抖if(cord_h != 0x003C) / 0000 0000 0000 0000 /1111 1100 0011 1111 cord_h = GPIOG->IDR&0x003C; /讀入列線值/GPIOG->CRL=0x88333344; /9-6輸入,5-2輸出GPIOG->CRH=0x44444488; Delay_1us();/ 00000000000111000GPIOG->ODR = cord_h|0xFFC3; /輸出當(dāng)前列線值1111 1111 1100 0011Delay_Nm
26、s(2);/ 此延時(shí)比不可少;/ cord_l = GPIOG->IDR&0x03C0; /讀入行線值 0000 0011 1100 0000Delay_1us();cord_h>>=2;cord_l>>=2;Val = (cord_h+cord_l)&0xff;return Val; /鍵盤(pán)最后組合碼值 return 0xFF; /無(wú)按鍵返回該值FF/例程5:中斷行+列輸入法列線是D4,D5,D6,D7連接了VDD,電平被拉高,行線是D0,D1,D2,D3。程序的功能:當(dāng)按下鍵,指示燈會(huì)產(chǎn)生亮滅,次數(shù)為相應(yīng)按鍵編號(hào)。設(shè)計(jì)原理:1.行線檢測(cè)到按鍵觸
27、發(fā)行線設(shè)置為下拉輸入,列線設(shè)置為上拉輸入。當(dāng)有鍵按下時(shí),行線所對(duì)應(yīng)的中斷號(hào)產(chǎn)生上升沿觸發(fā)。2.列線檢測(cè)具體哪一列有鍵按下時(shí),把行線設(shè)置為推挽輸出,輸出低電平。列線設(shè)置為上拉輸入。通過(guò)檢測(cè)哪一根列線是低電平來(lái)確定列線。核心程序:/行線和列線的配置void GPIO_Config() RCC->APB2ENR|=1<<(2+KEYIOEN); KEYIO->CRL&=0x00000000; KEYIO->CRL|=0x88888888;/上下拉輸入 KEYIO->ODR|=0x000000F0;/列線7-4上拉,行線3-0下拉/檢測(cè)列u8 ReadCol
28、umn() u8 c=0; u32 temp; GPIOD->CRL&=0x00000000; GPIOD->CRL|=0x88883333;/列線7-4上拉,行線3-0輸出0 GPIOD->ODR|=0x000000F0; temp=(GPIOD->IDR&0x000000F0)>>4; if(temp=0x0000000E) c=0; if(temp=0x0000000D) c=1; if(temp=0x0000000B) c=2; if(temp=0x00000007) c=3; GPIO_Config(); return c;/中斷配
29、置void EXTI_Config() NVIC_Config(GPIO_D,0,RTRI); NVIC_Config(GPIO_D,1,RTRI); NVIC_Config(GPIO_D,2,RTRI); NVIC_Config(GPIO_D,3,RTRI); PriorityGroup_Config(2); Priority_Config(2,2,EXTI0_IRQChannel,2); Priority_Config(2,2,EXTI1_IRQChannel,2); Priority_Config(2,2,EXTI2_IRQChannel,2); Priority_Config(2,2,
30、EXTI3_IRQChannel,2);/中斷處理程序void EXTI0_IRQHandler() func(4*0+ReadColumn(); EXTI->PR=1<<0; void EXTI1_IRQHandler() func(4*1+ReadColumn(); EXTI->PR=1<<1; void EXTI2_IRQHandler() func(4*2+ReadColumn(); EXTI->PR=1<<2;void EXTI3_IRQHandler() func(4*3+ReadColumn(); EXTI->PR=1&
31、lt;<3;附:完整程序#include<stm32f10x_lib.h>#define KEYIO GPIOD#define KEYIOEN 3#define GPIO_D 3#define FTRI 1#define RTRI 2void LED_Config() RCC->APB2ENR|=1<<(2+4); GPIOE->CRL&=0x00000000; GPIOE->CRL|=0x00000003; GPIOE->ODR|=0x00000001;void func(u32 n) int i,temp; for(i=0;i&
32、lt;2*n;i+) if(i%2=0) GPIOE->ODR&=0x00000000; else GPIOE->ODR|=0x00000001; temp=1000000; while(temp-); void GPIO_Config() RCC->APB2ENR|=1<<(2+KEYIOEN); KEYIO->CRL&=0x00000000; KEYIO->CRL|=0x88888888; KEYIO->ODR|=0x000000F0;void NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM) u8
33、EXTIADDR=BITx/4; u8 EXTIOFFSET=(BITx%4)*4; RCC->APB2ENR|=0x00000001; AFIO->EXTICREXTIADDR&=(0x000F<<EXTIOFFSET); AFIO->EXTICREXTIADDR|=GPIOx<<EXTIOFFSET; EXTI->IMR|=1<<BITx; if(TRIM&0x01) EXTI->FTSR|=1<<BITx; if(TRIM&0x02) EXTI->RTSR|=1<<BI
34、Tx;void PriorityGroup_Config(u8 NVIC_Group) SCB->AIRCR&=0x0000F8FF; SCB->AIRCR|=0x05FA0000; SCB->AIRCR|=(NVIC_Group)&0x07)<<8;void Priority_Config(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group) NVIC->ISERNVIC_Channel/32|=1<<(NVIC_Channel
35、%32); NVIC->IPRNVIC_Channel/4=(NVIC_PreemptionPriority<<(4-NVIC_Group)|(NVIC_SubPriority&(0x0F>>NVIC_Group)&0x0000000F)<<(NVIC_Channel%4)*8+4);void EXTI_Config() NVIC_Config(GPIO_D,0,RTRI); NVIC_Config(GPIO_D,1,RTRI); NVIC_Config(GPIO_D,2,RTRI); NVIC_Config(GPIO_D,3,RTRI
36、); PriorityGroup_Config(2); Priority_Config(2,2,EXTI0_IRQChannel,2); Priority_Config(2,2,EXTI1_IRQChannel,2); Priority_Config(2,2,EXTI2_IRQChannel,2); Priority_Config(2,2,EXTI3_IRQChannel,2);u8 ReadColumn() u8 c=0; u32 temp; GPIOD->CRL&=0x00000000; GPIOD->CRL|=0x88883333; GPIOD->ODR|=0x
37、000000F0; temp=(GPIOD->IDR&0x000000F0)>>4; if(temp=0x0000000E) c=0; if(temp=0x0000000D) c=1; if(temp=0x0000000B) c=2; if(temp=0x00000007) c=3; GPIO_Config(); return c;void EXTI0_IRQHandler() func(4*0+ReadColumn(); EXTI->PR=1<<0; void EXTI1_IRQHandler() func(4*1+ReadColumn(); EX
38、TI->PR=1<<1; void EXTI2_IRQHandler() func(4*2+ReadColumn(); EXTI->PR=1<<2;void EXTI3_IRQHandler() func(4*3+ReadColumn(); EXTI->PR=1<<3;int main() LED_Config(); GPIO_Config(); EXTI_Config(); while(1) /例程6:中斷行評(píng)定法,中斷服務(wù)程序有問(wèn)題?#include<stm32f10x_lib.h>#define KEYIO GPIOD#d
39、efine KEYIOEN 3#define GPIO_D 3#define FTRI 1#define RTRI 2void LED_Config() RCC->APB2ENR|=1<<(2+4); GPIOE->CRL&=0x00000000; GPIOE->CRL|=0x00000003; GPIOE->ODR|=0x00000001;void GPIO_Config() RCC->APB2ENR|=1<<(2+KEYIOEN); KEYIO->CRL&=0x00000000; KEYIO->CRL|=0x
40、33338888; KEYIO->ODR|=0x000000F0;void NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM) u8 EXTIADDR=BITx/4; u8 EXTIOFFSET=(BITx%4)*4; RCC->APB2ENR|=0x00000001; AFIO->EXTICREXTIADDR&=(0x000F<<EXTIOFFSET); AFIO->EXTICREXTIADDR|=GPIOx<<EXTIOFFSET; EXTI->IMR|=1<<BITx; if(TRIM&am
41、p;0x01) EXTI->FTSR|=1<<BITx; if(TRIM&0x02) EXTI->RTSR|=1<<BITx;void PriorityGroup_Config(u8 NVIC_Group) SCB->AIRCR&=0x0000F8FF; SCB->AIRCR|=0x05FA0000; SCB->AIRCR|=(NVIC_Group)&0x07)<<8;void Priority_Config(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u
42、8 NVIC_Channel,u8 NVIC_Group) NVIC->ISERNVIC_Channel/32|=1<<(NVIC_Channel%32); NVIC->IPRNVIC_Channel/4=(NVIC_PreemptionPriority<<(4-NVIC_Group)|(NVIC_SubPriority&(0x0F>>NVIC_Group)&0x0000000F)<<(NVIC_Channel%4)*8+4);void EXTI_Config() NVIC_Config(GPIO_D,0,RTRI);
43、 NVIC_Config(GPIO_D,1,RTRI); NVIC_Config(GPIO_D,2,RTRI); NVIC_Config(GPIO_D,3,RTRI); PriorityGroup_Config(2); Priority_Config(2,2,EXTI0_IRQChannel,2); Priority_Config(2,2,EXTI1_IRQChannel,2); Priority_Config(2,2,EXTI2_IRQChannel,2); Priority_Config(2,2,EXTI3_IRQChannel,2);void EXTI0_IRQHandler() GPI
44、OE->ODR&=0x00000000; EXTI->PR=1<<0; void EXTI1_IRQHandler() GPIOE->ODR&=0x00000000; EXTI->PR=1<<1; void EXTI2_IRQHandler() GPIOE->ODR&=0x00000000; EXTI->PR=1<<2;void EXTI3_IRQHandler() GPIOE->ODR&=0x00000000; EXTI->PR=1<<3;int main() LE
45、D_Config(); GPIO_Config(); EXTI_Config(); while(1) /例程7:掃描法#ifndef _COMMON_H #define _COMMON_H #include "stm32f10x.h" /* 4*4矩陣鍵盤(pán) */ void keyboard_init(void); void update_key(void); extern unsigned char key44;#endif /*矩陣鍵盤(pán).c文件*/#include "common.h"struct io_port GPIO_TypeDef *GPIO_
46、x; unsigned short GPIO_pin; static struct io_port key_output4 = GPIOD, GPIO_Pin_0, GPIOD, GPIO_Pin_1,GPIOD, GPIO_Pin_2, GPIOD, GPIO_Pin_3;static struct io_port key_input4 = GPIOD, GPIO_Pin_4, GPIOD, GPIO_Pin_5,GPIOD, GPIO_Pin_6, GPIOD, GPIO_Pin_7;unsigned char key44;void keyboard_init(void) GPIO_Ini
47、tTypeDef GPIO_InitStructure;unsigned char i;/* 鍵盤(pán)行掃描輸出線 輸出高電平 */* PA0 PA1 PA2 PA3 輸出*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD, &GPIO_InitSt
48、ructure);/* 鍵盤(pán)列掃描輸入線 鍵被按時(shí)輸入高電平 放開(kāi)輸入低電平 */* PA4 PA5 PA6 PA7 輸入*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOD, &GPIO_InitStructure);for(i = 0; i < 4; i+) GPIO_SetBits(key_outputi.GPIO_x, key_outputi.GPIO_pin);void update_key(void)unsigned char i, j;for(i = 0; i < 4; i+) /i是輸出口,依次置低電平 GPIO_ResetBits(key_outputi.GPIO_x, key_outputi.GPIO_pin); for(j = 0; j < 4; j+) /j是輸入口,當(dāng)鍵按下時(shí)導(dǎo)通被置為低電平 if(GPIO_ReadInputDataBit(key_inputj.GPIO_x, key_inputj.GPIO_pin) = 0) keyij =
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2019-2025年中國(guó)羊毛紗行業(yè)市場(chǎng)調(diào)研分析及投資戰(zhàn)略咨詢(xún)報(bào)告
- 高一學(xué)生學(xué)習(xí)計(jì)劃15篇
- 一年級(jí)語(yǔ)文拼音教案
- 我的學(xué)習(xí)計(jì)劃15篇
- 《童年》讀后感(匯編15篇)
- 小班戶外活動(dòng)親子踩墊子游戲教案
- 初一政治教學(xué)計(jì)劃范文集錦六篇
- 公司年會(huì)活動(dòng)方案模板錦集六篇
- 乒乓球比賽作文300字集合10篇
- 冀教版四年級(jí)科學(xué)上冊(cè)第一單元《物體的運(yùn)動(dòng)》教案
- 學(xué)憲法講憲法知識(shí)競(jìng)賽活動(dòng)方案
- MOOC 國(guó)際私法-暨南大學(xué) 中國(guó)大學(xué)慕課答案
- 《客艙安全與應(yīng)急處置》-課件:應(yīng)急撤離的原因和原則
- 前列腺電切術(shù)麻醉管理
- 2024年畢節(jié)市融資擔(dān)保集團(tuán)有限公司招聘筆試參考題庫(kù)附帶答案詳解
- 椎管內(nèi)腫瘤切除術(shù)的手術(shù)后護(hù)理
- 《糧油食品加工技術(shù)》課程標(biāo)準(zhǔn)
- 華碩電腦行業(yè)供應(yīng)鏈的管理措施及策略
- 2023年普通高中體育課程標(biāo)準(zhǔn)
- 數(shù)控車(chē)削編程與加工(FANUC系統(tǒng)) 章節(jié)練習(xí)題及答案
- 供應(yīng)鏈年終工作總結(jié)報(bào)告
評(píng)論
0/150
提交評(píng)論