2019 3/10 中断与按键控制

2019 3/10 中断与按键控制

上午

上午的主要任务是完成按键控制

1.首先观察按键控制的相关原理图:
2019 3/10 中断与按键控制
找到KEY UP,K1,K2,K3
2019 3/10 中断与按键控制
2019 3/10 中断与按键控制
初始化GPIOA,GPIOE
KEY UP键的模式要设置为下拉输入GPIO_Mode_IPD
而剩下LEFT RIGHT DOWN 要设置为上拉输入GPIO_Mode_IPU
之所以这样设置结合原理图
如果没有上拉电阻,在没有外界输入的情况下输入端是悬空的,他的电平是位置的无法保证的,上啦电阻就是为了保证悟性好输入时输入端的电平为高电平,同样还有下拉电阻是为了保证无信号输入时输入端的电平为低电平
按键函数KEY_Scan(u8 mode)
当mode为1时 为连续扫描 当mode为0时单次扫描
当mode为1时第一次扫描过后 key依然为1,因此在按住按键时扫描不断进行,而当mode为0时扫描第一次过后就停止了
u8 KEY_Scan(u8 mode)//
{
static u8 key=1;

if(key1&&(K_UP1||K_DOWN0||K_LEFT0||K_RIGHT0))
{
delay_ms(10);
key=0;
if(K_UP
1)
return KEY_UP;
else if(K_DOWN0)
return KEY_DOWN;
else if(K_LEFT
0)
return KEY_LEFT;
else
return KEY_RIGHT;
}
else if(K_UP0&&K_DOWN1&&K_LEFT1&&K_RIGHT1)
{
key=1;
}
if(mode==1)
{
key=1;
}
return 0;
}
上午时间由于之前图片无法烧入又花了一些时间
在之前图片无法烧入后面找到了原因
1.首先是应该把烧入的数组指针 gImage_pic 强制转换为(u8*)类型,而我之前的做法是将函数中的类型改成我数组指针的类型,有点相反。
2.其次在烧入图片中必须将图片的大小定义为与机器屏幕大小相同才可以,否则会出现很诡异的图案。

下午

中断的了解

下午主要运用中断进行按键控制
在变成中常用的是ISER,ICER和IP这三个寄存器。
ISER用于使能中断。
ICER用来清除中断。
IP用来设置中断优先级
中断编程三部曲
1.必须使能外设莫格中断,具体对应的中断使能位控制。(开启GPIO相应的时钟 AE 并且用到EXTI必须开启AFIO时钟)
2.初始化NVIC_InitTypeDef结构体,配置中断优先级分组,设置抢占优先级和响应优先级使能中断请求。
NVIC_IRQChannel()设置不同的中断源,在IRQn_Type IRQn结构体寻找自己对应的中断源。
NVIC_IRQChannelPreemptionPriority()设置抢占优先级
NVIC_IRQChannelCmd() 中断使能或者取消使能
3.编写中断服务函数。
类似于
void EXTIO_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line0)==SET)
{
led2=0;
delay_ms(2000);
led2=1;
}
EXTI_ClearITPendingBit(EXTI_Line0);
}

遇到的问题

在中断函数的应用中,设在EXTI_LION0上的 KEY UP按键在MAIN函数中的应用一定得加入到while循环中才可以使用,2019 3/10 中断与按键控制而其他的按键则不需要

心得体会

由于对硬件各个方面都很生疏,遇到了很多比较难以了解的内容,需要认真一些,多了解一些,才能够才出错的时候找出错误的原因,不能只在表面的已经包装好的函数层面上。