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

📄 ch_lcd.asm

📁 凌阳的液晶驱动 61板
💻 ASM
字号:

.include hardware.inc
//======================
//宏定义
//======================
RS1: .macro
   r2=[P_IOB_Data]
   r2|=0x0001
   [P_IOB_Data]=r2
.endm
RS0: .macro
   r2=[P_IOB_Data]
   r2&=0xfffe
   [P_IOB_Data]=r2
   .endm
RW1: .macro
   r2=[P_IOB_Data]
   r2|=0x0002
   [P_IOB_Data]=r2
.endm
RW0: .macro
   r2=[P_IOB_Data]
   r2&=0xfffd
   [P_IOB_Data]=r2
   .endm
E1: .macro
   r2=[P_IOB_Data]
   r2|=0x0010
   [P_IOB_Data]=r2
   .endm
E0: .macro
   r2=[P_IOB_Data]
   r2&=0xffef
   [P_IOB_Data]=r2
   .endm
.ram
.var count
.text
//=================================================================
//初始化LCD
//=================================================================
.public _Ch_InitLcd
_Ch_InitLcd:   
    r1=0
    [0x7013]=r1
    r1=[P_IOA_Dir]              //D0-D7方向
    r1|=0xff00
    [P_IOA_Dir]=r1
    
    r1=[P_IOA_Attrib]           //属性
    r1|=0xff00
    [P_IOA_Attrib]=r1
    
    r1=[P_IOA_Data]            //初始值
    r1&=0x00ff
    [P_IOA_Data]=r1
    
    r1=[P_IOB_Dir]             //Rs,RW,E的属性和初始值
    r1|=0x0013
    [P_IOB_Dir]=r1
    
    r1=[P_IOB_Attrib]
    r1|=0x0013
    [P_IOB_Attrib]=r1
    
    r1=[P_IOB_Data]
    r1&=0xffec
    [P_IOB_Data]=r1
    
//    r1=0x3400                 //扩展指令
//    call F_Send_I
    r1=0x3000                 //基本指令
    call F_Send_I
    r1=0x0100                  //清屏
    call F_Send_I
    r1=0x0600                  //点设定 
    call F_Send_I
    r1=0x0c00                  //显示状态
    call F_Send_I
    retf
//=========================================
//原型:void Ch_Lcd(UINT ulcd,UINT Ulcd_start)
//参数描述:
//ulcd C里调用的数组名   
//Ulcd_start数组起始位置  
//
//
//=========================================    
.public _Ch_Lcd
_Ch_Lcd:
    push bp to [sp]
    bp=sp+1
    r1=[bp+3]          //取第一个参数
    r2=[bp+4]          //取第二个参数
    r3=r1
    r3=r3+r2           //选取显示起驶位置
    r2=0               //计数器清0
    [count]=r2
    JMP Ch_Lcd_loop1
Lcd_SecLine:
    r1=0x9000
    call F_Send_I
    JMP Ch_Lcd_loop1
Lcd_ThrLine:
    r1=0x8800
    call F_Send_I
    JMP Ch_Lcd_loop1
Lcd_ForLine:
    r1=0x9800
    call F_Send_I
    JMP Ch_Lcd_loop1
Ch_Lcd_loop1:
    r1=0
    r1+=r3
    r1=[r1]                         //取到了数值
ch_dontchange:
    call F_Send_D
    r3+=1                           //取下一个
    r2=[count]
    r2+=1                           //计数器+1
    [count]=r2
    cmp r2,16
    JE   Lcd_SecLine
    cmp r2,32
    Je   Lcd_ThrLine
    cmp r2,48
    Je   Lcd_ForLine
    cmp r2,64
    je lcd_exit
    JMP Ch_Lcd_loop1
    
lcd_exit:
    pop bp from [sp]
    retf
//=====================================================
//函数原形:void Send_LcdCommand(UIINT Comm)
//功能:在C里发送命令
//=====================================================
.public _Send_LcdCommand    
_Send_LcdCommand:
    push bp to [sp]
    bp=sp+1
    r1=[bp+3]
    call F_Send_I
    pop bp from [sp]
    retf
//=====================================================
//功能:发送指令
//=====================================================
.public F_Send_I
F_Send_I:
    call F_Chk_Busy;
    RS0;     //指令
    RW0;     //写
    r2=[P_IOA_Data]
    r2&=0x00ff
    r2|=r1
    [P_IOA_Data]=r2
    E1;
    nop
    nop
    nop
    nop
    E0;
    retf
//======================================================
//功能:发送数据
//======================================================
.public F_Send_D
F_Send_D:
   call F_Chk_Busy
   RS1;
   RW0;
   r1=r1 lsl 4
   r1=r1 lsl 4
   r2=[P_IOA_Data]
   r2&=0x00ff
   r2|=r1
   [P_IOA_Data]=r2
   E1;
   nop
   nop
   nop
   nop
   E0;
   retf
.public F_Chk_Busy
F_Chk_Busy:
   RS0;
   RW1;
   E1;
   nop
   nop
   nop
   nop
   r2=[P_IOA_Dir]
   r2&=0x7fff
   [P_IOA_Dir]=r2
loop:
   r2=1
   [0x7012]=r2
   r2=0x8000
   test r2,[P_IOA_Data]
   JNZ loop
   E0;
   r2=[P_IOA_Dir]
   r2|=0x8000
   [P_IOA_Dir]=r2
   retf  
.public _Clr_Watchdog
_Clr_Watchdog:
   r1=1
   [0x7012]=r1
   retf















⌨️ 快捷键说明

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