如果不使用定時器,會有很多衝突。比如數碼管顯示不正常,按鍵響應問題。
定時器時間消隱效果還不錯,根據實驗室另乙個光伏專案的朋友用stc15**改過來的。
數碼管
#ifndef __led_h
#define __led_h
#include "sys.h"
#define dx0 paout(0)
#define dx1 paout(1)
#define dx2 paout(2)
#define dx3 paout(3)
#define dx4 paout(4)
#define dx5 paout(5)
#define dx6 paout(6)
#define dx7 paout(7)
#define led1 paout(8)
#define led2 paout(9)
#define led3 paout(10)
#define led4 paout(11)
#define led5 paout(12)
#define led6 pcout(8)
#define beep pgout(9)
#define d0 peout(0)
#define d1 peout(1)
#define d2 peout(2)
#define d3 peout(3)
void led_init(void);
void display(u8 index);
#endif
#include "led.h"
u8 seg_tab[17] = ;
void led_init(void)
void display(u8 index)
void tim6_irqhandler() //數碼管掃瞄
s++; if(s>4) s=1;
tim_clearitpendingbit(tim6,tim_it_update);
}}
#include "key.h"
#include "led.h"
#include "sys.h"
#define port gpiof->idr
//行接pf0-3,列接fd4-7
void key_init()
s8 scan_matrixkey()
} //若產生抖動按鍵被抬起則計數清0
else
key_count = 0;
//若按鍵連續2次掃瞄均處於按下狀態
//則認為按鍵確實被按下了
if (key_count == 2)
} //若沒有按鍵被按下(已鬆手)則掃瞄次數清0
//方便下次按下掃瞄計數
if ((port & 0x00ff) == 0x00f0)
return matrixkey_value;
}
記得新增外部全域性變數
這個按鍵掃瞄函式是從別人部落格上用的。
void key_fuc()
else if(flag_mode==2)
else if(flag_mode==3)
else
if(flag_mode>5) //暫停後再次按下,
} else if(key_value==2) //重複進入自檢,但是再次按任意鍵時得兩次
else if(key_value==3) //停止按鈕
else if(key_value==4)
else if(key_value==5)
else ;
}void tim7_irqhandler() //按鍵
}
這個按鍵裡的程式是我之前練習乙個微控制器省賽題目寫的,以後有空聊 定時器數碼管時鐘
mai.c handlebars include system.h include key.h extern uchar flag 1ms 在其他模組中尋找其定義。另外,extern也可用來進行鏈結指定。void main void 程式的主函式 在這裡插入 片key.c include key.h...
51 定時器掃瞄矩陣鍵盤 數碼管顯示
大二的時候學完51寫的乙個綜合程式。用定時器中斷掃瞄行,即行已知 再在主程式中判斷列 得到的行列值帶入顯示函式display 按下鍵顯示,鬆開取消顯示。涉及原理理解,邏輯比較混亂,可讀性低。includeunsigned char i,j,l,r,add 0,temp 注意微控制器的行列對應的引腳 ...
定時器動態掃瞄數碼管LED矩陣顯示
矩陣led顯示,採用 掃瞄,可以實現多級調亮度,動態掃瞄所有led燈亮度同一,不會出現一組led燈點亮的個數不同導致亮度不同,8 8矩陣的單個led燈閃爍 犧牲了亮度,整體亮度會下降乙個級別,但是如果io口的驅動能力比較好的的話是不影響的 掃瞄思路 第一級掃瞄位掃瞄 一段數碼管或者一行led 每個燈...