上一篇:[嵌入式软件][入门篇] 搭建在线仿真平台(STM32)
#include <stdint.h>
#include <stdio.h>
#include "sys.h"
#include "stm32f10x_conf.h"
#include "delay.h"
#include "led.h"
int main() {
//LED初始化
LED_Init();
// 由于LED接了VCC, 引脚高电平,无法导通电路,所以低电平点亮,即VCC(火线)-->GND(地线/零线)
while(1) {
LED = 1; // 高电平熄灭
delay_ms(50);
LED = 0; // 低电平点亮
delay_ms(50);
/* 可用简写为:
LED = !LED; // 取反
delay_ms(50);
*/
}
}
电路中,一高一低,才能正常工作。
按键的基本原理是设置单片机IO口(PA1)为输入状态,如DDRB = 0XF0(方向寄存器,“1”为输出,“0”为输入);
单片机一直检测按键端口(PA1)的状态,当端口为高电平时(即按键按下),实行相应的动作(比如控制LED灯)。
原理就是这么回事,但是正真实现时,按键会有抖动,要进行按键去抖。
① 按键实行一个动作过程是需要一定时间的,一般为100mS-1S左右,而一个单片机执行一个机器周期的时间很短,时钟为10MH的周期为0.1μs,
② 这样按键每一次动作程序就会多次检测按键,出现误判(一次按下,多次动作)。
③ 一般消抖都是用延时10ms,来过滤抖动。
每次按下,红灯点亮,松开按键红灯熄灭。
#include <stdint.h>
#include <stdio.h>
#include "sys.h"
#include "stm32f10x_conf.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#define io_get(gpio, pin) GPIO_ReadInputDataBit(gpio, pin)
int main() {
// LED初始化
LED_Init();
// 按键初始化
KEY_Init();
// 由于LED接了VCC, 引脚高电平,无法导通电路,所以低电平点亮,即VCC(火线)-->GND(地线/零线)
while(1) {
if (io_get(GPIOA, GPIO_Pin_1) == KEY_ON) {
LED = 0; // 低电平点亮
} else {
LED = 1; // 高电平熄灭
}
delay_ms(10);
}
}
每次按下,红灯点亮,松开按键红灯熄灭。
模拟家中电灯,一个完整的开关。
#include <stdint.h>
#include <stdio.h>
#include "sys.h"
#include "stm32f10x_conf.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#define io_get(gpio, pin) GPIO_ReadInputDataBit(gpio, pin)
int main() {
// LED初始化
LED_Init();
// 按键初始化
KEY_Init();
// 由于LED接了VCC, 引脚高电平,无法导通电路,所以低电平点亮,即VCC(火线)-->GND(地线/零线)
while(1) {
if (Key_Scan(GPIOA, GPIO_Pin_1)) { // 检测按键整个过程。按下->松开
LED = !LED; // 每次按下,切换开关。低电平点亮 高电平熄灭
}
}
}
按一次,点亮,再按下,则熄灭。