1
實驗環境介紹
? 實驗環境
本次實驗是通過Proteus+MDK一起模擬完成的。Proteus模擬實際電路,MDK編譯代碼。Proteus版本是8.9,MDK版本是5.36。需要注意的是,Proteus需要安裝8.8以上版本,器件庫里面要支持STM32F401VE。
?實驗目的
通過定時器3TIM3,計數,8位數碼管,一個3*4的鍵盤來實現一個簡單的可設置電子時鐘。
2
硬件電路
Proteus電路
? 主控:
STM32F401VE,Cotex-M4內核,主頻最大84MHz,程序空間512KB,FLASH空間96KB。
? 時鐘:
沒有用外部晶振,因為Proteus只支持一種時鐘樹,所以這里采用內部晶振,做實驗夠了。
? 復位電路:
沒有配置相關外設電路,因為Proteus默認是有電壓的,默認是復位的,畢竟是仿真軟件,主要是驗證程序功能。
? IO說明:
我們利用PD0PD7以及PC0PC7控制數碼管、PE0~PE6控制鍵盤輸入。
3
代碼概述
MDK代碼目錄結構
? 代碼目錄概述:
USER文件夾:主要包含應用函數的.C文件以及中斷函數.C。
HARDWARE文件夾:主要包含底層硬件驅動的.C文件。
CORE文件夾:主要包含STM32的啟動的.S文件。
FWLIB文件夾:主要包含ST官方提供的標準外設驅動.C文件(不是HAL庫哦)。
? 代碼內容概述:
↓↓↓ 按鍵識別代碼如下:
//判斷按鍵是否按下 u8 iskeyinput(void) { GPIOE->ODR=0x000f; if((KEYPORT&0x000f)==0x000f) return 0; else return 1; } //按鍵識別 u8 key_identify(void) { u8 linecode=0,rowcode=0; u8 i; u8 scancode=0x00ef; for(i=0;i<4;i++) { GPIOE->ODR=scancode; if((KEYPORT&0x000f)==0x000f) { rowcode++; scancode=scancode<<1|1; } else { if(line0==0)linecode=0; if(line1==0)linecode=3; if(line2==0)linecode=6; if(line3==0)linecode=9; break; } } return linecode+rowcode; } //等待按鍵松開 void wait_key_release(u8 x) { while(1) { GPIOE->ODR=0x000f; if(x==0)seg_disp2(); else seg_disp1(f); if((KEYPORT&0x000f)==0x000f) break; } } //按鍵掃描 u8 key_Scan(u8 x) { u8 keycode=0; if(iskeyinput()) { delay_us(100); if(iskeyinput()) { keycode=key_identify()+1; wait_key_release(x); } } return keycode; }
↓↓↓ 電子時鐘事件計時代碼如下:
void get_time(void) { if(bs>99) { bs=0;s++; if(s==60) { s=0;m++; if(m==60) { m=0;h++; if(h==24) {h = 0;} date[0]=h/10; date[1]=h%10; } date[2]=m/10; date[3]=m%10; } date[4]=s/10; date[5]=s%10; } date[6]=bs/10; date[7]=bs%10; }
4
實驗結果展示
電子時鐘效果
設置效果
可以看到,電子時鐘能夠正常計時并且通過*號按鍵切換成設置狀態,再通過#號按鍵切換成正常計時狀態,至此可設置電子時鐘實驗完成!!!
審核編輯:劉清
-
數碼管
+關注
關注
32文章
1882瀏覽量
91064 -
定時器
+關注
關注
23文章
3246瀏覽量
114719 -
PROTEUS仿真
+關注
關注
28文章
308瀏覽量
35245 -
電子時鐘
+關注
關注
11文章
197瀏覽量
24520 -
STM32F401
+關注
關注
1文章
16瀏覽量
10492
發布評論請先 登錄
相關推薦
評論