单片机入门汇编程序 程序12-7:128×64点阵液晶屏的程序
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
RET ; 定位并写数据子程序 LCDWRITE: CALL CALL RET ; 光标下移子程序 CUSORNEXT: ANL INC MOV JNB MOV INC MOV ANL JZ MOV CNT_LAX: RET ; 内部写数指针定位子程序 LCDPOS: PUSH MOV JB MOV ANL ADD CALL MOV ANL ORL CALL JMP LPS_LAY: MOV ANL ADD CALL MOV ANL ORL CALL LPS_LAX: POP RET ; 送数据子程序 A ; A 弹栈 A,YPOS A,#07H A,#0B8H LCDWC2 A,XPOS A,#3FH A,#40H LCDWC2 ; XPOS 列方向大于等于 64 则对右半屏操作 ; A 与立即数 07H 作与运算 ; (A)=(A)+B8H ; 设页码 ; (A)=(XPOS) ; A 与立即数 3FH 作与运算 ; A 与立即数 40H 作或运算 ; 设列码 A A,XPOS A.6,LPS_LAY A,YPOS A,#07H A,#0B8H LCDWC1 A,XPOS A,#3FH A,#40H LCDWC1 LPS_LAX ; A 压栈 ; A=XPOS ; 累加器 A 的位 6=1 则跳到 LPS_LAY ; XPOS 列方向小于 64 则对左半屏操作 ; A 与立即数 07H 作与运算 ; A=A+B8H ; 设页码 ; A=XPOS ; A 与立即数 3FH 作与运算 ; A 与立即数 40H 作或运算 ; 设列码 ; 跳至 LPS_LAX YPOS,#7 XPOS A,XPOS XPOS,#0 YPOS A,YPOS A,#0F8H CNT_LAX YPOS,#0 ; YPOS 与立即数 7 作与运算 ; XPOS 加 1 ; A=XPOS ; XPOS=0 ; YPOS 加 1 ; A=YPOS ; A 与立即数 F8H 作与运算 ; A=0 则跳到 CNT_LAX ; YPOS=0 LCDPOS LCDWD ; 内部写数指针定位 ; 写数据
; 右半屏写数据子程序 LCDWD2: CALL MOV SETB CLR SETB SETB NOP CLR CLR RET ; 左半屏读数据子程序 LCDRD1: CALL MOV SETB SETB SETB SETB NOP MOV CLR CLR RET ; 右半屏读数据子程序 LCDRD2: CALL MOV SETB SETB SETB SETB NOP MOV CLR CLR RET A,P1 EPIN CS2PIN WAITIDLE2 P1,#0FFH RSPIN RWPIN CS2PIN EPIN ; D/I=1、RW=1、CS1=2、E=高电平 A,P1 EPIN CS1PIN WAITIDLE1 P1,#0FFH RSPIN RWPIN CS1PIN EPIN ; D/I=1、RW=1、CS1=1、E=高电平 WAITIDLE2 P1,A RSPIN RWPIN CS2PIN EPIN EPIN CS2PIN ; D/I=1、RW=0、CS2=1、E=高脉冲
; D/I=0、RW=0、CS2=1、E=高脉冲
; 左半屏写数据子程序 LCDWD1:
CALL MOV SETB CLR SETB SETB NOP CLR CLR RET
WAITIDLE1 P1,A RSPIN RWPIN CS1PIN EPIN EPIN CS1PIN ; D/I=1、RW=0、CS1=1、E=高脉冲
; 延时子程序(400ms) DELAY400ms: MOV DL4_PA: MOV DL4_PB: MOV DJNZ DJNZ DJNZ RET ; 延时子程序 DELAY: MOV DLY_PA: MOV DLY_PB: MOV R4,#0 R5,#0 R6,#2 R2,#100 R2,$ R1,DL4_PB R0,DL4_PA R1,#100 R0,#20 ; 延时子程序(400ms)
程序 12-7:128× 点阵液晶屏的程序(对应图 12-31) 64 ;*********************************************************************** ;连线图: ;*DB0---P1.0* *DB4---P1.4* *D/I------------P3.0* *CS1----------P3.3* ;*DB1---P1.1* *DB5---P1.5* *RW-------------P3.1* *CS2----------P3.4* ;*DB2---P1.2* *DB6---P1.6* *E--------------P3.2 ;*DB3---P1.3* *DB7---P1.7* */RST-----------VDD(该管脚接+5V,不复位液晶屏) ;*********************************************************************** XPOS YPOS RSPIN RWPIN EPIN CS1PIN CS2PIN ORG 00H EQU EQU EQU EQU EQU EQU EQU 20H 21H P3.0 P3.1 P3.2 P3.3 P3.4 ; 设置列方向的地址指针 ; 设置行方向的地址指针 ; 设置 RSPIN=P3.0,命令/数据选择线 ; 设置 RWPIN=P3.1,读/写控制线 ; 设置 EPIN=P3.2,液晶屏使能端 ; 设置 CS1PIN=P3.3,左半屏幕显示选择 ; 设置 CS2PIN=P3.4,右半屏幕显示选择 ; 起始地址 00H
; 获得字符位置子程序 HZKPOS: MOV HTP_PA: CLR RLC XCH RLC XCH DJNZ MOV ADD MOV MOV ADDC MOV RET ; LCD 整屏显示累加器中的内容 LCDFILL: MOV MOV LFL_PB: MOV LFL_PA: MOV CALL CALL MOV JNZ MOV JNZ A,R7 LCDWRITE CUSORNEXT A,XPOS LFL_PA A,YPOS LFL_PB ; A=R7 ; 定位并写数据 ; 调用光标移动子程序 ; A=XPOS ; XPOS<128 则循环(128 列) ; A=YPOS ; YPOS<8 则循环(8 页) XPOS,#0 ; 清 0 列指针 R7,A YPOS,#0 ; R7=A ; 清 0 行指针 C A A,B A A,B R2,HTP_PA DPTR,#HZKDOT A,DPL DPL,A A,B A,DPH DPH,A ; 进位 C 清 0 ; A 含进位,CY 左移 1 位 ; A 与 B 中数据交换 ; A 含进位,CY 左移 1 位 ; A 与 B 中数据交换 ; R2 减 1,不为 0 则跳到 HTP_PA ; DPTR 指向字符的数据表 ; A=A+DPL ; DPL=A ; A=B ; A=A+DPH+C ; DPH=A R2,#5 ; R2=5
A.7,CNT_LAX ; 累加器 A 的位 7=0 则跳到 CNT_LAX
LCDWD: MOV MOV JB MOV CALL JMP LWD_LAY: MOV CALL LWD_LAX: RET ; LCD 复位子程序 LCDRESET: MOV CALL CALL MOV CALL CALL RET ; 送左半屏控制字子程序 LCDWC1: CALL MOV CLR CLR SETB SETB NOP CLR CLR RET ; 送右半屏控制字子程序 LCDWC2: CALL MOV CLR CLR SETB SETB NOP CLR CLR RET WAITIDLE2 P1,A RSPIN RWPIN CS2PIN EPIN EPIN CS2PIN EPIN CS1PIN WAITIDLE1 P1,A RSPIN RWPIN CS1PIN EPIN ; D/I=0、RW=0、CS1=1、E=高脉冲 A,#3FH LCDWC1 LCDWC2 A,#0C0H LCDWC1 LCDWC2 ; 打开 LCD 显示 ; 调用 LCDWC1 子程序 ; 调用 LCDWC2 子程序 ; 设显示起始行 ; 调用 LCDWC1 子程序 ; 调用 LCDWC2 子程序 A,B LCDWD2 ; XPOS 列方向大于等于 64 则对 CS2 操作 ; 调用写右半屏子程序 B,A A,XPOS A.6,LWD_LAY A,B LCDWD1 LWD_LAX ; B=A ; A=XPOS ; 累加器 A 的位 6=1 则跳到 LWD_LAY ; XPOS 列方向小于 64 则对左半屏操作 ; 调用写左半屏子程序 ; 跳至 LWDV MAIN: CALL MOV CALL MOV CALL CALL JMP LCDRESET A,#55H LCDFILL DPTR,#STRING1 PUTSTR PUTSTR MAIN ; 调用液晶屏复位子程序 ; 写显示数据 ; 调用显示子程序 ; DPTR 指向 HZKSTR.ASM 中的 STRING1 数据表 ; 调用字符输出子程序 SP,#60H ; 设置堆栈指针
CLR MOVC CALL INC INC CLR MOVC CALL DEC INC CALL MOV JNZ INC PAC_LAX: DJNZ RET
A A,@A+DPTR LCDWRITE YPOS DPTR A A,@A+DPTR LCDWRITE YPOS DPTR CUSORNEXT A,XPOS PAC_LAX YPOS R7,PAC_PA
DJNZ DJNZ DJNZ RET
R4,$ R5,DLY_PB R6,DLY_PA
; 获得显示字符子程序 GETSTRCHAR: GSC_PA: CLR MOVC INC MOV INC CLR JZ CLR MOVC INC SETB GSC_LAX: RET ; 字符输出子程序 PUTSTR: CALL CALL PUSH PUSH JNC JNB CHINESE: CALL CALL CALL JMP PSR_LBY: CALL CALL PSR_LBX: POP POP JMP PSR_LAX: POP POP RET ; 获得字符点阵信息子程序 PUTCHARDOT: MOV PAC_PA: R7,#8 ; R7=8 DPH DPL ; DPTR 弹栈 DPH DPL PUTSTR ; 跳至 PUTSTR ; DPTR 弹栈 HZKPOS PUTCHARDOT ; 调用 HZKPOS 子程序 ; 调用 PUTCHARDOT 子程序 HZKPOS PUTCHARDOT PUTCHARDOT PSR_LBX ; 跳至 PSR_LBX 程序段 DELAY GETSTRCHAR DPL DPH PSR_LAX B.7,PSR_LBY ; 若 C=1 则跳到 PSR_LAX 程序段,并清 0 进位 C ; 若 B.7=0 则跳到 PSR_LBY 程序段 ; 汉字显示 ; 调用 HZKPOS 子程序 ; 调用 PUTCHARDOT 子程序 ; 延时 ; 调用获得显示字符子程序 ; 将 DPTR 压栈 A A,@A+DPTR DPTR B,A A C GSC_LAX A A,@A+DPTR DPTR C ; 累加器 A 清 0 ; 累加器 A 寻址 ; DPTR 加 1 ; B=A ; A=A+1 ; 进位 C 清 0 ; A=0 则跳转到 GSC_LAX 程序段 ; A清0 ; 累加器 A 寻址 ; DPTR 加 1 ; 进位 C 置 1
; A清0 ; A 寻址 ; 调用写数据子程序 ; YPOS 加 1 ; DPTR 加 1 ; A清0 ; A 寻址 ; 调用写数据子程序 ; YPOS 减 1 ; DPTR 加 1 ; 调用光标下移子程序 ; A=XPOS ; A≠0,则跳到 PAC_LAX ; YPOS 加 1 ; R7 减 1 不为 0 则跳到 PAC_PA