yiher LCD 1162020 3 yiher HD 44780 LCM








































































- Slides: 72
yiher LCD模組 11/6/2020 例說8051 3
yiher HD 44780 LCM內部結構 11/6/2020 例說8051 6
yiher LCM之包裝 11/6/2020 例說8051 12
yiher 清除顯示幕(CLEAN DISPLAY) 11/6/2020 例說8051 13
yiher CG RAM定址設定 11/6/2020 例說8051 19
yiher DD RAM定址設定 11/6/2020 例說8051 20
yiher 讀取BF與AC 11/6/2020 例說8051 21
yiher LCM與8051之連接 11/6/2020 例說8051 24
yiher Ch 12 -1. asm-1 EN REG P 3. 0 RW REG P 3. 1 RS REG P 3. 2 LCD REG P 1 ; ================= ORG 0 ; 程式從 0位址開始 INITIALIZE: MOV A, #00111000 B ; 設定為 8 BIT, 2列, 5 X 7字型 CALL WR_INST ; MOV A, #00001000 B ; 關閉顯示幕 CALL WR_INST ; 11/6/2020 例說8051 29
yiher Ch 12 -1. asm-2 MOV A, #00000001 B ; 清除顯示幕 CALL WR_INST ; MOV A, #00001111 B ; 開啟顯示幕, 游標, 與閃爍 CALL WR_INST ; MOV A, #00000110 B ; 設定AC+1 CALL WR_INST ; ; ================= LOOP: MOV A, #10000000 B ; 設定第一列起始位址 CALL WR_INST ; MOV DPTR, #LINE 1 ; 指向第一列顯示資料 MOV R 0, #16 CALL WR_STRING ; 顯示第一列 CALL DELAY 2 ; 延遲 2秒 ; ================= 11/6/2020 例說8051 30
yiher Ch 12 -1. asm-3 MOV A, #11000000 B ; 設定第二列起始位址 CALL WR_INST ; MOV DPTR, #LINE 2 ; 指向第二列顯示資料 MOV R 0, #16 CALL WR_STRING ; 顯示第二列 CALL DELAY 2 ; 延遲 2秒 ; ================= MOV A, #10000000 B ; 設定第一列起始位址 CALL WR_INST ; MOV DPTR, #LINE 3 ; 指向第一列顯示資料 MOV R 0, #16 CALL WR_STRING ; 顯示第一列 CALL DELAY 2 ; 延遲 2秒 ; ================= 11/6/2020 例說8051 31
yiher Ch 12 -1. asm-4 MOV A, #11000000 B ; 設定第二列起始位址 CALL WR_INST ; MOV DPTR, #LINE 4 ; 指向第二列顯示資料 MOV R 0, #16 CALL WR_STRING ; 顯示第二列 CALL DELAY 2 ; 延遲 2秒 JMP LOOP ; 跳至LOOP形成迴圈 ; ================= WR_INST: CALL CHECK_BF CLR RS CLR RW SETB EN MOV LCD, A 11/6/2020 例說8051 32
yiher Ch 12 -1. asm-5 CLR EN RET ; ================= CHECK_BF: PUSH A BUSY: CLR RS SETB RW SETB EN MOV A, LCD CLR EN JB ACC. 7, BUSY CALL DELAY POP A RET 11/6/2020 例說8051 33
yiher Ch 12 -1. asm-6 ; ================= WR_STRING: MOV R 1, #0 NEXT: MOV A, R 1 MOVC A, @A+DPTR CALL WR_DATA INC R 1 DJNZ R 0, NEXT RET ; ================= WR_DATA: CALL CHECK_BF SETB RS 11/6/2020 例說8051 34
yiher Ch 12 -1. asm-7 CLR RW SETB EN MOV LCD, A CLR EN RET ; ==================== DELAY: MOV R 6, #15 D 1: MOV R 7, #200 DJNZ R 7, $ DJNZ R 6, D 1 RET 11/6/2020 例說8051 35
yiher Ch 12 -1. asm-7 ; ==================== DELAY 2: MOV R 5, #20 D 3: MOV R 6, #200 D 2: MOV R 7, #250 DJNZ R 7, $ DJNZ R 6, D 2 DJNZ R 5, D 3 RET ; =================== LINE 1: DB 'LCM testing prog' LINE 2: DB 'TA-AN EE Depart. ' LINE 3: DB 'TAIPEI, TAIWAN ' LINE 4: DB 'www. taantech. com' ; =================== END 11/6/2020 例說8051 36
yiher 自製字型副程式-2 ; ================= CHAR: DB 04 H, 0 EH, 1 FH, 00 H ; AM DB 00 H, 00 H, 00 H ; PM DB 1 FH, 0 EH, 04 H, 00 H ; ================= 11/6/2020 例說8051 42
yiher Ch 12 -2. asm-1 EN RW RS LCD AMPM HOUR MIN SEC HS TIMES COL 11/6/2020 REG REG EQU EQU P 3. 0 P 3. 1 P 3. 2 P 1 38 H ; 上午/下午符號 20 H ; 小時位址 21 H ; 分鐘位址 REG 22 H ; 秒鐘位址 -50000 ; 延遲 1 sec 20 ; 50000 m. Sx 20=1 sec 3 AH ; ": " 例說8051 54
yiher Ch 12 -2. asm-3 ; =============== MOV IE, #10000010 B ; 設定TIMER 0中斷 MOV TMOD, #1 ; MODE 1 MOV SP, #60 H ; 移開堆疊指標 MOV TH 0, #>HS ; 填入計時量 MOV TL 0, #<HS ; 填入計時量 MOV R 3, #TIMES ; 設定中斷次數 SETB TR 0 ; 啟動TIMER 0 ; =============== INITIALIZE: MOV A, #00111000 B ; 設定為 8 BIT, 2列, 5 X 7字型 CALL WR_INST ; MOV A, #00001000 B ; 關閉顯示幕 CALL WR_INST ; 11/6/2020 例說8051 56
yiher Ch 12 -2. asm-4 MOV A, #00000001 B ; 清除顯示幕 CALL WR_INST ; MOV A, #00001111 B ; 開啟顯示幕, 游標, 與閃爍 CALL WR_INST ; MOV A, #00000110 B ; 設定AC+1 CALL WR_INST ; CALL WR_CG ; 將自建字型寫入CG RAM ; ================= JMP $ ; 停滯 ; ================= WR_INST: CALL CHECK_BF CLR RS CLR RW 11/6/2020 例說8051 57
yiher Ch 12 -2. asm-5 SETB EN MOV LCD, A CLR EN RET ; ================= CHECK_BF: PUSH A BUSY: CLR RS SETB RW SETB EN MOV A, LCD CLR EN JB ACC. 7, BUSY 11/6/2020 例說8051 58
yiher Ch 12 -2. asm-6 CALL DELAY POP A RET ; ================= WR_CG: MOV A, #01000000 B ; 指定CG RAM起始位址 CALL WR_INST ; 將指令寫入LCM MOV R 2, #16 ; 指定所要寫入之字元數 MOV R 0, #0 ; 間距 MOV DPTR, #CHAR ; 指定自建字型位置 NEXT_C: MOV A, R 0 ; MOVC A, @A+DPTR ; 取用字元 11/6/2020 例說8051 59
yiher Ch 12 -2. asm-8 CALL WR_DATA ; 寫入LCM INC R 0 ; 下一個字元 DJNZ R 2, NEXT_D ; 最後一個字元? RET ; 返回 ; =============== WR_DATA: CALL CHECK_BF SETB RS CLR RW SETB EN MOV LCD, A CLR EN RET ; =============== 11/6/2020 例說8051 61
yiher Ch 12 -2. asm-9 DELAY: MOV R 6, #15 D 1: MOV R 7, #200 DJNZ R 7, $ DJNZ R 6, D 1 RET ; =============== TIMER: PUSH A ; 儲存ACC MOV TH 0, #>HS ; 填入計時量 MOV TL 0, #<HS ; 填入計時量 DJNZ R 3, AGAIN ; 填入計時量 MOV R 3, #TIMES ; 設定中斷次數 CALL MODIFY ; 調整時間顯示 11/6/2020 例說8051 62
yiher Ch 12 -2. asm-10 AGAIN: POP A RETI ; =============== ; =======秒 MODIFY: MOV A, SEC ; 取回秒數 INC A ; 加 1秒 CLR CY ; 清除進位 DA A ; BCD調整 MOV SEC, A ; 存回秒數 CJNE A, #60 H, NEXT; 超過60秒? MOV SEC, #0 ; 歸零 ; =======分 11/6/2020 例說8051 63
yiher Ch 12 -2. asm-11 MOV A, MIN ; 取回分數 INC A ; 加 1秒 CLR CY ; 清除進位 DA A ; BCD調整 MOV MIN, A ; 存回分數 CJNE A, #60 H, NEXT; 超過60分? MOV MIN, #0 ; 歸零 ; =======時 MOV A, HOUR ; 取回時數 INC A ; 加 1秒 CLR CY ; 清除進位 DA A ; BCD調整 MOV HOUR, A ; 存回時數 CJNE A, #12 H, NEXT; 超過12小時? 11/6/2020 例說8051 64
yiher Ch 12 -2. asm-12 MOV HOUR, #0 ; 歸零 MOV A, AMPM ; 取回上/下午 CPL ACC. 0 ; 改變上/下午 MOV AMPM, A ; 儲存上/下午 NEXT: CALL NUM 2 ASCII ; 轉換碼 CALL WR_STRING ; 顯示時間 RET ; =============== NUM 2 ASCII: ; =======時 MOV A, HOUR ; 取回時 MOV R 0, #25 H ; 指定暫存位置 MOV @R 0, A ; 存入暫存位置 11/6/2020 例說8051 65
yiher Ch 12 -2. asm-16 ; =============== CHAR: DB 04 H, 0 EH, 1 FH, 00 H ; AM DB 00 H, 00 H, 00 H ; PM DB 1 FH, 0 EH, 04 H, 00 H ; =============== END 11/6/2020 例說8051 69
LCD陣列之應用 Bye… 11/6/2020 72