【示例程序2:IDR寄存器的用法】 /* 程序功能: 当按键K1(PB1)按下不放时PB8亮, 松开后PB8灭 完整地按下并松开按键K1后,PB15的亮灭状态改变 */ #include <stm32f10x.h>
#define _BV(n) (1 << (n)) #define BIT _BV
#define PORTB GPIOB->ODR #define PINB GPIOB->IDR
#define K1 (PINB & _BV(1))
void delay() { uint32_t i; for (i = 0; i < 40000; i++); }
void init() { int i; RCC->APB2ENR |= _BV(3); // 打开GPIOB的时钟
// 把PB0~7都设置为输入模式 for (i = 0; i < 8; i++) { GPIOB->CRL &= ~(_BV(4 * i + 1) | _BV(4 * i)); // MODE=00: 输入模式
GPIOB->CRL |= _BV(4 * i + 3); // CNF=10: 上拉/下拉输入 GPIOB->CRL &= ~_BV(4 * i + 2); } // 把PB8~15都设置为输出模式 for (i = 0; i < 8; i++) GPIOB->CRH |= _BV(4 * i + 1) | _BV(4 * i); // MODE=11: 输出模式, 最大速度为50MHz }
int main() { init(); PORTB = _BV(8); // 一开始只点亮PB8 while (1) { // 当按键按下时,输入低电平 // 当按键松开时,输入高电平 if (!K1) // 当按键按下时,即PB1输入为低电平时 { PORTB |= _BV(10); // 点亮PB10
// 消抖处理 delay(); if (!K1) { PORTB ^= _BV(15); // 反转PB15 while (!K1); }
// 注意: 如果主程序是扫描数码管的程序scan_7seg的话 // 就必须把delay换成scan_7seg,并且while(!K1)里面也要调用scan_7seg // 防止按键影响数码管的显示 } else PORTB &= ~_BV(10); // 熄灭PB10 } }
void SystemInit() { }
|