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