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

📄 tlcd.asm

📁 1
💻 ASM
字号:

;* 本程序包含控制外部液晶面板的4-BIT控制模式子程序。
;*这些程序是专门为演示板设计的。但它也可作为其他类
;*型的使用 KS0066U控制器的液晶面板的控制程序。  
;* 占用I/O     RB1-RB5,RA5                      
;* 使用RAM     2个字节                        
;* 程序包括:                                   
;*   - InitLCD 初始化液晶面板函数          
;*   - putcLCD 将字符写入 LCD的函数           
;*   - SendCmd 将命令写入 LCD的函数        
;*   - clrLCD  清 LCD显示函数  
;* 入口参数   WREG             
;* 出口参数   无
;*LCD显示RAM地址:第一行0x80~8F;第二行0xC0~CF
;************************************************
#include p16f877a.inc      ;定义所用单片机的头文件

COUNT     EQU   0X20
Count     EQU   0X20;   
COUNT1    EQU   0X21
Count1    EQU   0x21;
COUNT2    EQU   0X22
Count2    EQU   0x22;

LCD_TEMP  EQU   0X23
Byte      EQU   0X24
BYTE      EQU   0X24
LCD_DATA1 EQU   0X25
BYTESH    EQU   0X26 


;* 定义 LCD数据& 控制I/O口   ;可以用任意的6个普通的I/O管脚定义;实际连线依据该部分定义
;*******************************************************************************
#define	LCD_DB7    	PORTB,5  ;占用的I/O口定义   
#define	LCD_DB6    	PORTB,4  ;该行硬件连接:LCD的DB6与RB4连接,其它类推
#define	LCD_DB5    	PORTB,3  ;
#define	LCD_DB4    	PORTB,2  ;
#define	LCD_E    	PORTA,5  ;
#define	LCD_RS    	PORTB,1  ;
#define	LCD_DB7_DIR	TRISB,5   ;对应的方向寄存器定义
#define	LCD_DB6_DIR	TRISB,4   ;
#define	LCD_DB5_DIR	TRISB,3   ;
#define	LCD_DB4_DIR	TRISB,2   ;
#define	LCD_E_DIR	TRISA,5   ;
#define	LCD_RS_DIR	TRISB,1   ; 
;******************************************************************************
; LCD 模块命令
#define	DISP_ON		0x00C	; 开显示
#define	DISP_ON_C	0x00E	; 开显示, 开指针
#define	DISP_ON_B	0x00F	; 开显示, 开指针,开闪烁
#define	DISP_OFF	0x008	; 关显示
#define	CLR_DISP	0x001	; 清显示的操作数
#define	ENTRY_INC	0x006	; 操作数
#define	ENTRY_INC_S	0x007	; 操作数
#define	ENTRY_DEC	0x004	; 操作数
#define	ENTRY_DEC_S	0x005	; 操作数
#define	DD_RAM_ADDR	0x080	; 初始化第一行显示的操作数
#define	DD_RAM_UL	0x0c0	; 初始化第二行显示的操作数


ORG 0X0;
 NOP;
 NOP;
 NOP;
 clrf   INTCON
 call   InitLCD
 call   InitLCD
 call   InitLCD
 call   clrLCD
 call   clrLCD
 call   clrLCD

 MOVLW  'H';
 CALL   PUTCLCD;
 MOVLW  'A'; 
 CALL   PUTCLCD;
 MOVLW  'P';
 CALL   PUTCLCD;
 MOVLW  'P';
 CALL   PUTCLCD;
 MOVLW  'Y';
 CALL   PUTCLCD;

 MOVLW  'E';
 CALL   PUTCLCD;
  MOVLW  'V';
 CALL   PUTCLCD; 
 MOVLW  'E';
 CALL   PUTCLCD;
  MOVLW  'R';
 CALL   PUTCLCD;
 MOVLW  'Y';
 CALL   PUTCLCD;
  MOVLW  'D';
 CALL   PUTCLCD;
  MOVLW  'A';
 CALL   PUTCLCD;
 MOVLW  'Y';
 CALL   PUTCLCD;
 
 GOTO   $;

;InitLCD 初始化LCD模块                                        

InitLCD	

    bsf	    STATUS,RP0			    ;Bank 1
    bcf	    STATUS,RP1              ;初始化相关I/O引脚
    MOVLW   B'11000001';
    ANDWF   TRISB,F;
    ;bcf     LCD_DB7_DIR
    ;bcf     LCD_DB6_DIR
    ;bcf     LCD_DB5_DIR
    ;bcf     LCD_DB4_DIR
    ;bcf     LCD_RS_DIR    
    bcf     LCD_E_DIR
    MOVLW   0X07
    MOVWF   0X1C;CMCON=7
   
    bcf     STATUS,RP0             ;Bank 0
    MOVLW   B'11000001';
    ANDWF   TRISB,F;
    ;bcf     LCD_DB7
    ;bcf     LCD_DB6
    ;bcf     LCD_DB5
    ;bcf     LCD_DB4
    ;bcf     LCD_RS    
    bcf     LCD_E    
    
	bsf     LCD_E                  ;清数据线
	bcf     LCD_E
	
	bsf     LCD_DB5		       ;设置LCD工作方式
 	bsf     LCD_E
	bcf     LCD_E
	call	LongDelay
	
	movlw	0x28                   ;再次设置工作方式
	call	SendCmd                ;四位数据总线,两行显示,5X7点阵字符
	movlw	DISP_ON		       ;开显示
	call	SendCmd              
	movlw	ENTRY_INC	       ;设置指针移动方式
	call	SendCmd
	movlw	DD_RAM_ADDR	       ;设置起始地址
	call	SendCmd
	call	clrLCD                 ;清屏
	return

;*putcLCD  将字符数据送入 LCD                                 	   *
;*            本程序将字符数据分成了高半字节和低半字节分别输入     *
;*            先送入的是高半字节                                   *   

PUTCLCD

    bsf	    LCD_RS	  ;设置为送数据模式
    movwf   Byte	  ;存 WREG 到 Byte 寄存器
    call    write         ;写入高半字节
    swapf   Byte,F	  ;送入数据的低字节
    call    write         ;接着送低半字节
    call    Delay
	return
;*******************************************************************
;* SendCmd - 送命令到 LCD                                          *
;*           本程序将命令数据分成了高半字节和低半字节分别输入      * 
;*           先送入的是高半字节                                    *
;*******************************************************************
SendCmd	

	bcf	LCD_RS        ;设置为送命令模式,与PUTCLCD仅相差此行
	movwf	Byte	      ;存 WREG 到 Byte 寄存器
        call    write         ;送入命令的高字节
	swapf	Byte,F	      ;送入命令的低字节
        call    write
	call	Delay
	return
;*******************************************************************
;* clrLCD - 清除 LCD 显示                                          *
;*******************************************************************
clrLCD
	movlw	CLR_DISP	; 
	call	SendCmd
	return
;*******************************************************************
;*write - 送半个字节数据
;******************************************************************
write
        MOVF    BYTE,W;
        MOVWF   BYTESH;
        BTFSS   PORTB,1;JUGDE RS,AND SAVE TO BYTESH,3
        GOTO    BCFRS;
        BSF     BYTESH,3;
        GOTO    GOGOGO;
 BCFRS  BCF     BYTESH,3;
 GOGOGO         
   	;MOVLW  B'11000011'
   	;ANDWF  PORTB,F;
   	;bcf     LCD_DB7
        ;bcf     LCD_DB6
        ;bcf     LCD_DB5
        ;bcf     LCD_DB4
        
        MOVLW   0XF8;
        ANDWF   BYTESH,F;
        BCF     STATUS,C;      
        RRF     BYTESH,F;
        RRF     BYTESH,F;        
        MOVF    BYTESH,W;
        MOVWF   PORTB;
        
        ;CALL    DELAY
        
        ;btfsc  Byte,7          ;写入半字节
        ;bsf    LCD_DB7
        ;btfsc  Byte,6
        ;bsf    LCD_DB6
        ;btfsc  Byte,5
        ;bsf    LCD_DB5
        ;btfsc  Byte,4
        ;bsf    LCD_DB4
	bsf    LCD_E           	;发送数据信号
        bcf    LCD_E
    return
;***********************************************************

Delay					; call指令占用2个指令周期
	
	clrf	Count			; 清 Count占用1个指令周期
Dloop	
	decfsz	Count,f			; 这两行指令将延时
	goto	Dloop			; (256 * 3) -1 个指令周期
	return				;  return占用2个指令周期
	
LongDelay              ; call指令占用2个指令周期
	
	clrf	Count      ; 清 Count占用1个指令周期
	clrf	Count1     ; 清 Count1占用1个指令周期
	movlw	0x03       ;占用1个指令周期
	movwf	Count2     ;占用1个指令周期
LDloop		
	decfsz	Count,f    ; 这两行指令将延时
	goto	LDloop     ; (256 * 3) -1 个指令周期
	decfsz	Count1,f
	goto	LDloop
	decfsz	Count2,f
	goto	LDloop
	return
	END

⌨️ 快捷键说明

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