☛ 功能說明

使用 Arduino 開發板控制 LCD 1602 顯示一位 15×16 數位字形計數 0~9,每秒上數加 1。15×16字形是由 6 個 5×8 固定大小的字形組成。本次實習定義如下圖所示編號 0~7 等 8 個 5×8 自建字形,再由這些自建字形整合成如圖中的 15×16 數位字形。

☛ 使用材料

Arduino UNO R3 開發板 × 1、LCD 1602A 顯示器模組 × 1、可變電阻 20KΩ × 1、電阻 220Ω × 。

☛ 電路圖及麵包板接線圖

☛ 程式碼

#include<LiquidCrystal.h>               // 使用 LiquidCrystal.h 函式庫

LiquidCrystal lcd(12,11,5,4,3,2);       // 宣告 lcd 變數並定義使用接腳

byte shape[8][8]={
     {B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111}, // 編號 0
     {B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000}, // 編號 1
     {B11111, B11111, B00000, B00000, B00000, B00000, B00000, B00000}, // 編號 2
     {B00000, B00000, B00000, B00000, B00000, B00000, B11111, B11111}, // 編號 3
     {B11111, B11111, B00000, B00000, B00000, B00000, B00000, B11111}, // 編號 4
     {B11111, B00000, B00000, B00000, B00000, B00000, B11111, B11111}, // 編號 5
     {B11111, B00000, B00000, B00000, B00000, B00000, B00000, B00000}, // 編號 6
     {B00000, B00000, B00000, B00000, B00000, B00000, B00000, B11111}  // 編號 7
};

const char number[10][6]={
     {0,2,0,0,3,0}, {1,0,1,1,0,1},      // 15×16 數字 0、1
     {4,4,0,0,5,5}, {2,4,0,3,5,0},      // 15×16 數字 2、3
     {0,7,0,6,6,0}, {0,4,4,5,5,0},      // 15×16 數字 4、5
     {0,4,4,0,5,0}, {2,2,0,1,1,0},      // 15×16 數字 6、7
     {0,4,0,0,5,0}, {0,4,0,5,5,0}       // 15×16 數字 8、9
};

void setup()
{
     lcd.begin(16,2);                   // 使用 16行×2列 LCD
     for(int i=0;i<8;i++)               // 定義編號 0~7 等 8 個自建字形
         lcd.createChar(i,shape[i]); 
}

void loop()
{
     for(int i=0;i<10;i++)              // 顯示 0~9 等 10 個 15×16 數字字形
     {
         showNumber(i,6);               // 顯示在中間位置
         delay(1000);                   // 延遲 1 秒
     }
}

void showNumber(int value, int position) // 顯示15×16自建數字字形
{
     int i;
     lcd.setCursor(position,0);         // 設定游標在第位置 position 行,第 0 列
     for(i=0;i<=2;i++)                  // 顯示 15×16 數字字形的上半部
         lcd.write(byte(number[value][i]));
     lcd.setCursor(position,1);         // 設定游標在第位置 position 行,第 1 列
     for(i=3;i<=5;i++)                  // 顯示 15×16 數字字形的下半部
         lcd.write(byte(number[value][i]));
}

 

☛ 練習

⑴ 設計 Arduino 程式,控制 LCD 1602 顯示一位 15×16 數位字形計數 0~9,每秒下數減 1。

#include<LiquidCrystal.h>               // 使用 LiquidCrystal.h 函式庫

LiquidCrystal lcd(12,11,5,4,3,2);       // 宣告 lcd 變數並定義使用接腳

byte shape[8][8]={
     {B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111}, // 編號 0
     {B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000}, // 編號 1
     {B11111, B11111, B00000, B00000, B00000, B00000, B00000, B00000}, // 編號 2
     {B00000, B00000, B00000, B00000, B00000, B00000, B11111, B11111}, // 編號 3
     {B11111, B11111, B00000, B00000, B00000, B00000, B00000, B11111}, // 編號 4
     {B11111, B00000, B00000, B00000, B00000, B00000, B11111, B11111}, // 編號 5
     {B11111, B00000, B00000, B00000, B00000, B00000, B00000, B00000}, // 編號 6
     {B00000, B00000, B00000, B00000, B00000, B00000, B00000, B11111}  // 編號 7
};

const char number[10][6]={
     {0,2,0,0,3,0}, {1,0,1,1,0,1},      // 15×16 數字 0、1
     {4,4,0,0,5,5}, {2,4,0,3,5,0},      // 15×16 數字 2、3
     {0,7,0,6,6,0}, {0,4,4,5,5,0},      // 15×16 數字 4、5
     {0,4,4,0,5,0}, {2,2,0,1,1,0},      // 15×16 數字 6、7
     {0,4,0,0,5,0}, {0,4,0,5,5,0}       // 15×16 數字 8、9
};

void setup()
{
     lcd.begin(16,2);                   // 使用 16行×2列 LCD
     for(int i=0;i<8;i++)               // 定義編號 0~7 等 8 個自建字形
         lcd.createChar(i,shape[i]); 
}

void loop()
{
     for(int i=9;i>=0;i--)              // 顯示 0~9 等 10 個 15×16 數字字形
     {
         showNumber(i,6);               // 顯示在中間位置
         delay(1000);                   // 延遲 1 秒
     }
}

void showNumber(int value, int position) // 顯示15×16自建數字字形
{
     int i;
     lcd.setCursor(position,0);         // 設定游標在第位置 position 行,第 0 列
     for(i=0;i<=2;i++)                  // 顯示 15×16 數字字形的上半部
         lcd.write(byte(number[value][i]));
     lcd.setCursor(position,1);         // 設定游標在第位置 position 行,第 1 列
     for(i=3;i<=5;i++)                  // 顯示 15×16 數字字形的下半部
         lcd.write(byte(number[value][i]));
}

 

⑵ 設計 Arduino 程式,控制 LCD 1602 顯示二位 15×16 數位字形計數 00~99,每秒上數加 1。

#include<LiquidCrystal.h>               // 使用 LiquidCrystal.h 函式庫

LiquidCrystal lcd(12,11,5,4,3,2);       // 宣告 lcd 變數並定義使用接腳

byte shape[8][8]={
     {B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111}, // 編號 0
     {B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000}, // 編號 1
     {B11111, B11111, B00000, B00000, B00000, B00000, B00000, B00000}, // 編號 2
     {B00000, B00000, B00000, B00000, B00000, B00000, B11111, B11111}, // 編號 3
     {B11111, B11111, B00000, B00000, B00000, B00000, B00000, B11111}, // 編號 4
     {B11111, B00000, B00000, B00000, B00000, B00000, B11111, B11111}, // 編號 5
     {B11111, B00000, B00000, B00000, B00000, B00000, B00000, B00000}, // 編號 6
     {B00000, B00000, B00000, B00000, B00000, B00000, B00000, B11111}  // 編號 7
};

const char number[10][6]={
     {0,2,0,0,3,0}, {1,0,1,1,0,1},      // 15×16 數字 0、1
     {4,4,0,0,5,5}, {2,4,0,3,5,0},      // 15×16 數字 2、3
     {0,7,0,6,6,0}, {0,4,4,5,5,0},      // 15×16 數字 4、5
     {0,4,4,0,5,0}, {2,2,0,1,1,0},      // 15×16 數字 6、7
     {0,4,0,0,5,0}, {0,4,0,5,5,0}       // 15×16 數字 8、9
};

int i,j,k;                              // 計數值,商數,餘數

void setup()
{
     lcd.begin(16,2);                   // 使用 16行×2列 LCD
     for(int i=0;i<8;i++)               // 定義編號 0~7 等 8 個自建字形
         lcd.createChar(i,shape[i]); 
}

void loop()
{
     for(int i=0;i<100;i++)              // 顯示 00~99 的 15×16 數字字形
     {
         j=i/10;                        // 取商數
         k=i%10;                        // 取餘數
         showNumber(j,3);               // 顯示十位數
         showNumber(i,6);               // 顯示個位數
         delay(1000);                   // 延遲 1 秒
     }
}

void showNumber(int value, int position) // 顯示15×16自建數字字形
{
     int i;
     lcd.setCursor(position,0);         // 設定游標在第位置 position 行,第 0 列
     for(i=0;i<=2;i++)                  // 顯示 15×16 數字字形的上半部
         lcd.write(byte(number[value][i]));
     lcd.setCursor(position,1);         // 設定游標在第位置 position 行,第 1 列
     for(i=3;i<=5;i++)                  // 顯示 15×16 數字字形的下半部
         lcd.write(byte(number[value][i]));
}