⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 12232f-s.asm

📁 使用12232f液晶串口程序演示 汇编源代码
💻 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 + -