5.1.數(shù)碼管動(dòng)態(tài)顯示原理
所謂動(dòng)態(tài)掃描顯示即輪流向各位數(shù)碼管送出段碼和位碼,利用發(fā)光管的余輝和人眼視覺(jué)暫留作用,使人眼的感覺(jué)好像各位數(shù)碼管同時(shí)都在顯示。明確了原理,我們要使電壓電流表的三個(gè)位同時(shí)顯示不同的值需要用到CW32的定時(shí)器功能,在定時(shí)器的中斷服務(wù)程序里面執(zhí)行顯示刷新的動(dòng)作。
5.2.定時(shí)器中斷配置
在配置定時(shí)器之前需要注意是否將系統(tǒng)時(shí)鐘樹(shù)配置完成,定時(shí)器利用了高級(jí)外設(shè)時(shí)鐘 PCLK,在之前的時(shí)鐘配置中,我們將高級(jí)外設(shè)時(shí)鐘 PCLK的頻率配置成了6MHz,這將影響我們對(duì)定時(shí)器的預(yù)分頻和裝填計(jì)數(shù)值的配置。
在本次實(shí)驗(yàn)中,我們使用定時(shí)器BTIM1進(jìn)行中斷配置,代碼如下:
#include "BTIM1.h" void Btim1_Init(void) { BTIM_TimeBaseInitTypeDef BTIM_TimeBaseInitStruct; __RCC_BTIM_CLK_ENABLE(); //使能BTIM的時(shí)鐘 NVIC_EnableIRQ(BTIM1_IRQn); //使能BTIM1的中斷 BTIM_TimeBaseInitStruct.BTIM_Mode = BTIM_Mode_TIMER;//將定時(shí)器配置為計(jì)時(shí)模式 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;//配置定時(shí)器連續(xù)運(yùn)行 BTIM_TimeBaseInit(CW_BTIM1, &BTIM_TimeBaseInitStruct); //初始化BTIM1 BTIM_ITConfig(CW_BTIM1, BTIM_IT_OV, ENABLE); //配置BTIM1的中斷,定時(shí)器溢出產(chǎn)生中斷 BTIM_Cmd(CW_BTIM1, ENABLE); //使能BTIM1 }
5.3.數(shù)碼管動(dòng)態(tài)顯示
在上一節(jié)的數(shù)碼管顯示數(shù)字的數(shù)碼管顯示模塊Seg_Dis.c文件中,我們還需要添加三個(gè)函數(shù)和定義一個(gè)數(shù)組 Seg_Reg 來(lái)完成動(dòng)態(tài)顯示的功能。
uint8_t Seg_Reg[3] = {0,0,0}; //這個(gè)數(shù)組存放數(shù)碼管顯示三位的數(shù)字,0~9 void Close_Com(void) //關(guān)閉所有數(shù)碼管的顯示,防止重影 { 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;// 百位數(shù) uint8_t Tens; // 十位數(shù) uint8_t Units; // 個(gè)位數(shù) Units = value % 10; //分別取余獲得位數(shù)的值 Tens = value / 10 % 10; Hundreds = value / 100 % 10; Seg_Reg[0] = Hundreds; //將個(gè)十百位的數(shù)字分別存放進(jìn)數(shù)組等待調(diào)用 Seg_Reg[1] = Tens; Seg_Reg[2] = Units; } void Dis_Refresh(void) //函數(shù)將在定時(shí)器中斷里調(diào)用,不斷刷新數(shù)碼管 { /*靜態(tài)變量從作用域上分屬于局部變量;從生命周期上來(lái)看,它與用戶程序的生命周期相同。*/ static uint8_t num = 0; //這里的靜態(tài)臨時(shí)變量num,輪詢Seg_Reg數(shù)組 Close_Com(); //先關(guān)閉公共端,防止重影 Seg_Dis(num,Seg_Reg[num]); //調(diào)用顯示函數(shù) num++; if(num > 2) { num = 0; } }
最后在定時(shí)器中斷里不斷調(diào)用顯示刷新函數(shù)完成數(shù)碼管的刷新顯示:
void BTIM1_IRQHandler(void) //BTIM1的中斷服務(wù)程序 { static uint32_t Cnt=0; //Cnt作為計(jì)數(shù)標(biāo)志位控制刷新函數(shù)是否執(zhí)行 if (BTIM_GetITStatus(CW_BTIM1, BTIM_IT_OV)) { BTIM_ClearITPendingBit(CW_BTIM1, BTIM_IT_OV); //清除中斷標(biāo)志位 Cnt++; if (Cnt > 2) //3ms顯示一個(gè)數(shù)碼管 { Cnt = 0; Dis_Refresh(); //數(shù)碼管掃描顯示 } } }
5.4.實(shí)驗(yàn)效果
最終的實(shí)驗(yàn)效果如下圖所示,人眼已經(jīng)看不出閃爍,但實(shí)際上數(shù)碼管是依次刷新顯示。
圖5-1 數(shù)碼管動(dòng)態(tài)顯示效果圖
審核編輯:劉清
-
數(shù)碼管
+關(guān)注
關(guān)注
32文章
1882瀏覽量
91243 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3251瀏覽量
115013 -
時(shí)鐘樹(shù)
+關(guān)注
關(guān)注
0文章
55瀏覽量
10779 -
定時(shí)器中斷
+關(guān)注
關(guān)注
0文章
49瀏覽量
11232 -
電壓電流表
+關(guān)注
關(guān)注
0文章
25瀏覽量
2087
原文標(biāo)題:CW32數(shù)字電壓電流表軟件教程-實(shí)驗(yàn)四:數(shù)碼管動(dòng)態(tài)顯示
文章出處:【微信號(hào):武漢芯源半導(dǎo)體,微信公眾號(hào):武漢芯源半導(dǎo)體】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論