【示例程序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() { }
|