上一章-以定時器計數作爲時間軸的模板
文章網址
上一次講到了利用定時器2計數作爲時間軸,根據每個任務特點分配運行時間。
文章網址
代碼下載地址
代碼在藍橋杯的板子上測試過,基礎定時器2的流水燈,以及矩陣按鍵讀取,數碼管顯示,
藍橋杯必用基礎外設
LED
原理圖
原理圖
控制流程
根據原理圖,我們可以看到板子上的通過74HC138芯片來控制LED的。
當P2 = 0x80 即 P25 = 0 P26 =0 P27 =1 時 -----Y4 P0管腳就可以用來控制LED。
值得注意的是:LED是共陽極。
控制過程如下;
代碼
代碼如下
//這是一段led初始化代碼 把 LED都滅掉
P0 = 0xff;
P2 = P2 & 0x1f |0x80;
P2 &= 0X1f;
亮一個燈的代碼
// 參數 : core 爲亮的燈的位置
void led_disp_one(u8 core)
{
P0 = ~(1 << core);
P2 = P2 & 0x1f | 0x80;
P2 &= 0X1f;
}
流水燈代碼
//放置在500ms時間軸裏
void led_water(void)
{
static u8 i;
led_disp_one(i);
i++ ;
if(i > 7)
{
i = 0;
}
}
按鍵
按鍵分爲獨立按鍵跟矩陣按鍵,由於板子上獨立按鍵比較少且比較簡單,比賽的時候一般不會用到,所以我們採用4*4的矩陣按鍵。
注意:要用跳線帽把J5的1 2 腳連接起來
原理圖
按鍵原理圖
控制流程
代碼
掃描代碼如下
u8 key_scan(void)
{
u8 key_val;
u16 key_scan;
P44 = 0 ; P42 = 1 ; P35 = 1; P34 = 1;
key_scan = (key_scan << 4) | ( P3 & 0X0F);
P44 = 1 ; P42 = 0 ; P35 = 1; P34 = 1;
key_scan = (key_scan << 4) | ( P3 & 0X0F);
P44 = 1 ; P42 = 1 ; P35 = 0; P34 = 1;
key_scan = (key_scan << 4) | ( P3 & 0X0F);
P44 = 1 ; P42 = 1 ; P35 = 1; P34 = 0;
key_scan = (key_scan << 4) | ( P3 & 0X0F);
switch(~key_scan)
{
case 0x8000 : key_val = 4 ; break;
case 0x4000 : key_val = 5 ; break;
case 0x2000 : key_val = 6 ; break;
case 0x1000 : key_val = 7 ; break;
case 0x0800 : key_val = 8 ; break;
case 0x0400 : key_val = 9 ; break;
case 0x0200 : key_val = 10 ; break;
case 0x0100 : key_val = 11 ; break;
case 0x0080 : key_val = 12 ; break;
case 0x0040 : key_val = 13 ; break;
case 0x0020 : key_val = 14 ; break;
case 0x0010 : key_val = 15 ; break;
case 0x0008 : key_val = 16 ; break;
case 0x0004 : key_val = 17 ; break;
case 0x0002 : key_val = 18 ; break;
case 0x0001 : key_val = 19 ; break;
default :key_val = 0 ; break;
}
return key_val;
}
在比賽中我們經常是要求不能連續按下,所以需要對掃描代碼做點處理
代碼如下
//此段代碼放置在100ms時間軸裏面 mat_key_val爲最終讀取到的結果
u8 mat_key_val;
void key_read(void)
{
static u8 key_first_flag = True;
u8 key_nu;
key_nu = key_scan();
if(key_first_flag == True)
{
mat_key_val = key_nu;
key_first_flag = False;
}
else
{
mat_key_val = 0;
}
if(key_nu == 0)
{
key_first_flag = True;
}
}
數碼管
原理圖
可以看到數碼管的控制跟LED類似 ,也是通過74HC138定位,在數碼管中,我們要定位兩次,一次是Y6–控制數碼管哪一個亮,一次是Y7控制數碼管亮什麼。
控制流程
代碼
控制數碼管亮一個的代碼。、
參數:core亮的位置 ,num 顯示的數字
u8 code t_display[]={
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0X40};
void seg_disp_one(u8 core,u8 num)
{
P0 = 0;
P2 = P2 & 0X1F | 0XE0;
P2 &= 0X1F;
P0 = 1 << core;
P2 = P2 & 0X1F | 0XC0;
P2 &= 0X1F;
P0 = ~t_display[num];
P2 = P2 & 0X1F | 0XE0;
P2 &= 0X1F;
}
比賽中肯定不會只讓我們顯示一個數字,基本都是讓我們顯示時間,溫度,電壓等。
在這裏我用一個數組存儲每個數碼管要顯示的數字,然後在每1MS刷新一次數碼管。
代碼如下
u8 seg_buff[8];
//代碼放入1ms時間軸
void seg_disp(void)
{
static u8 i;
seg_disp_one(i,seg_buff[i]);
i++;
if(i> 7)
{
i = 0;
}
}