本帖最后由 slotg 于 2019-2-18 00:39 编辑
整合前面几个 LAB 的功能我们来实现一个秒表计时器,STM8S001J3 扣除了 SPI 使用的引脚之外可用的 GPIO 就只剩下 pin1 跟 pin6 了,以秒表计时器所需要的功能我们规划 pin1 做为计时开始/停止按钮,按下按钮后计时器以 10ms 间隔加 1 累积,再按一次则停止计时,而 pin6 为清零按钮,按下按钮后计时器清零。
先建立一个显示的函数,参数为 0 时显示 0.00:
- // Display TIMER data
- void DS_TIMER(uint32_t dta)
- {
- uint8_t buf[8];
- int8_t x,y;
- bool fg;
- for(x=0; x<8; x++)
- {
- buf[x] = dta%10;
- dta /= 10;
- }
- fg = FALSE;
- for(x=7; x>=0; x--)
- {
- if(buf[x] != 0 || fg==TRUE || x<=2)
- {
- y = buf[x];
- if(x==2)
- {
- y |= 0x80;
- }
- TX_MAX7219(x+1,y);
- fg = TRUE;
- }
- else
- TX_MAX7219(x+1,0x0f);
- }
- }
复制代码
按钮的处理方式可参考 【STM8-SO8】04-定时器TIM4的使用 内容。在这里我们设定 TIM4 每 2ms 中断一次,程序中宣告一个 fg_action 变量做为 TIM4 中断时是否累积计时器 tmr_cnt,当 fg_action 为 FALSE 不计数,为 TRUE 时每隔 10ms 计数加 1。
TIM4 中断程序:
- INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)
- {
- static uint8_t x;
-
- // for TIMER count
- if(fg_action)
- {
- if(++x >= 05)
- {
- x = 0;
- tmr_cnt++;
- fg_ref_tmr = TRUE;
- }
- }
- // for key sw
- if(GPIO_ReadInputPin(KEY1_GPIO_PORT, KEY1_GPIO_PINS))
- {
- key1_cnt = 0;
- }
- else
- {
- if(key1_cnt != 0xff)
- key1_cnt++;
- }
- if(GPIO_ReadInputPin(KEY2_GPIO_PORT, KEY2_GPIO_PINS))
- {
- key2_cnt = 0;
- }
- else
- {
- if(key2_cnt != 0xff)
- key2_cnt++;
- }
- /* Clear Interrupt Pending bit */
- TIM4_ClearITPendingBit(TIM4_IT_UPDATE);
- }
复制代码
main 回圈:- void main(void)
- {
- /* -------------STM8S001 startup-------------- */
- /* delay for SWIM connection: ~5seconds */
- STARTUP_SWIM_DELAY_5S;
-
- /* configure unbonded pins */
- CONFIG_UNUSED_PINS_STM8S001;
-
- GPIO_Init(GPIOA, GPIO_PIN_3, GPIO_MODE_OUT_PP_HIGH_FAST); // NSS
- GPIO_WriteHigh(GPIOA, GPIO_PIN_3);
-
- GPIO_Init(KEY1_GPIO_PORT, KEY1_GPIO_PINS, GPIO_MODE_IN_PU_NO_IT); // pin1
- GPIO_Init(KEY2_GPIO_PORT, KEY2_GPIO_PINS, GPIO_MODE_IN_PU_NO_IT); // pin6
- /* ------------------------------------------- */
- /*High speed internal clock prescaler: 1*/
- CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
- /* TIM4 configuration -----------------------------------------*/
- TIM4_Config();
- /* SPI configuration */
- SPI_DeInit();
- /* Initialize SPI in Slave mode */
- SPI_Init(SPI_FIRSTBIT_MSB, SPI_BAUDRATEPRESCALER_2, SPI_MODE_MASTER, SPI_CLOCKPOLARITY_LOW,
- SPI_CLOCKPHASE_1EDGE, SPI_DATADIRECTION_2LINES_FULLDUPLEX, SPI_NSS_SOFT,0x07);
- /* Enable the SPI*/
- SPI_Cmd(ENABLE);
- MAX7219_Init(); // Init MAX7219
- Blank_SEG(); // Blanking SEGMENT
- fg_action = FALSE;
- fg_ref_tmr = TRUE;
- tmr_cnt = 0;
- while (1)
- {
- if(fg_ref_tmr)
- {
- fg_ref_tmr = FALSE;
- DS_TIMER(tmr_cnt);
- }
-
- if(key1_cnt == 10) // pin1
- {
- key1_cnt++;
- if(fg_action)
- fg_action = FALSE;
- else
- fg_action = TRUE;
- }
- if(key2_cnt == 10) // pin6
- {
- key2_cnt++;
- fg_action = FALSE;
- tmr_cnt = 0;
- fg_ref_tmr = TRUE;
- }
- }
- }
复制代码
程序下载运行后发现 pin6 的清零功能不太正常,查了一下规格书里面的说明:
wpu = weak pull-up
原来这支引脚内部是没有上拉电阻的,我外接了一颗上拉电阻后动作就正常了。
运行结果:
源代码:
B09.rar
(1.07 MB, 下载次数: 8)
|
感谢关注
感谢关注