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

📄 lcdled.asm

📁 达盛单片机试验箱
💻 ASM
📖 第 1 页 / 共 2 页
字号:
XPOS   		DATA    50H					;列方向地址指针
YPOS   		DATA   	51H					;行方向地址指针
;
CS2			EQU		0200H				;P2.1
CS1			EQU		0400H				;P2.2
CS			EQU		8000H				;P2.7
RW     		EQU   	0800H				;P2.3	
RS			EQU		0100H				;P2.0
;
SER			BIT		P1.4
SCLR		BIT		P1.5
SRCLK		BIT		P1.6
RCK			BIT		P1.7

REGA		DATA	30H
REGB		DATA	31H
REGC		DATA	32H
REGD		DATA	33H
REGE		DATA	34H
				
			ORG		0000H
			AJMP	LCD
			
			ORG		0030H	

;				
;******************************************************************************************
;
;						/*LCD液晶显示实验*/
;	
;******************************************************************************************			
;

LCD:		MOV		SP,#60H
			CALL    LCDRESET			;复位
	      	MOV		A,#00H	
	       	CALL	LCDFILL				;空格填充整屏
	       	MOV		XPOS,#00H			;设置页
	 		MOV		YPOS,#00H			;设置列
	        MOV		DPTR,#STRING1		;字符串首地址
	        MOV		REGD,DPL
	        MOV		REGE,DPH
	        
LCD1:    	CALL	PUTSTR					
	        AJMP	LCD1
;	        
;*****************************************************************************
;		/* 显示字符子程序 */
;*****************************************************************************

PUTSTR:		CALL    LCDRESET			;复位
;			CALL	LCDELAY				;延时
			CALL	GETADDR				;取要显示字符的地址
			PUSH	DPL
			PUSH	DPH
			JNB		B.7,PSRE			;判断是中文还是英文
			CALL	HZKPOS						
			CALL	PUTCHARDOT			;显示中文
			CALL	PUTCHARDOT
			JMP		PSR1
PSRE:		CALL	HZKPOS				;显示英文					
			CALL	PUTCHARDOT
PSR1:		POP		DPH
			POP		DPL
			RET
;			
;*****************************************************************************
;		/* 计算字符在库中的地址 */
;*****************************************************************************
;
HZKPOS:		MOV		R2,#5				;32字节								
HZKPOS1:	CLR		C
			RLC		A
			MOV		R0,A
			MOV		A,B
			RLC		A
			MOV		B,A
			MOV		A,R0
			DJNZ	R2,HZKPOS1			
			MOV		DPTR,#HZKDOT
			ADD		A,DPL
			MOV		DPL,A
			MOV		A,B
			ADDC	A,DPH
			MOV		DPH,A
			RET
;
;*****************************************************************************
;		/* 显示半个中文或一个英文子程序 */
;*****************************************************************************
;      	
PUTCHARDOT:	MOV		R7,#8
PAC_PA:		CLR		A
			MOVC	A,@A+DPTR			;取出字符
			CALL	LCDWRITE			;显示字符(上半段)
			INC		YPOS
			INC		DPTR
			CLR		A
			MOVC	A,@A+DPTR			;取出字符
			CALL	LCDWRITE			;显示字符(下半段)
			DEC		YPOS
			INC		DPTR
			CALL	CUSORNEXT
			MOV		A,XPOS
			JNZ		PAC_LAX
			INC		YPOS
PAC_LAX:	DJNZ	R7,PAC_PA
			RET
;			
;*****************************************************************************
;		/* 调整行列指针 */
;*****************************************************************************
;	
CUSORNEXT:	ANL		YPOS,#7
			INC		XPOS
			MOV		A,XPOS
			JNB		ACC.7,CNT_LAX
			MOV		XPOS,#0				;满128列列指针赋初值
			INC		YPOS				;行指针加1
			MOV		A,YPOS
			ANL		A,#0F8H
			JZ		CNT_LAX
			MOV		YPOS,#0				;满8行行指针赋初值
CNT_LAX:	RET
;
;*****************************************************************************
;		/* 取字符的地址 */
;*****************************************************************************
;       
GETADDR:	MOV		DPL,REGD
			MOV		DPH,REGE
			CLR		A									
			MOVC	A,@A+DPTR		
			INC		DPTR
			MOV		B,A
			INC		A
			JZ		GETADDR1			;取出的数据的为00转并清零标志位
			CLR		A
			MOVC	A,@A+DPTR
			CJNE	A,#0FFH,GETADDR2	;检查是否是最后一个字符
			CALL	DELAY400MS							
			CALL	DELAY400MS
			CALL	DELAY400MS
GETADDR1:
		LJMP	LED					;若是最后一个字符转到开始
;		AJMP	LCD
GETADDR2:	INC		DPTR
			MOV		REGD,DPL
			MOV		REGE,DPH
			RET
;
;*****************************************************************************
;		/* 定位并写数据子程序 */
;*****************************************************************************
;
LCDWRITE:   CALL    LCDPOS				;内部写数指针定位
	        CALL    LCDWD				;写数据
	        RET
;	        
;*****************************************************************************
;		/* 内部写数指针定位子程序*/
;*****************************************************************************
;
LCDPOS:  	PUSH    ACC
	        MOV     A,XPOS
	        JB      ACC.6,LPOS1
	        MOV     A,YPOS				;XPOS列方向小于64则对CS1操作
	        ANL     A,#07H
	        ADD     A,#0B8H
	        CALL    LCDWC1				;设页码
	        MOV     A,XPOS
	        ANL     A,#3FH
	        ADD     A,#40H
	        CALL    LCDWC1				;设列码
	        AJMP	LPOS2
LPOS1:		MOV     A,YPOS				;XPOS列方向大于等于64则对CS2操作
	        ANL     A,#07H
	        ADD     A,#0B8H
	        CALL    LCDWC2				;设页码
        	MOV     A,XPOS
        	ANL     A,#3FH
        	ORL     A,#40H
        	CALL    LCDWC2				;设列码
LPOS2:		POP     ACC
        	RET
;        	
;*****************************************************************************
;		/* 送数据子程序 */
;*****************************************************************************
;            	
LCDWD:     	MOV     B,A          						
       		MOV     A,XPOS
       	 	JB      ACC.6,LWD1
        	MOV     A,B					;XPOS列方向小于64则对CS1操作
        	CALL    LCDWD1
        	JMP     LWD2
LWD1:		MOV     A,B					;XPOS列方向大于等于64则对CS2操作
        	CALL    LCDWD2
LWD2:		RET 
;
;*****************************************************************************
;		/* LCD整屏显示A的内容 */
;*****************************************************************************
;
LCDFILL:    MOV     R7,A
	        MOV     YPOS,#00H
LCDFILL1: 	MOV     XPOS,#00H
LCDFILL2: 	MOV     A,R7
	        CALL    LCDWRITE			;定位并写数据
	        INC     XPOS
	        MOV     A,XPOS
	        CJNE    A,#128,LCDFILL2		;XPOS<128则循环(128列)
	        INC     YPOS
	        MOV     A,YPOS
	        CJNE    A,#8,LCDFILL1		;YPOS<8则循环(8页)
	        MOV     XPOS,#0
	        MOV     YPOS,#0
	        RET
;
;*****************************************************************************
;		/* LCD控制器复位 */
;*****************************************************************************
;     
LCDRESET:   MOV     A,#3FH				;打开LCD显示  
        	CALL    LCDWC1
        	CALL    LCDWC2
        	MOV     A,#0C0H				;设显示起始行
        	CALL    LCDWC1
        	CALL    LCDWC2
       		RET
;       	
;*****************************************************************************
;		/* 送控制字子程序 */
;*****************************************************************************     		
;
LCDWC1:    	PUSH	DPH
			PUSH	DPL
			CALL    WAITIDLE1
			MOV		DPTR,#CS+CS1		;E=1 CS1=1 RS=0
			MOVX	@DPTR,A
       		POP		DPL
       		POP		DPH
       		RET    		

LCDWC2: 	PUSH	DPH
			PUSH	DPL
			CALL    WAITIDLE2
			MOV		DPTR,#CS+CS2		;E=1 CS2=1 RS=0
			MOVX	@DPTR,A
       		POP		DPL
       		POP		DPH
      	 	RET
;
;*****************************************************************************
;		/* 写数据子程序 */
;*****************************************************************************     	 	
;
LCDWD1:	 	PUSH	DPH
			PUSH	DPL
			CALL    WAITIDLE1
			MOV		DPTR,#CS+CS1+RS		;E=1 CS1=1 RS=1
			MOVX	@DPTR,A
       		POP		DPL
       		POP		DPH
       		RET   
;
LCDWD2:	 	PUSH	DPH
			PUSH	DPL
			CALL    WAITIDLE2
			MOV		DPTR,#CS+CS2+RS		;E=1 CS2=1 RS=1
			MOVX	@DPTR,A
      	 	POP		DPL
       		POP		DPH
       		RET 
;
;*****************************************************************************
;		/* 读数据子程序 */
;*****************************************************************************
;
LCDRD1:	 	PUSH	DPH
			PUSH	DPL
			CALL    WAITIDLE1
			MOV		DPTR,#CS+CS1+RS+RW	;E=1 CS1=1 RS=1
			MOVX	A,@DPTR
       		POP		DPL
       		POP		DPH
       		RET   
;      		
LCDRD2:	   	PUSH	DPH
			PUSH	DPL
			CALL    WAITIDLE2
			MOV		DPTR,#CS+CS2+RS+RW	;E=1 CS2=1 RS=1
			MOVX	A,@DPTR
       		POP		DPL
       		POP		DPH
       		RET 
;
;*****************************************************************************
;		/* 检忙子程序 */
;*****************************************************************************
;
WAITIDLE1:	PUSH	DPH
			PUSH	DPL
			PUSH	ACC
			MOV		DPTR,#CS+CS1+RW		;E=1 CS2=1 RS=1
WT1_PA:		MOVX	A,@DPTR
			JB		ACC.7,WT1_PA
       		POP		ACC
       		POP		DPL
       		POP		DPH
			RET    
;	   	
WAITIDLE2:	PUSH	DPH
			PUSH	DPL
			PUSH	ACC
			MOV		DPTR,#CS+CS2+RW		;E=1 CS2=1 RS=1
WT2_PA:		MOVX	A,@DPTR
			JB		ACC.7,WT2_PA
	       	POP		ACC
	       	POP		DPL
	       	POP		DPH
			RET   
;
;*****************************************************************************
;		/* 延时子程序 */
;*****************************************************************************			
;
DELAY400MS:	MOV     R7,#20             	 ;400MS			
DL4_PA: 	MOV     R6,#100
DL4_PB: 	MOV     R5,#100
        	DJNZ    R5,$
        	DJNZ    R6,DL4_PB
       		DJNZ    R7,DL4_PA
        	RET
;
LCDELAY:	MOV		R6,#1
DLY_PA:		MOV		R5,#0
DLY_PB:		MOV		R4,#0
			DJNZ	R4,$
			DJNZ	R5,DLY_PB
			DJNZ	R6,DLY_PA
			RET           	
;

			
;
;******************************************************************************************
;
;						/*点阵LED滚动屏实验*/
;	
;******************************************************************************************			
;16X16LED汉字显示实验,移动显示“欢迎使用”
;列扫描由74LS154控制P1.0-P1.3对应154的A-D
;行扫描由74HC595移位控制
;P1.4-SER,P1.5-SCLR、P1.6-SRCLK,P1.7-RCK
;		
LED:		
;			JB		FLAGC,LED1
			MOV		REGC,#04H				;延时常数
			MOV		DPTR,#LEDTAB		;汉字表的位置
			MOV		REGA,DPL
			MOV		REGB,DPH
LED1:		MOV		DPL,REGA	 		
			MOV		DPH,REGB

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -