在前几篇文章,GPIO的运用:点亮LED!中只叙述了IO口的输出,并没有输入,因为IO作为输入我主张选用中止方法,能够大大减轻CPU的运转时刻。最常用的便是按钮的功用了,当然还有和其他芯片通讯的功用。
前篇文章讲过GPIO能够经过寄存器设置为中止输入。
装备形式DDRCR1CR2装备形式上拉电阻
输入000悬浮输入 OFF
010上拉输入ON
001中止悬浮输入 OFF
011中止上拉输入ON
输出100开漏输出 OFF
110推挽输出
1×1输出(最快速度10MHZ)
xxx真实的开漏输出未选用
这儿咱们选用PC3作为外部中止
void EXIT_GPIO_Init(void)
{
PC_DDR &= 0xf7;
PC_CR1 |= 0x08; // 将PC3设置成中止上拉输入
PC_CR2 |= 0x08;
EXTI_CR1 = 0x20; //PC设置为下降沿触发
}
这儿需求留意的是,中止向量指定的是PC,也便是说假如有几个PC口都设置为中止的话,只需其间一个中止呼应,就会进入同一个函数。
假如你有好几个按键在同一个port口的话,能够在进入中止函数之后做一个IO口状况的获取,断定哪个IO进行了中止,再对应相应的操作。
#pragma vector = EXIT_PORTC_vector //0x07
__interrupt void EXIT_PORTC_RQHandler(void) //中止服务函数
{
if((PC_IDR & 0x08)==0)
{
delay_nms(50); //延时50ms,消抖
if((PC_IDR & 0x08)==0) //再判别是否按下
{
while(!(PC_IDR & 0x08)); //松手检测
//TODO
}
}
}
因为运用了机械按钮,一般都会有一个机械颤动的进程,所以进入了中止函数之后,咱们先做一个消抖处理,这样就能够判别按钮的状况,一起也避免颤动造成了屡次中止函数的重复进入。最终参加松手检测,断定按钮动作完结。(TODO这儿就能够参加你需求的操作了)
附上stm8s在IAR环境下的项目工程,包含了SPI、IIC、PWM、AWU、USART、EEPROM等片上硬件的初始化代码。
http://download.csdn.net/detail/devintt/9454188