藍橋杯STC基礎代碼-基礎外設

上一章-以定時器計數作爲時間軸的模板

文章網址

上一次講到了利用定時器2計數作爲時間軸,根據每個任務特點分配運行時間。
文章網址

代碼下載地址

代碼在藍橋杯的板子上測試過,基礎定時器2的流水燈,以及矩陣按鍵讀取,數碼管顯示,

代碼下載地址

藍橋杯單片機資源包

藍橋杯必用基礎外設

LED

原理圖

原理圖這裏是引用
在這裏插入圖片描述

控制流程

根據原理圖,我們可以看到板子上的通過74HC138芯片來控制LED的。
P2 = 0x80 即 P25 = 0 P26 =0 P27 =1 時 -----Y4 P0管腳就可以用來控制LED。
值得注意的是:LED是共陽極。
控制過程如下;

P0管腳設置LED
把P25 P26 P27同時拉低
把P25 P26 P27 按所需要的的拉高
把P25 P26 P27 都拉低

代碼

代碼如下

    //這是一段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;
	}
	
}

下一章-串口

文章地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章