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

📄 lcd.asm

📁 凌阳十六位单片机的LCD串行汇编代码。LCD型号为HD44780
💻 ASM
字号:
//硬件的连接方式IOB0-IOB7接DB0-DB7  RS接IOB8  R/W接IOB9  E接IOB10
.include hardware.inc
.define  P_SIO_Data  0x701A
.public _Clear_Watchdog
.public _lcd_init
.public _IOB_init
.public _IOA_init
.public _display_line1
.public _display_line2
.public lcd_delay
.public _valid_data
.public _valid_command
.public _SIO_command
.public _SIO_data

.ram
.var     data_value , command_value
.code

_IOB_init: .proc
   r1=0xffff
   r1&=0xfffb
   [P_IOB_Dir]=r1      //初始化IOB口,其中IOB2为输入口
   [P_IOB_Attrib]=r1   
   r1=0x0004
   [P_IOB_Data]=r1
   call _Clear_Watchdog
retf   
.endp

_IOA_init:.proc
    r1=0xfff0
   [P_IOA_Dir]=r1      //初始化IOA口
   [P_IOA_Attrib]=r1   
   r1=0xfff0
   [P_IOA_Data]=r1
   call _Clear_Watchdog
retf   
.endp


/////////////////LCD显示///////////////////
_lcd_init: .proc     

//设置工作方式指令
r1=0x0038
[command_value]=r1
call _SIO_command
call _valid_command
call _Clear_Watchdog

//清屏指令
r1=0x0001
[command_value]=r1
call _SIO_command
call _valid_command
call _Clear_Watchdog

//复位指令
r1=0x0002
[command_value]=r1
call _SIO_command
call _valid_command
call _Clear_Watchdog

//设置输入方式指令
r1=0x0006
[command_value]=r1
call _SIO_command
call _valid_command
call _Clear_Watchdog

//设置画面移动方式指令
r1=0x0014
[command_value]=r1
call _SIO_command
call _valid_command
call _Clear_Watchdog


//设置显示方式指令
r1=0x000f
[command_value]=r1
call _SIO_command
call _valid_command
call _Clear_Watchdog

//设置第一行地址
r3=0x0080
r3+=r2
[command_value]=r3         
call _SIO_command
call _valid_command

retf
.endp

lcd_delay: .proc
    r4 = 0xff00;
lcddelayloop:     
r3 = 0x0001;
       [P_Watchdog_Clear] = r3; 
       r4 += 1;
       jnz lcddelayloop
       retf
.endp



_delay: .proc
   r4 = 0xfd00;
delayloop:      
       r3 = 0x0001;
       [P_Watchdog_Clear] = r3;
       r4 += 1;
       jnz delayloop
       retf	
       .endp


///////////////////LCD显示第一行///////////////////       
_display_line1:  .proc 
   push bp,bp to [sp]
   bp=sp+1
   r1=[bp+3]
   r2=[bp+4]
   r3=0x0080
   r3+=r2
   [command_value]=r3          //设置第一行地址
   call _SIO_command
   call _valid_command

   [data_value]=r1             //传送数值
   call _SIO_data
   call _valid_data

   call _Clear_Watchdog
   pop bp ,bp from  [sp]
retf
.endp
   
   
///////////////////LCD显示第二行///////////////////       
_display_line2:  .proc
    push bp,bp to [sp]
   bp=sp+1
   r1=[bp+3]
   r2=[bp+4]
   r3=0x00c0
   r3+=r2
   [command_value]=r3          //设置第二行地址
   call _SIO_command
   call _valid_command

   [data_value]=r1             //传送数值
   call _SIO_data
   call _valid_data

   call _Clear_Watchdog
   pop bp ,bp from  [sp]
retf
.endp


///////////////SIO传输数据/////////////////////
_SIO_command:
   r3=0x00c9
   [P_SIO_Ctrl]=r3
   r3=0x0001
   [P_SIO_Start]=r3
   r3=[command_value]      //设置命令字
   [P_SIO_Data]=r3
   command_busy:
     r3=0x0080
     Test r3,[P_SIO_Start]
     JNZ command_busy
   call _Clear_Watchdog   
retf

///////////////SIO传输数据/////////////////////
_SIO_data:
   r3=0x00c9
   [P_SIO_Ctrl]=r3
   r3=0x0001
   [P_SIO_Start]=r3
   r3=[data_value]      //设置命令字
   [P_SIO_Data]=r3
   data_busy:
     r3=0x0080
     Test r3,[P_SIO_Start]
     JNZ data_busy
   call _Clear_Watchdog   
retf



////////////////命令字下降沿////////////////////
_valid_command:
   r3=0x0080        //E置1
   [P_IOB_Data] = r3
   call lcd_delay
   r3=0x0000        //E置0
   [P_IOB_Data] = r3
   call _Clear_Watchdog
retf

/////////////////数据下降沿/////////////////////
_valid_data:
   r3=0x00A0        //E置1
   [P_IOB_Data] = r3
   call lcd_delay
   r3=0x0020        //E置0
   [P_IOB_Data] = r3
   call _Clear_Watchdog
retf   



//////////////////////////清看门狗///////////////
_Clear_Watchdog:
   push r1,r5 to [sp]
   r1=0x0001
   [P_Watchdog_Clear]=r1
   pop r1,r5 from [sp]
RETF 

⌨️ 快捷键说明

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