新手上路
- 积分
- 43
- 金钱
- 43
- 注册时间
- 2019-5-16
- 在线时间
- 12 小时
|
10金钱
我想通过按键中断(KEY0按键)来做一个oled的界面切换。同时在不同界面下KEY1按键来做一个外部的数值输入。我单独使用KEY0和KEY1时,都是显示没有问题的。但是两个放一起使用,就会出现卡死,无论我怎么按KEY0,oled界面都不会变化。下面是我的程序。想请问一下这是什么原因呢?
- int main (void){//主程序
- menu=0;
- int a=0;
- RCC_Configuration();
- NVIC_Configuration();
-
- KEY_Init();//KEY1按键初始化
- I2C_Configuration();
- OLED0561_Init(); //OLED初始化
- KEY_INT_INIT ();//KEY0按键中断初始化
- OLED_DISPLAY_LIT(100);
- delay_s(1);
- OLED_DISPLAY_CLEAR();
- while(1){
- if(menu==0)
- {
- OLED_DISPLAY_CLEAR();
- while(menu==0){
- OLED_DISPLAY_16x16(4,0*16,19);//显示汉字
- OLED_DISPLAY_16x16(4,1*16,20);
- OLED_DISPLAY_16x16(4,2*16,21);
- OLED_DISPLAY_16x16(4,3*16,22);
- OLED_DISPLAY_8x16(4,8*8,'m');
- OLED_DISPLAY_8x16(4,9*8,'e');
- OLED_DISPLAY_8x16(4,10*8,'n');
- OLED_DISPLAY_8x16(4,11*8,'u');
- OLED_DISPLAY_16x16(4,6*16,23);
- OLED_DISPLAY_8x16(4,15*8,'!');
- }
- }
- if(menu==1){
- OLED_DISPLAY_CLEAR();
- while(menu==1){
- OLED_DISPLAY_16x16(2,1*16,8);
- OLED_DISPLAY_16x16(2,2*16,9);
- OLED_DISPLAY_16x16(2,3*16,10);
- OLED_DISPLAY_16x16(2,4*16,11);
- OLED_DISPLAY_16x16(2,5*16,12);
- OLED_DISPLAY_8x16(2,12*8,':');
- OLED_DISPLAY_8x16(5,7*8,a/100+0x30);
- OLED_DISPLAY_8x16(5,8*8,a%100/10+0x30);
- OLED_DISPLAY_8x16(5,9*8,'.');
- OLED_DISPLAY_8x16(5,10*8,a%10+0x30);
- OLED_DISPLAY_8x16(5,11*8,'b');
- OLED_DISPLAY_8x16(5,12*8,'a');
- OLED_DISPLAY_8x16(5,13*8,'r');
- if(!KEY1){
- delay_ms(10);
- if(!KEY1){
- a++;
- while(!KEY1);
- }
- }
- }
- }
- if(menu==2){
- OLED_DISPLAY_CLEAR();
- OLED_DISPLAY_16x16(2,1*16,8);//汉字显示
- OLED_DISPLAY_16x16(2,2*16,9);
- OLED_DISPLAY_16x16(2,3*16,13);
- OLED_DISPLAY_16x16(2,4*16,14);
- OLED_DISPLAY_16x16(2,5*16,12);
- OLED_DISPLAY_8x16(2,12*8,':');
- while(menu==2)
- {
- OLED_DISPLAY_8x16(5,7*8,a/100+0x30);
- OLED_DISPLAY_8x16(5,8*8,a%100/10+0x30);
- OLED_DISPLAY_8x16(5,9*8,'.');
- OLED_DISPLAY_8x16(5,10*8,a%10+0x30);
- if(!KEY1){
- delay_ms(10);
- if(!KEY1){
- a++;
- while(!KEY1);
- }
- }
- }
- }
-
- }
- }
复制代码- #include "NVIC.h"
- #include "delay.h"
- u8 menu;//ÖD¶Ï±ê־λ
- void KEY_INT_INIT (void){ //°′¼üÖD¶Ï3õê¼»ˉ
- NVIC_InitTypeDef NVIC_InitStruct; //¶¨òå½á11ìå±äá¿
- EXTI_InitTypeDef EXTI_InitStruct;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); //Æô¶ˉGPIOê±Öó £¨Dèòaóë¸′óÃê±Öóò»í¬Æô¶ˉ£©
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE);//ÅäÖö˿úÖD¶ÏDèòaÆôóø′óÃê±Öó
- GPIO_InitTypeDef GPIO_InitStructure; //¶¨òåGPIOμÄ3õê¼»ˉö¾ù½á11
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //Ñ¡Ôñ¶Ë¿úoÅ£¨0~15»òall£©
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //Ñ¡ÔñIO½ó¿ú1¤×÷·½ê½ £¬éÏà-êäèë
- GPIO_Init(GPIOC,&GPIO_InitStructure);
- GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource5); //¶¨òå GPIO ÖD¶Ï
-
- EXTI_InitStruct.EXTI_Line=EXTI_Line5; //¶¨òåÖD¶ÏÏß
- EXTI_InitStruct.EXTI_LineCmd=ENABLE; //ÖD¶Ïê1Äü
- EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt; //ÖD¶ÏÄ£ê½Îa ÖD¶Ï
- EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling; //ϽμÑØ′¥·¢
- EXTI_Init(& EXTI_InitStruct);
-
- NVIC_InitStruct.NVIC_IRQChannel=EXTI9_5_IRQn; //ÖD¶ÏÏß
- NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE; //ê1ÄüÖD¶Ï
- NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1; //ÇàÕ¼óÅÏè¼¶
- NVIC_InitStruct.NVIC_IRQChannelSubPriority=0; //×óóÅÏè¼¶
- NVIC_Init(& NVIC_InitStruct);
- }
- void EXTI9_5_IRQHandler(void){
- if(EXTI_GetITStatus(EXTI_Line5)!=RESET){//ÅD¶ÏÄ3¸öÏßéÏμÄÖD¶ÏêÇ·ñ·¢éú
- delay_ms(10);
- if(EXTI_GetITStatus(EXTI_Line5)!=RESET) menu++;//±ê־λÖÃ1£¬±íê¾óD°′¼üÖD¶Ï
- if(menu==3) menu=0;
- EXTI_ClearITPendingBit(EXTI_Line5); //Çå3y LINE éÏμÄÖD¶Ï±ê־λ
- }
复制代码- void KEY_Init(void){ //½ó¿ú3õê¼»ˉ
- GPIO_InitTypeDef GPIO_InitStructure; //¶¨òåGPIOμÄ3õê¼»ˉö¾ù½á11
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //Ñ¡Ôñ¶Ë¿úoÅ£¨0~15»òall£©
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //Ñ¡ÔñIO½ó¿ú1¤×÷·½ê½ £¬éÏà-êäèë
- GPIO_Init(GPIOC,&GPIO_InitStructure);
- }
-
复制代码
|
|