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

📄 lcd.s

📁 ATMEGA16驱动LCD1602的源码
💻 S
字号:
	.module lcd.c
	.area text(rom, con, rel)
	.dbfile E:\2007年电子竞赛\LCD1602\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.1.1自动生成          */
; /*     AVR系统的处理器为:   ATMega128               */
; /*     AVR系统的晶振频率:   1.0000 Mhz             */
; /*--------------------------------------------------*/
; 
; #include <iom128v.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,0x1a
	ori R24,240
	out 0x1a,R24
	.dbline 34
;     LCD_EN_DDR   |=  LCD_EN;
	sbi 0x1a,2
	.dbline 35
;     LCD_RS_DDR   |=  LCD_RS;
	sbi 0x1a,0
	.dbline 36
;     LCD_RW_DDR   |=  LCD_RW;
	sbi 0x1a,1
	.dbline 37
;     RW_L;
	cbi 0x1b,1
	.dbline 39
; 	
;     LCD_DATA_PORT =  0x20;
	ldi R24,32
	out 0x1b,R24
	.dbline 40
;     LCD16xx_en_write();
	xcall _LCD16xx_en_write
	.dbline 41
;     delay_nus(50);
	ldi R16,50
	ldi R17,0
	xcall _delay_nus
	.dbline 43
;    
;     LCD16xx_write_char(1,0x28);      //4bit test
	ldi R18,40
	ldi R16,1
	xcall _LCD16xx_write_char
	.dbline 44
;     delay_nms(5);
	ldi R16,5
	ldi R17,0
	xcall _delay_nms
	.dbline 45
;     LCD16xx_write_char(1,0x0c);      //显示开
	ldi R18,12
	ldi R16,1
	xcall _LCD16xx_write_char
	.dbline 46
;     LCD16xx_write_char(1,0x01);      //显示清屏
	ldi R18,1
	ldi R16,1
	xcall _LCD16xx_write_char
	.dbline 47
;     LCD16xx_write_char(1,0x06);      //显示光标移动设置
	ldi R18,6
	ldi R16,1
	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 51
; }
; 
; void LCD16xx_en_write(void)          //EN端产生一个高电平脉冲,写LCD
; {
	.dbline 52
;     E_H;
	sbi 0x1b,2
	.dbline 53
;     delay_nus(4);                    //如果晶振频率太高,则可相应提高延时
	ldi R16,4
	ldi R17,0
	xcall _delay_nus
	.dbline 54
;     E_L;
	cbi 0x1b,2
	.dbline -2
L2:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e LCD16xx_clr _LCD16xx_clr fV
	.even
_LCD16xx_clr::
	.dbline -1
	.dbline 61
; }
; 
; /************************************************************************/
; /* LCD16xx清屏                                                          */
; /************************************************************************/
; void LCD16xx_clr(void)
; {
	.dbline 62
;     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
;          datal -> R20
;          datah -> R22
;           data -> R20
;        command -> R10
	.even
_LCD16xx_write_char::
	xcall push_gset3
	mov R20,R18
	mov R10,R16
	.dbline -1
	.dbline 76
; }
; 
; /*-----------------------------------------------------------------------
; LCD16xx_write_char    : 英文字符串显示函数
; 
; 输入参数:*s      :英文字符串指针;
;           X、Y    : 显示字符串的位置,X:0-15,Y:0-1
;                     LCD第一行显示寄存器地址:0x80-0x8F
;                     LCD第一行显示寄存器地址:0xC0-0xCF
; 编写日期          :2006年08月30日
; 最后修改日期      :2006年08月30日
; -----------------------------------------------------------------------*/
; void LCD16xx_write_char(unsigned char command,unsigned char data)
; {
	.dbline 79
;     unsigned char datah,datal;        
; 
;     datah = data;
	mov R22,R20
	.dbline 80
;     datal = data<<4 ;
	mov R24,R20
	andi R24,#0x0F
	swap R24
	mov R20,R24
	.dbline 84
; 
;     //LCD16xx_wait_Ready();
;    
;     RW_L;                                   //RW=0
	cbi 0x1b,1
	.dbline 85
;     if (command == 0)                       //data
	tst R10
	brne L5
	.dbline 86
;        RS_H;                                //RS=1
	sbi 0x1b,0
	xjmp L6
L5:
	.dbline 88
;     else                                    //command
;        RS_L;                                //RS=0
	cbi 0x1b,0
L6:
	.dbline 90
;        
;     LCD_DATA_PORT &= 0x0F;
	in R24,0x1b
	andi R24,15
	out 0x1b,R24
	.dbline 91
;     LCD_DATA_PORT |= datah&0xf0;            //send high 4bit
	mov R24,R22
	andi R24,240
	in R2,0x1b
	or R2,R24
	out 0x1b,R2
	.dbline 92
;     LCD16xx_en_write();
	xcall _LCD16xx_en_write
	.dbline 94
; 
;     LCD_DATA_PORT &= 0x0F;
	in R24,0x1b
	andi R24,15
	out 0x1b,R24
	.dbline 95
;     LCD_DATA_PORT |= datal&0xf0;            //send low 4bit
	mov R24,R20
	andi R24,240
	in R2,0x1b
	or R2,R24
	out 0x1b,R2
	.dbline 96
;     LCD16xx_en_write();
	xcall _LCD16xx_en_write
	.dbline -2
L4:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r datal 20 c
	.dbsym r datah 22 c
	.dbsym r data 20 c
	.dbsym r command 10 c
	.dbend
	.dbfunc e LCD16xx_wait_Ready _LCD16xx_wait_Ready fV
	.even
_LCD16xx_wait_Ready::
	.dbline -1
	.dbline 100
; }
; 
; void LCD16xx_wait_Ready(void)              //等待LCD空闲
; {
	.dbline 101
;     LCD_DATA_DDR &= ~0x80;                 //PD7 I/O口方向设置为输入
	cbi 0x1a,7
	.dbline 102
;     RW_H;                                  //RW=1
	sbi 0x1b,1
	.dbline 103
;     RS_L;                                  //RS=0
	cbi 0x1b,0
	.dbline 104
;     E_H;                                   //EN=1
	sbi 0x1b,2
L8:
	.dbline 105
L9:
	.dbline 105
;     while (!( LCD_DATA_PIN&0x80 ) == 0);   //RW=1,读PD7,为0表示空闲;
	sbic 0x19,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 106
;     E_L;                                   //EN=0
	cbi 0x1b,2
	.dbline 107
;     LCD_DATA_DDR |= LCD_DATA;
	in R24,0x1a
	ori R24,240
	out 0x1a,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 120
; }
; 
; /*-----------------------------------------------------------------------
; 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 122
;     unsigned char address;
;     if (y == 0)
	tst R10
	brne L14
	.dbline 123
;        address = 0x80 + x;
	mov R20,R22
	subi R20,128    ; addi 128
	xjmp L15
L14:
	.dbline 124
;     else if(y == 1)
	mov R24,R10
	cpi R24,1
	brne L16
	.dbline 125
;        address = 0xc0 + x;
	mov R20,R22
	subi R20,64    ; addi 192
	xjmp L17
L16:
	.dbline 126
;     else if(y == 2)
	mov R24,R10
	cpi R24,2
	brne L18
	.dbline 127
;        address = 0x90 + x;
	mov R20,R22
	subi R20,112    ; addi 144
	xjmp L19
L18:
	.dbline 129
;     else
;        address = 0xd0 + x;
	mov R20,R22
	subi R20,48    ; addi 208
L19:
L17:
L15:
	.dbline 130
;     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 141
; }
; /*-----------------------------------------------------------------------
; 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 142
;     LCD16xx_set_xy( X, Y );
	mov R18,R10
	mov R16,R22
	xcall _LCD16xx_set_xy
	xjmp L22
L21:
	.dbline 144
	.dbline 145
	ldi R16,5
	ldi R17,0
	xcall _delay_nus
	.dbline 146
	movw R30,R20
	ldd R18,z+0
	clr R16
	xcall _LCD16xx_write_char
	.dbline 147
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 148
L22:
	.dbline 143
;     while (*s) 
	movw R30,R20
	ldd R2,z+0
	tst R2
	brne L21
	.dbline -2
L20:
	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 + -