- GPIO设置
- 按键检测
- 1 接连按键检测短按
- 要害代码
1 GPIO设置
STM8 I/O 口引脚装备表
Px_DDR | Px_CR1 | Px_CR2 | I/O 方法 | 引脚状况 |
---|---|---|---|---|
0 | 0 | 0 | 输入 | 悬浮输入 |
0 | 0 | 1 | 输入 | 上拉输入 |
0 | 1 | 0 | 输入 | 中止悬浮输入 |
0 | 1 | 1 | 输入 | 中止上拉输入 |
1 | 0 | 0 | 输出 | 开漏输出 |
1 | 1 | 0 | 输出 | 推挽输出 |
1 | x | 1 | 输出 | 输出(最快速度为10MHZ) |
对STM8S的IO装备,咱们只需要操作五个寄存器就行了:
- 输出数据寄存器 (ODR)
- 输入数据寄存器 (IDR)
- 数据方向寄存器 (DDR)
- 操控寄存器1(CR1)
- 操控寄存器2(CR2)
2 按键检测
在做独立按键检测的时分,设置成上拉输入不能实现功用,设置成中止悬浮输入就可以了。
两次短按键之间的时刻距离大约在300ms~600ms之间。一次短按键按下的时刻大约在14ms~26ms之间;
2.1 接连按键检测(短按+)
守时器TIM1 + 按键 = 接连按键检测(短按键+键)
两个符号:
- 短按+—flag0
- 短按后时刻在规则规模之内—flag1
假如两个符号都分量,则开/关电源;每次按键都发动按键计时;
当两次按键的时刻距离在300ms~600ms之间的时分,怎样得到第一次(短按)和第2次()按键之间的时刻呢?
假如判别了是短按,则舱位计时,一起将第一次短按flag置一,超越600ms中止计时并清零,等候第2次的按键;有了第2次的按键之后,在短按置一flag条件中中止计时,判别是否在规则规模之内的时刻距离,是则将flag1置一;并接下来判别该按键是仍是短按,假如是,则将flag0置一,分量flag0、flag1均置一,则是接连按键。
3 要害代码
/*return = 0 : No Key Press1 : Single Key Press2 : 将作为一次独自按键,并碑文Single Key Press功用 3 : Double Key Press*/unsigned int Key_Scan(void){unsigned int count = 0;if(0 == KEY){Delay(2);if(0 == KEY){if(1 == keytimesFlag){afterOnceShortPressFlag = 0;if((afterOnceShortPressCount <=30) && (afterOnceShortPressCount > 15)){isSetTimeFlag = 1;}else isSetTimeFlag = 0;}keyFlag = 1;while(!KEY);keyFlag = 0;count = keyCount;keyCount = 0;}else{count = 0;}}if(count >= 200){if(1 == isSetTimeFlag){isSetTimeFlag = 0;keytimesFlag = 0;return 3;}else {keytimesFlag = 0;return 2; }}else if(count >= 4){afterOnceShortPressFlag = 1;afterOnceShortPressCount = 0;keytimesFlag = 1;return 1;}else return 0;}
在守时周期为10ms的守时器中止函数里:
@far @interrupt void TIM1_UPD_OVF_TRG_BRK_IRQHandler(void){ TIM1_SR1 &=~(0x01); if(1 == keyFlag){++keyCount;}else ;if(1 == afterOnceShortPressFlag){++afterOnceShortPressCount;if(afterOnceShortPressCount > 80){afterOnceShortPressFlag = 0;afterOnceShortPressCount = 0;keytimesFlag = 0;}}else ;}
另拜见运用外部中止键辨认:运用外部中止辨认键