學習目標
- 字庫的創建與應用
- 位移操作
- 動態顯示的應用
電路搭建
所需材料
ArduinoUNO * 1
8 * 8點陣屏 * 1
杜邦線若干
電路連接
程序編寫:
練習:點陣屏動態顯示數字
通過編寫程序,實現點陣屏動態顯示數字0~9。本節課內容主要通過代碼的方式來進行講解,圖形化由于在后續使用點陣屏模塊的時候會非常容易,所以不在這里贅述。
代碼方式:
/* 項目名稱:動態顯示數字
* 項目時間:2022.03.04
* 項目作者:MRX
*/
int leds[8] = {9, 14, 8, 12, 1, 7, 2, 5}; //點陣屏正極引腳
int gnds[8] = {13, 3, 4, 10, 6, 11, 15, 16}; //點陣屏負極引腳
char nums[] = {
0x00, 0x7C, 0x8A, 0x92, 0xA2, 0x7C, 0x00, 0x00, // -0-
0x00, 0x00, 0x42, 0xFE, 0x02, 0x00, 0x00, 0x00, // -1-
0x00, 0x46, 0x8A, 0x92, 0x92, 0x62, 0x00, 0x00, // -2-
0x00, 0x84, 0x82, 0x92, 0xB2, 0xCC, 0x00, 0x00, // -3-
0x00, 0x18, 0x28, 0x48, 0xFE, 0x08, 0x00, 0x00, // -4-
0x00, 0xE4, 0xA2, 0xA2, 0xA2, 0x9C, 0x00, 0x00, // -5-
0x00, 0x3C, 0x52, 0x92, 0x92, 0x8C, 0x00, 0x00, // -6-
0x00, 0x80, 0x8E, 0x90, 0xA0, 0xC0, 0x00, 0x00, // -7-
0x00, 0x6C, 0x92, 0x92, 0x92, 0x6C, 0x00, 0x00, // -8-
0x00, 0x62, 0x92, 0x92, 0x94, 0x78, 0x00, 0x00, // -9-
0x00, 0x3E, 0x48, 0x88, 0x48, 0x3E, 0x00, 0x00, // -A-
0x00, 0xFE, 0x92, 0x92, 0x92, 0x6C, 0x00, 0x00, // -B-
0x00, 0x7C, 0x82, 0x82, 0x82, 0x44, 0x00, 0x00, // -C-
0x00, 0xFE, 0x82, 0x82, 0x82, 0x7C, 0x00, 0x00, // -D-
0x00, 0xFE, 0x92, 0x92, 0x92, 0x82, 0x00, 0x00, // -E-
0x00, 0xFE, 0x90, 0x90, 0x90, 0x80, 0x00, 0x00, // -F-
};
void ledclean()
{
for (int i = 0; i < 8; i++)//將點陣屏正極拉低,負極拉高,關斷顯示
{
digitalWrite(leds[i], LOW);
digitalWrite(gnds[i], HIGH);
}
}
//字符顯示
void ledShow(char num, char dat)
{
digitalWrite(gnds[num], LOW);
for (int i = 0; i < 8; i++)
{
digitalWrite(leds[i], dat & 0x80); // 1 0 0 0 0 0 0 0
dat < <= 1;
}
delayMicroseconds(100);
digitalWrite(gnds[num], HIGH);
ledclean();
}
void setup() {
for (int i = 0; i < 8; i++)
{
pinMode(leds[i], OUTPUT);
pinMode(gnds[i], OUTPUT);
digitalWrite(gnds[i], HIGH); //負極引腳拉高,熄滅所有LED
}
}
void loop() {
for (int a = 0; a < 10; a++) //控制流動顯示內容
{
for (int i = 0 ; i < 200 ; i++)//循環顯示達到延時效果
{
for (int c = 0; c < 8; c++) //8列循環掃描,達到點陣屏驅動效果
{
ledShow(c, nums[c + a*8]);
}
}
}
}
程序分析:
上面這段程序實現了在點陣屏上翻頁顯示數字09,雖然我們字庫按照十六進制進行了定義,但是這里根據要求,只需要09就可以了。
定義一個數組用于存儲需要顯示的字庫,每8個表示一個字符。
char nums[] = {
0x00, 0x7C, 0x8A, 0x92, 0xA2, 0x7C, 0x00, 0x00, // -0-
0x00, 0x00, 0x42, 0xFE, 0x02, 0x00, 0x00, 0x00, // -1-
0x00, 0x46, 0x8A, 0x92, 0x92, 0x62, 0x00, 0x00, // -2-
0x00, 0x84, 0x82, 0x92, 0xB2, 0xCC, 0x00, 0x00, // -3-
0x00, 0x18, 0x28, 0x48, 0xFE, 0x08, 0x00, 0x00, // -4-
0x00, 0xE4, 0xA2, 0xA2, 0xA2, 0x9C, 0x00, 0x00, // -5-
0x00, 0x3C, 0x52, 0x92, 0x92, 0x8C, 0x00, 0x00, // -6-
0x00, 0x80, 0x8E, 0x90, 0xA0, 0xC0, 0x00, 0x00, // -7-
0x00, 0x6C, 0x92, 0x92, 0x92, 0x6C, 0x00, 0x00, // -8-
0x00, 0x62, 0x92, 0x92, 0x94, 0x78, 0x00, 0x00, // -9-
0x00, 0x3E, 0x48, 0x88, 0x48, 0x3E, 0x00, 0x00, // -A-
0x00, 0xFE, 0x92, 0x92, 0x92, 0x6C, 0x00, 0x00, // -B-
0x00, 0x7C, 0x82, 0x82, 0x82, 0x44, 0x00, 0x00, // -C-
0x00, 0xFE, 0x82, 0x82, 0x82, 0x7C, 0x00, 0x00, // -D-
0x00, 0xFE, 0x92, 0x92, 0x92, 0x82, 0x00, 0x00, // -E-
0x00, 0xFE, 0x90, 0x90, 0x90, 0x80, 0x00, 0x00, // -F-
};
這個數組,表示的是數字的字模。以數字3對應的數據nums[0]{ 0x00, 0x7C, 0x8A, 0x92, 0xA2, 0x7C, 0x00, 0x00, },//0為例,包括有8個十六進制的數,每行一個十六進制數,并且換成二進制的表示,會是什么樣的呢?
00000000 //0x00
01111100 //0x7C
10001010 //0x8A
10010010 //0x92
10100010 //0xA2
01111100 //0x7C
00000000 //0x00
00000000 //0x00
請看1出現的地方,可以借著鼠標按1出現的軌跡跟著劃一劃,不就是一個橫著的數字0字型的輪廓么。
loop()中的三重for循環: 最里面控制8列掃描顯示,中間for循環用于控制顯示時間,最外層for循環用于控制流動位置。
流動效果: 依次移動需要顯示的字符數據,就達到了流動顯示效果。可以控制每次移動的間距,當每次移動8列就會實現整屏覆蓋的效果。
字符指針數據類型char: 指向了一個char類型的內存單元,指針是編程語言中的一個對象,利用地址,它的值直接指向存在電腦存儲器中另一個地方的值。
dat<<=1: 即dat=dat<<1;,將dat變量左移1位后的值賦給dat,結果會改變dat變量的值。
dat & 0x80: 就是dat和10000000位相與,即把dat最高位置1,其它位不變。(這里的“&”是位邏輯運算(一位一位的運算)。)
-
led燈
+關注
關注
22文章
1592瀏覽量
108142 -
十六進制
+關注
關注
2文章
32瀏覽量
37776 -
Arduino
+關注
關注
188文章
6472瀏覽量
187348 -
點陣屏
+關注
關注
4文章
71瀏覽量
31964 -
for循環
+關注
關注
0文章
61瀏覽量
2514
發布評論請先 登錄
相關推薦
評論