5.1.數碼管動態顯示原理
所謂動態掃描顯示即輪流向各位數碼管送出段碼和位碼,利用發光管的余輝和人眼視覺暫留作用,使人眼的感覺好像各位數碼管同時都在顯示。明確了原理,我們要使電壓電流表的三個位同時顯示不同的值需要用到CW32的定時器功能,在定時器的中斷服務程序里面執行顯示刷新的動作。有關CW32的定時器和中斷的相關知識請查看鏈接:【CW32F003E4核心板】入門學習教程。本文只講述如何配置定時器中斷并執行數碼管刷新函數。
5.2.定時器中斷配置
在配置定時器之前需要注意是否將系統時鐘樹配置完成,定時器利用了高級外設時鐘 PCLK,在之前的時鐘配置中,我們將高級外設時鐘 PCLK的頻率配置成了6MHz,這將影響我們對定時器的預分頻和裝填計數值的配置。
在本次實驗中,我們使用定時器BTIM1進行中斷配置,代碼如下:
#include "BTIM1.h"
void Btim1_Init(void)
{
BTIM_TimeBaseInitTypeDef BTIM_TimeBaseInitStruct;
__RCC_BTIM_CLK_ENABLE(); //使能BTIM的時鐘
NVIC_EnableIRQ(BTIM1_IRQn); //使能BTIM1的中斷
BTIM_TimeBaseInitStruct.BTIM_Mode = BTIM_Mode_TIMER;//將定時器配置為計時模式
BTIM_TimeBaseInitStruct.BTIM_Period = 6000 - 1; // 1ms采集1次
BTIM_TimeBaseInitStruct.BTIM_Prescaler = BTIM_PRS_DIV1; // 6MHZ÷1÷6000 = 1000Hz
BTIM_TimeBaseInitStruct.BTIM_OPMode = BTIM_OPMode_Repetitive;//配置定時器連續運行
BTIM_TimeBaseInit(CW_BTIM1, &BTIM_TimeBaseInitStruct); //初始化BTIM1
BTIM_ITConfig(CW_BTIM1, BTIM_IT_OV, ENABLE); //配置BTIM1的中斷,定時器溢出產生中斷
BTIM_Cmd(CW_BTIM1, ENABLE); //使能BTIM1
}
5.3.數碼管動態顯示
在上一節的數碼管顯示數字的數碼管顯示模塊Seg_Dis.c文件中,我們還需要添加三個函數和定義一個數組 Seg_Reg 來完成動態顯示的功能。
uint8_t Seg_Reg[3] = {0,0,0}; //這個數組存放數碼管顯示三位的數字,0~9
void Close_Com(void) //關閉所有數碼管的顯示,防止重影
{
GPIO_WritePin(CW_GPIOB,GPIO_PIN_7,GPIO_Pin_SET); //PB07,COM1
GPIO_WritePin(CW_GPIOC,GPIO_PIN_3,GPIO_Pin_SET); //PC03,COM2
GPIO_WritePin(CW_GPIOC,GPIO_PIN_2,GPIO_Pin_SET); //PC02,COM3
}
void Display(uint32_t value)
{
uint8_t Hundreds;// 百位數
uint8_t Tens; // 十位數
uint8_t Units; // 個位數
Units = value % 10; //分別取余獲得位數的值
Tens = value / 10 % 10;
Hundreds = value / 100 % 10;
Seg_Reg[0] = Hundreds; //將個十百位的數字分別存放進數組等待調用
Seg_Reg[1] = Tens;
Seg_Reg[2] = Units;
}
void Dis_Refresh(void) //函數將在定時器中斷里調用,不斷刷新數碼管
{
/*靜態變量從作用域上分屬于局部變量;從生命周期上來看,它與用戶程序的生命周期相同。*/
static uint8_t num = 0; //這里的靜態臨時變量num,輪詢Seg_Reg數組
Close_Com(); //先關閉公共端,防止重影
Seg_Dis(num,Seg_Reg[num]); //調用顯示函數
num++;
if(num > 2)
{
num = 0;
}
}
最后在定時器中斷里不斷調用顯示刷新函數完成數碼管的刷新顯示:
void BTIM1_IRQHandler(void) //BTIM1的中斷服務程序
{
static uint32_t Cnt=0; //Cnt作為計數標志位控制刷新函數是否執行
if (BTIM_GetITStatus(CW_BTIM1, BTIM_IT_OV))
{
BTIM_ClearITPendingBit(CW_BTIM1, BTIM_IT_OV); //清除中斷標志位
Cnt++;
if (Cnt > 2) //3ms顯示一個數碼管
{
Cnt = 0;
Dis_Refresh(); //數碼管掃描顯示
}
}
}
5.4.實驗效果
最終的實驗效果如下圖所示,人眼已經看不出閃爍,但實際上數碼管是依次刷新顯示。
圖5-1 數碼管動態顯示效果圖
審核編輯 黃宇
-
數碼管
+關注
關注
32文章
1887瀏覽量
91403 -
電壓電流表
+關注
關注
0文章
25瀏覽量
2098 -
CW32
+關注
關注
1文章
218瀏覽量
734
發布評論請先 登錄
相關推薦
評論