📄 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 + -