?導(dǎo)讀:《藍(lán)橋杯單片機(jī)組》專欄文章是博主2018年參加藍(lán)橋杯的單片機(jī)組比賽所做的學(xué)習(xí)筆記,在當(dāng)年的比賽中,博主是獲得了省賽一等獎,國賽二等獎的成績。成績雖談不上最好,但至少問心無愧。如今2021年回頭再看該系列文章,仍然感觸頗多。為了能更好地幫助到單片機(jī)初學(xué)者,今年特地抽出時間對當(dāng)年的文章邏輯和結(jié)構(gòu)進(jìn)行重構(gòu),以達(dá)到初學(xué)者快速上手的目的。需要指出的是,由于本人水平有限,如有錯誤還請讀者指出,非常感謝。那么,接下來讓我們一起開始愉快的學(xué)習(xí)吧。
在前面的那一篇《【藍(lán)橋杯單片機(jī)組模塊】1、硬件電路基礎(chǔ)知識 與 蜂鳴器模塊上手》文章中,我們詳細(xì)介紹了 CT107D 開發(fā)板的各個外設(shè)驅(qū)動方式。本節(jié)通過LED流水燈的例子再次熟悉CT107D外設(shè)驅(qū)動套路,為后文更復(fù)雜的外設(shè)驅(qū)動搭橋鋪路。
一、LED 外設(shè)基本知識復(fù)習(xí)
前面我們總結(jié)了CT107D的常用外設(shè)地址圖,如下所示。
LED 外設(shè)對應(yīng)的地址為:0x8000
。
IO 編程點亮LED核心代碼如下:
P2 = ((P2&0x1F)|0x80);
P0 = 0x00; //點亮所有LED
P2 = P2 & 0x1F;
二、LED 循環(huán)流動實驗
LED流水燈花樣多了去了,咱還是只挑經(jīng)典的來就行就可以啦。 : )
那就寫一個左右循環(huán)流動的 Demo 吧。
#include <stc15.h>
typedef unsigned char u8;//注意類型定義用typedef,養(yǎng)成習(xí)慣最好不過了!
typedef unsigned int u16;
void CloseFucker();
void FlowLed();
void main()
{
CloseFucker();
while(1)
{
FlowLed();
}
}
void CloseFucker()
{
P2 = (P2 & 0x1F) | 0xA0;
P0 = P0 & 0xAF;
P2 = P2 & 0x1F;
}
void FlowLed()
{
u16 i;
static bit dir = 0;//單獨定義成函數(shù)需要static
static u8 shift = 0x01;
P2 = ((P2&0x1F)|0x80);
P0 = ~shift;
if(dir == 0)
{
shift <<= 1;
if(shift == 0x80)
dir = 1;
}
else
{
shift >>= 1;
if(shift == 0x01)
dir = 0;
}
for(i=0; i<60000; i++);
P2 = P2 & 0x1F;
}
程序總體來說的話不難理解,這里總結(jié)一下初學(xué)者常問的幾個問題。
三、初學(xué)者常見問題
Q1:LED流動的延時間隔是怎么實現(xiàn)的?具體延時多少?
A:延時間隔通過軟件延時實現(xiàn)。延時間隔我們一般用定時器,這里考慮到新手嘛,剛剛上手使用CT107D,肯定想直觀看到程序的效果,所以此處的延時是用for循環(huán)軟件延時來做的,更加簡單方便。但是for循環(huán)的缺點也就很明顯了,我們無法直觀的知道延時間隔,for(i=0; i<60000; i++);
這段延時也是試出來的,LED 流動停頓剛好挺合適,讀者直接拿去用便是了,不用過分糾結(jié)它到底延時了多少。
Q2:點亮第一顆LED為什么要寫成shift = 0x01
取反(相當(dāng)于P0 = 0x01
取反),而不直接寫shift = 0xFE
(相當(dāng)于P0 = 0xFE
)?
A:方便移位。首先明白一點,LED是低電平點亮,shift
中為0
的位,對應(yīng)的LED會亮。寫成shift = ~(0x01)
和shift = 0xFE
這兩種形式都可以點亮第一顆LED,但是第二顆LED呢?難道要重新再重新算一下:1111 1101
,得出shift = 0xFD
?難道不麻煩么?如果寫成 shift = 0x01
的形式,將其左移一位shift = shift << 1
,然后再取反shift = ~shift
。這樣不就可以點亮第二顆LED了么,第三、四....顆LED都是同理。這樣豈不是更加直觀方便,通過一點小算法,屏蔽了里面的計算細(xì)節(jié)。
Q3:FlowLed
函數(shù)中的變量為什么要使用靜態(tài)變量(static)?
A:這樣可以做到每次進(jìn)入該函數(shù)時對應(yīng)的static變量保持上一次的值。這個應(yīng)該是C語言的基礎(chǔ)知識,調(diào)用某個函數(shù)時,其中的staic變量保持上一次的值不變。
小結(jié):本篇文章先是回憶了CT107D開發(fā)板的LED外設(shè)驅(qū)動知識,接著以 LED 流水燈的demo再次熟悉外設(shè)驅(qū)動套路,并在該demo后詳細(xì)列出并解答了初學(xué)者常見的幾個問題。
希望大家多多支持我的原創(chuàng)文章。如有錯誤,請大家及時指正,非常感謝。