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

📄 lcd.s

📁 mage16,LCM1604驱动8线,调试成功
💻 S
字号:
	.module lcd.c
	.area text(rom, con, rel)
	.dbfile G:\lcd1604\avr16-1020-2\lcd.c
	.dbfunc e LCD16xx_init _LCD16xx_init fV
	.even
_LCD16xx_init::
	.dbline -1
	.dbline 32
; /*--------------------------------------------------*/
; /*             AVR-ARM开发网论坛                    */
; /*           http://www.avrarm.com                  */
; /*            AVR生成代码测试程序                   */
; /*--------------------------------------------------*/
; /*     程序由AVR辅助开发工具V2.0.1自动生成          */
; /*     AVR系统的处理器为:   ATMega16               */
; /*     AVR系统的晶振频率:   8.0000 Mhz             */
; /*--------------------------------------------------*/
; 
; #include <iom16v.h>
; #include <macros.h>
; #include "lcd.h"
; #include "delay.h"
; 
; /**********************************************************
; 光标命令
; LCD16xx_write_char(1,0x0e);    //光标开
; LCD16xx_write_char(1,0x0d);    //光标所在字符闪烁
; LCD16xx_write_char(1,0x0c);    //光标关
; **********************************************************/
; /**********************************************************
; TC16xxB LCD DISPLAY
; 建立时间:2006年08月30日
; 修改日期:2006年08月30日
; LCD_write函数功能:当command=0时,向LCD写入数据,否则向LCD写
;                    入命令
; LCD第一行显示寄存器地址:0x80-0x8F
; LCD第二行显示寄存器地址:0xC0-0xCF
; **********************************************************/
; void LCD16xx_init(void)
; {
	.dbline 33
;     LCD_DATA_DDR |=  LCD_DATA;
	in R24,0x14
	ori R24,255
	out 0x14,R24
	.dbline 34
;     LCD_EN_DDR   |=  LCD_EN;
	sbi 0x11,7
	.dbline 35
;     LCD_RS_DDR   |=  LCD_RS;
	sbi 0x11,6
	.dbline 38
; 
; 	
;     LCD_DATA_PORT = 0xff;
	ldi R24,255
	out 0x15,R24
	.dbline 39
;     LCD16xx_en_write();
	xcall _LCD16xx_en_write
	.dbline 40
; 	delay_nus(100);
	ldi R16,100
	ldi R17,0
	xcall _delay_nus
	.dbline 42
; 
;     LCD16xx_write_char(0,0x38);      //4bit test
	ldi R18,56
	clr R16
	xcall _LCD16xx_write_char
	.dbline 43
;     LCD16xx_write_char(0,0x0c);      //显示开
	ldi R18,12
	clr R16
	xcall _LCD16xx_write_char
	.dbline 44
;     LCD16xx_write_char(0,0x01);      //显示清屏
	ldi R18,1
	clr R16
	xcall _LCD16xx_write_char
	.dbline 45
;     LCD16xx_write_char(0,0x06);      //显示光标移动设置
	ldi R18,6
	clr R16
	xcall _LCD16xx_write_char
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e LCD16xx_en_write _LCD16xx_en_write fV
	.even
_LCD16xx_en_write::
	.dbline -1
	.dbline 49
; }
; 
; void LCD16xx_en_write(void)          //EN端产生一个高电平脉冲,写LCD
; {
	.dbline 50
;     LCD_EN_PORT |= LCD_EN;
	sbi 0x12,7
	.dbline 51
;     delay_nus(30);                    //如果晶振频率太高,则可相应提高延时
	ldi R16,30
	ldi R17,0
	xcall _delay_nus
	.dbline 52
;     LCD_EN_PORT &= ~LCD_EN;           //时间短的话,数据发不权,出现乱码
	cbi 0x12,7
	.dbline -2
L2:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e LCD16xx_clr _LCD16xx_clr fV
	.even
_LCD16xx_clr::
	.dbline -1
	.dbline 59
; }
; 
; /************************************************************************/
; /* LCD16xx清屏                                                          */
; /************************************************************************/
; void LCD16xx_clr(void)
; {
	.dbline 60
;     LCD16xx_write_char(1,0x01);
	ldi R18,1
	ldi R16,1
	xcall _LCD16xx_write_char
	.dbline -2
L3:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e LCD16xx_write_char _LCD16xx_write_char fV
;           data -> R20
;        command -> R22
	.even
_LCD16xx_write_char::
	xcall push_gset2
	mov R20,R18
	mov R22,R16
	.dbline -1
	.dbline 76
; }
; 
; /*-----------------------------------------------------------------------
; LCD16xx_write_char    : 英文字符串显示函数
; 
; 输入参数:*s      :英文字符串指针;
;           X、Y    : 显示字符串的位置,X:0-15,Y:0-1
;                     LCD第一行显示寄存器地址:0x80-0x8F
;                     LCD第一行显示寄存器地址:0xC0-0xCF
; 					LCD第三行显示寄存器地址:0x90-0x9F
; 					LCD第四行显示寄存器地址:0xD0-0xDF
; 编写日期          :2006年08月30日
; 最后修改日期      :2006年08月30日
; -----------------------------------------------------------------------*/
; void LCD16xx_write_char(unsigned char command,unsigned char data)
; {
	.dbline 81
;    
;     //LCD16xx_wait_Ready();
;    
;                
;     if (command == 0)                       //data
	tst R22
	brne L5
	.dbline 82
;        LCD_RS_PORT |= LCD_RS;               //RS=1
	sbi 0x12,6
	xjmp L6
L5:
	.dbline 84
;     else                                    //command
;        LCD_RS_PORT &= ~LCD_RS;              //RS=0
	cbi 0x12,6
L6:
	.dbline 87
;        
;   
;     LCD_DATA_PORT &= command;
	in R2,0x15
	and R2,R22
	out 0x15,R2
	.dbline 88
;     LCD_DATA_PORT |= data&0xff;            //send low 4bit
	mov R24,R20
	andi R24,255
	in R2,0x15
	or R2,R24
	out 0x15,R2
	.dbline 89
;     LCD16xx_en_write();
	xcall _LCD16xx_en_write
	.dbline -2
L4:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r data 20 c
	.dbsym r command 22 c
	.dbend
	.dbfunc e LCD16xx_wait_Ready _LCD16xx_wait_Ready fV
	.even
_LCD16xx_wait_Ready::
	.dbline -1
	.dbline 94
; 
; }
; 
; void LCD16xx_wait_Ready(void)              //等待LCD空闲
; {
	.dbline 95
;     LCD_DATA_DDR &= ~0x80;                 //PD7 I/O口方向设置为输入
	cbi 0x14,7
	.dbline 96
;     LCD_RS_PORT &= ~LCD_RS;                //RS=0
	cbi 0x12,6
	.dbline 97
;     LCD_EN_PORT |= LCD_EN;                 //EN=1
	sbi 0x12,7
L8:
	.dbline 98
L9:
	.dbline 98
;     while (!( LCD_DATA_PIN&0x80 ) == 0);   //RW=1,读PD7,为0表示空闲;
	sbic 0x13,7
	rjmp L11
	ldi R16,1
	ldi R17,0
	xjmp L12
L11:
	clr R16
	clr R17
L12:
	cpi R16,0
	cpc R16,R17
	breq L8
X0:
	.dbline 99
;     LCD_EN_PORT &= ~LCD_EN;                //EN=0
	cbi 0x12,7
	.dbline 100
;     LCD_DATA_DDR |= LCD_DATA;
	in R24,0x14
	ori R24,255
	out 0x14,R24
	.dbline -2
L7:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e LCD16xx_set_xy _LCD16xx_set_xy fV
;        address -> R20
;              y -> R10
;              x -> R22
	.even
_LCD16xx_set_xy::
	xcall push_gset3
	mov R10,R18
	mov R22,R16
	.dbline -1
	.dbline 113
; }
; 
; /*-----------------------------------------------------------------------
; LCD_set_xy        : 设置LCD显示的起始位置
; 
; 输入参数:x、y    : 显示字符串的位置,X:0-15,Y:0-1
;                     LCD第一行显示寄存器地址:0x80-0x8F
;                     LCD第一行显示寄存器地址:0xC0-0xCF
; 编写日期          :2006年08月30日
; 最后修改日期      :2006年08月30日
; -----------------------------------------------------------------------*/
; void LCD16xx_set_xy( unsigned char x, unsigned char y )
; {
	.dbline 115
;     unsigned char address;
;     if (y == 0)
	tst R10
	brne L14
	.dbline 116
;        address = 0x81 + x;
	mov R20,R22
	subi R20,127    ; addi 129
	xjmp L15
L14:
	.dbline 117
;     else if(y == 1)
	mov R24,R10
	cpi R24,1
	brne L16
	.dbline 118
;        address = 0xc1 + x;
	mov R20,R22
	subi R20,63    ; addi 193
	xjmp L17
L16:
	.dbline 119
;     else if(y == 2)
	mov R24,R10
	cpi R24,2
	brne L18
	.dbline 120
;        address = 0x91 + x;
	mov R20,R22
	subi R20,111    ; addi 145
	xjmp L19
L18:
	.dbline 121
;     else if(y == 3)
	mov R24,R10
	cpi R24,3
	brne L20
	.dbline 122
;        address = 0xd1 + x;
	mov R20,R22
	subi R20,47    ; addi 209
L20:
L19:
L17:
L15:
	.dbline 123
;     LCD16xx_write_char( 1,address );
	mov R18,R20
	ldi R16,1
	xcall _LCD16xx_write_char
	.dbline -2
L13:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r address 20 c
	.dbsym r y 10 c
	.dbsym r x 22 c
	.dbend
	.dbfunc e LCD16xx_write_string _LCD16xx_write_string fV
;              s -> R20,R21
;              Y -> R10
;              X -> R22
	.even
_LCD16xx_write_string::
	xcall push_gset3
	mov R10,R18
	mov R22,R16
	ldd R20,y+6
	ldd R21,y+7
	.dbline -1
	.dbline 134
; }
; /*-----------------------------------------------------------------------
; LCD16xx_write_string  : 英文字符串显示函数
; 
; 输入参数:*s      :英文字符串指针;
;           X、Y    : 显示字符串的位置
; 编写日期          :2006年08月30日
; 最后修改日期      :2006年08月30日 		
; -----------------------------------------------------------------------*/
; void LCD16xx_write_string(unsigned char X,unsigned char Y,unsigned char *s)
; {
	.dbline 135
;     LCD16xx_set_xy( X, Y );
	mov R18,R10
	mov R16,R22
	xcall _LCD16xx_set_xy
	xjmp L24
L23:
	.dbline 137
	.dbline 138
	movw R30,R20
	ldd R18,z+0
	clr R16
	xcall _LCD16xx_write_char
	.dbline 139
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 140
L24:
	.dbline 136
;     while (*s) 
	movw R30,R20
	ldd R2,z+0
	tst R2
	brne L23
	.dbline -2
L22:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r s 20 pc
	.dbsym r Y 10 c
	.dbsym r X 22 c
	.dbend

⌨️ 快捷键说明

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