?? 12232f-s.asm
字號:
;*********************************************************************
; 以下程序用以演示一個計時程序,說明中文液晶顯示器12232F的串口驅動用法
; 使用12232F\12MHZ晶振\AT89c52
; 70H-79H計數顯示單元,為空\空\時十位\時個位\:\分十\分個\:\秒十位\秒個位
; 編制日期:2004年1月13日 編制者:LRM
;**********************************************************************
;************定義***************
LAMPBLAK EQU P1.4 ;背光燈控制,=0時開,=1時關.
CS EQU P1.5 ;液晶使能,=1操作,=0禁止.
SID EQU P1.6 ;液晶串行數據輸入口
SCLK EQU P1.7 ;液晶串行操作時鐘口
TIMEVA EQU 30H ;20次計數用
SFLG BIT 00H ;1秒到標志
;************程序入口***********
ORG 0000H ;程序執行開始地址
LJMP START ;跳到標號START執行
ORG 0003H ;外中斷0中斷程序入口
RETI ;外中斷0中斷返回
ORG 000BH ;定時器T0中斷程序入口
LJMP INTT0 ;跳至INTTO執行
ORG 0013H ;外中斷1中斷程序入口
RETI ;外中斷1中斷返回
ORG 001BH ;定時器T1中斷程序入口
RETI ;LJMP INTT1 ;跳至INTT1執行
ORG 0023H ;串行中斷程序入口地址
RETI ;串行中斷程序返回
;**********主程序****************
START: CLR CS ;液晶操作禁止
mov SP, #60H ;堆棧在60H上
MOV TMOD,#11H ;設T0、T1為16位定時器
MOV TL0,#0B0H ;50MS定時初值(T0計時用)
MOV TH0,#3CH ;50MS定時初值
MOV TL1,#0B0H ;50MS定時初值(T1閃爍定時用)
MOV TH1,#3CH ;50MS定時初值
SETB EA ;總中斷開放
SETB ET0 ;允許T0中斷
CLR SFLG ;清1秒標志
MOV TIMEVA,#14H ;1秒定時計數用初值(50MS×20)
MOV R1,#70H
MOV R2,#10H
CLOOP: MOV @R1,#00H ;清70H-7FH內存
INC R1
DJNZ R2,CLOOP
MOV 70H,#0AH ;放北京時間后的“:”代碼字
MOV 71H,#0FH ;空
MOV 74H,#0AH ; ": "
MOV 77H,#0AH ; ": "
;
LCALL SETUP ;LCD初始化
LCALL LOGON ;開機顯示畫面
LCALL LOGON1 ;
LCALL TIME ;上行顯示"北京時間:000000"
SETB TR0 ;開啟T0定時器
JBLOOP: JNB SFLG,JBLOOP ;判斷是否到1秒
CLR SFLG ;
LCALL TIMEUP ;1秒到涮新顯示
AJMP JBLOOP ;
NOP ;軟件井
NOP
NOP
NOP
AJMP START ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 1秒計時程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;T0中斷服務程序
INTT0: PUSH ACC ;累加器入棧保護
PUSH PSW ;狀態字入棧保護
MOV PSW,#18H
CLR ET0 ;關T0中斷允許
CLR TR0 ;關閉定時器T0
MOV A,#0B7H ;中斷響應時間同步修正
ADD A,TL0 ;低8位初值修正
MOV TL0,A ;重裝初值(低8位修正值)
MOV A,#3CH ;高8位初值修正
ADDC A,TH0 ;
MOV TH0,A ;重裝初值(高8位修正值)
SETB TR0 ;開啟定時器T0
DJNZ TIMEVA, OUTTT ;20次中斷未到中斷退出
ADDSS: MOV TIMEVA,#14H ;20次中斷到(1秒)重賦初值
MOV R0,#78H ;指向秒計時單元(78H-79H)
ACALL ADD1 ;調用加1程序(加1秒操作)
MOV A,R3 ;秒數據放入A(R3為2位十進制數組合)
CLR C ;清進位標志
CJNE A,#60H,ADDMM ;
ADDMM: JC OUTT0 ;小于60秒時中斷退出
ACALL CLR0 ;大于或等于60秒時對秒計時單元清0
MOV R0,#75H ;指向分計時單元(75H-76H)
ACALL ADD1 ;分計時單元加1分鐘
MOV A,R3 ;分數據放入A
CLR C ;清進位標志
CJNE A,#60H,ADDHH ;
ADDHH: JC OUTT0 ;小于60分時中斷退出
ACALL CLR0 ;大于或等于60分時分計時單元清0
MOV R0,#72H ;指向小時計時單元(72H-73H)
ACALL ADD1 ;小時計時單元加1小時
MOV A,R3 ;時數據放入A
CLR C ;清進位標志
CJNE A,#24H,HOUR ;
HOUR: JC OUTT0 ;小于24小時中斷退出
ACALL CLR0 ;大于或等于24小時小時計時單元清0
OUTT0: SETB SFLG ;置1秒標志
OUTTT: POP PSW ;恢復狀態字(出棧)
POP ACC ;恢復累加器
SETB ET0 ;開放T0中斷
RETI ;中斷返回
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 加1子 程 序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
ADD1: MOV A,@R0 ;取當前計時單元數據到A
INC R0 ;指向前一地址
SWAP A ;A中數據高四位與低四位交換
ORL A,@R0 ;前一地址中數據放入A中低四位
ADD A,#01H ;A加1操作
DA A ;十進制調整
MOV R3,A ;移入R3寄存器
ANL A,#0FH ;高四位變0
MOV @R0,A ;放回前一地址單元
MOV A,R3 ;取回R3中暫存數據
DEC R0 ;指向當前地址單元
SWAP A ;A中數據高四位與低四位交換
ANL A,#0FH ;高四位變0
MOV @R0,A ;數據放入當削地址單元中
RET ;子程序返回
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 清零程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;對計時單元復零用
CLR0: CLR A ;清累加器
MOV @R0,A ;清當前地址單元
INC R0 ;指向前一地址
MOV @R0,A ;前一地址單元清0
RET ;子程序返回
;
;**************************************************
;
;******************時間顯示子程序*******************
TIME: MOV A,#80H ;第一行左第一個字開始
LCALL WRITE_COM
MOV DPTR,#CHINESE2 ;16*16點陣“時間”
LCALL WRITE_HZ2
;
TIMEUP:
MOV A,#82H ;第一行左第5個字開始
LCALL WRITE_COM
MOV R1,#70H ;將70-75H時間數據查出字碼寫入LCD
MOV DPTR,#TABLE1
MOV R2,#0AH ; 查10次
MOV A,#00H
MOVCLOP:MOV A,@R1 ;
MOVC A,@A+DPTR
LCALL WRITE_DAT
INC R1
DJNZ R2,MOVCLOP ;
RET
;
;***************開機顯示畫面***********************
LOGON: MOV A,#80H ;第一行左第一個字開始
LCALL WRITE_COM
MOV DPTR,#CHINESE ;WORD 16*16點陣TEST
LCALL WRITE_HZ
MOV A,#90H ;第二行左第一個字開始
LCALL WRITE_COM
MOV DPTR,#CHINESE1 ;WORD 16*16點陣TEST
LCALL WRITE_HZ
CLR LAMPBLAK ;開背光燈
LCALL DELAY5S ;顯示5秒
SETB LAMPBLAK ;關背光燈
RET
;**********初始化程序*************
SETUP:
MOV A,#01H ;CLEAR DISPLAY
LCALL WRITE_COM
MOV A,#00110000B ;FUNCTION SETTING
LCALL WRITE_COM
MOV A,#00000010B ;DDRAM SET TO '00H'
LCALL WRITE_COM
MOV A,#00000100B ;
LCALL WRITE_COM
MOV A,#00001100B ;DISPLAY ON
LCALL WRITE_COM
MOV A,#00000001B ;CLEARING SCREEN
LCALL WRITE_COM
MOV A,#10000000B ;SET DDRAM ADDRESS
LCALL WRITE_COM
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
RET
;************串行命令寫入子程序****************
;寫入命令字在A中
WRITE_COM:
LCALL DELAY1 ;
SETB CS
PUSH ACC
MOV R0,#8
MOV A,#11111000B
COMM1:
CLR C
RLC A
MOV SID,C
CLR SCLK
SETB SCLK
DJNZ R0,COMM1
POP ACC
MOV R5,A
ANL A,#0F0H
MOV R0,#8
COMM2: CLR C
RLC A
MOV SID,C
CLR SCLK
SETB SCLK
DJNZ R0,COMM2
MOV A,R5
SWAP A
ANL A,#0F0H
MOV R0,#8
COMM3: CLR C
RLC A
MOV SID,C
CLR SCLK
SETB SCLK
DJNZ R0,COMM3
CLR CS
RET
;
;***********串行數據寫入子程序****************
;寫入數據字在A中
WRITE_DAT:
LCALL DELAY1
SETB CS
PUSH ACC
MOV R0,#8
MOV A,#11111010B
DATA1: CLR C
RLC A
MOV SID,C
CLR SCLK
SETB SCLK
DJNZ R0,DATA1
POP ACC
MOV R5,A
ANL A,#0F0H
MOV R0,#8
DATA2: CLR C
RLC A
MOV SID,C
CLR SCLK
SETB SCLK
DJNZ R0,DATA2
MOV A,R5
SWAP A
ANL A,#0F0H
MOV R0,#8
DATA3: CLR C
RLC A
MOV SID,C
CLR SCLK
SETB SCLK
DJNZ R0,DATA3
CLR CS
RET
;
;**************延時子程序**********************
;0.544ms
DELAY1:
MOV R7,#010H
D11: MOV R6,#010H
DJNZ R6,$
DJNZ R7,D11
RET
;0.13s
DELAY:
MOV R1,#00H
D2: MOV R2,#00H
DJNZ R2,$
DJNZ R1,D2
RET
;5.2s
DELAY5S:MOV R3,#28H
DE5S: LCALL DELAY
DJNZ R3,DE5S
RET
;
;************16*8點陣字寫入子程序共16個******************
WRITE_ASCII:
MOV R4,#16
DDDD: CLR A
MOVC A,@A+DPTR
LCALL WRITE_DAT
INC DPTR
DJNZ R4,DDDD
RET
;************16*8點陣字寫入子程序共7個******************
WRITE_ASCII7:
MOV R4,#7
DDDD7: MOV A,@R0
LCALL WRITE_DAT
INC R0
DJNZ R4,DDDD7
RET
;************16*16點陣漢字寫入子程序共7個***********
WRITE_HZ: ;WRITE 7 CHINESE TO LCD
MOV R4,#7
DD: CLR A
MOVC A,@A+DPTR
INC DPTR
LCALL WRITE_DAT
CLR A
MOVC A,@A+DPTR
INC DPTR
LCALL WRITE_DAT
DJNZ R4,DD
RET
;************16*16點陣漢字寫入子程序共2個***********
WRITE_HZ2: ;WRITE 8 CHINESE TO LCD
MOV R4,#2
DD4: CLR A
MOVC A,@A+DPTR
INC DPTR
LCALL WRITE_DAT
CLR A
MOVC A,@A+DPTR
INC DPTR
LCALL WRITE_DAT
DJNZ R4,DD4
RET
;
;*****************************16*8點陣的字符代碼表**********************************
TABLE1: DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,3AH,3BH,3CH,3DH,3EH,20H
; 0 1 2 3 4 5 6 7 8 9 : ; < = > "不顯"
;**********************************自造字符地址表***********************************
CGRAM1: DB 000H,000H
CGRAM2: DB 000H,002H
CGRAM3: DB 000H,004H
CGRAM4: DB 000H,006H
;******************"這里是16*16點陣的漢字代碼表"************************************
CHINESE: DW 0DBA0H,0D5E3H,0BDADH,0BAA3H,0D1F3H,0D1A7H,0D4BAH,0DBA0H;—浙江海洋學院—
CHINESE1: DW 0C2A5H,0C8BBH,0C3E7H,0B1CFH,0D2B5H,0C9E8H,0BCC6H,0DBA0H;樓然苗畢業設計—
CHINESE2: DW 0CAB1H,0BCE4H ;時間
CHINESE5: DW 0DBA0H,0DBA0H,0DBA0H,0DBA0H,0DBA0H,0DBA0H,0DBA0H,0B5E7H,0D7D3H,0C9E8H,0BCC6H,0B4F3H,0C8FCH,0DBA0H,0DBA0H;—電子設計大賽—
CHINESE6: DW 0DBA0H,0DBA0H,0DBA0H,0DBA0H,0DBA0H,0DBA0H,0DBA0H,0CEDEH,0CFDEH,0BCA4H,0C7E9H,0B4B4H,0D4ECH,0DBA0H,0DBA0H;—無限激情創造
;
;***************開機顯示畫面***********************
LOGON1: CLR LAMPBLAK ;開背光燈
MOV 30H,#07H
MOV DPTR,#CHINESE5 ;WORD 16*16點陣TEST
A11: MOV A,#80H ;第一行左第一個字開始
LCALL WRITE_COM ;第一行左移出7個字
LCALL WRITE_HZ
LCALL DELAY
LCALL DELAY
LCALL DELAY
MOV A, DPL
SUBB A,#0CH
MOV DPL,A
MOV A, DPH
SUBB A,#00H
MOV DPH,A
DJNZ 30H,A11
;
MOV 30H,#07H
MOV DPTR,#CHINESE6 ;WORD 16*16點陣TEST
A22: MOV A,#90H ;第二行左第一個字開始
LCALL WRITE_COM ;第二行左移出7個字
LCALL WRITE_HZ
LCALL DELAY
LCALL DELAY
; LCALL DELAY
MOV A, DPL
SUBB A,#0CH
MOV DPL,A
MOV A, DPH
SUBB A,#00H
MOV DPH,A
DJNZ 30H,A22
;
LCALL DELAY5S ;顯示5秒
SETB LAMPBLAK ;關背光燈
RET
END
;********************************結束************************************************
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -