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

📄 lcd.s

📁 atmega16与lcd1604的的代码
💻 S
字号:
	.module lcd.c
	.area text(rom, con, rel)
	.dbfile D:\各种模块设计\模块程序集\atmega16+1604仿真\lcd.c
	.dbfunc e LCD16xx_init _LCD16xx_init fV
	.even
_LCD16xx_init::
	.dbline -1
	.dbline 27
; /*--------------------------------------------------*/
; /*     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
; 建立时间:2008年04月11日
; 修改日期:2008年04月11日
; LCD_write函数功能:当command=0时,向LCD写入数据,否则向LCD写
;                    入命令
; LCD第一行显示寄存器地址:0x80-0x8F
; LCD第二行显示寄存器地址:0xC0-0xCF
; **********************************************************/
; void LCD16xx_init(void)
; {
	.dbline 28
;     LCD_DATA_DDR |=  LCD_DATA;
	in R24,0x1a
	ori R24,240
	out 0x1a,R24
	.dbline 29
;     LCD_EN_DDR   |=  LCD_EN;
	sbi 0x11,5
	.dbline 30
;     LCD_RS_DDR   |=  LCD_RS;
	sbi 0x11,6
	.dbline 34
;     //LCD_RW_DDR   |=  LCD_RW;
;     //RW_L;
; 	
;     LCD16xx_write_char(1,0x28);      
	ldi R18,40
	ldi R16,1
	xcall _LCD16xx_write_char
	.dbline 35
;     LCD16xx_en_write();
	xcall _LCD16xx_en_write
	.dbline 36
;     delay_nus(50);
	ldi R16,50
	ldi R17,0
	xcall _delay_nus
	.dbline 38
;    
;     LCD16xx_write_char(1,0x28);      //4线接法测试
	ldi R18,40
	ldi R16,1
	xcall _LCD16xx_write_char
	.dbline 39
;     delay_nms(5);
	ldi R16,5
	ldi R17,0
	xcall _delay_nms
	.dbline 40
;     LCD16xx_write_char(1,0x0d);      //显示开
	ldi R18,13
	ldi R16,1
	xcall _LCD16xx_write_char
	.dbline 41
;     LCD16xx_write_char(1,0x01);      //显示清屏
	ldi R18,1
	ldi R16,1
	xcall _LCD16xx_write_char
	.dbline 42
; 	LCD16xx_write_char(1,0x02);
	ldi R18,2
	ldi R16,1
	xcall _LCD16xx_write_char
	.dbline 43
;     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 48
; 	
; }
; 
; void LCD16xx_en_write(void)          //EN端产生一个高电平脉冲,写LCD
; {
	.dbline 49
;     E_H;
	sbi 0x12,5
	.dbline 50
;     delay_nus(2);                    //如果晶振频率太高,则可相应提高延时
	ldi R16,2
	ldi R17,0
	xcall _delay_nus
	.dbline 51
;     E_L;
	cbi 0x12,5
	.dbline -2
L2:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e LCD16xx_clr _LCD16xx_clr fV
	.even
_LCD16xx_clr::
	.dbline -1
	.dbline 58
; }
; 
; /************************************************************************/
; /* LCD16xx清屏                                                          */
; /************************************************************************/
; void LCD16xx_clr(void)
; {
	.dbline 59
;     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 75
; }
; 
; /*-----------------------------------------------------------------------
; LCD16xx_write_char    : 英文字符串显示函数
; 
; 输入参数:*s      :英文字符串指针;
;           X、Y    : 显示字符串的位置,X:0-15,Y:0-3
;                     LCD第一行显示寄存器地址:0x80-0x8F
;                     LCD第二行显示寄存器地址:0xC0-0xCF
; 					LCD第二行显示寄存器地址:0x90-0xCF
; 					LCD第二行显示寄存器地址:0xd0-0xCF
; 编写日期          :2008年04月11日
; 最后修改日期      :2008年04月11日
; -----------------------------------------------------------------------*/
; void LCD16xx_write_char(uchar command,uchar data)
; {
	.dbline 76
;      delay_nus(1); 
	ldi R16,1
	ldi R17,0
	xcall _delay_nus
	.dbline 81
; 
;     //LCD16xx_wait_Ready();
;    
; //    RW_L;                                 //RW=0
;     if (command == 0)                       //data
	tst R22
	brne L5
	.dbline 82
;        RS_H;                                //RS=1
	sbi 0x12,6
	xjmp L6
L5:
	.dbline 84
;     else                                    //command
;        RS_L;                                //RS=0
	cbi 0x12,6
L6:
	.dbline 86
; 	   
;     LCD_DATA_PORT &= data&0x00;
	in R24,0x1b
	andi R24,0
	out 0x1b,R24
	.dbline 87
;     LCD_DATA_PORT |= data&0xff;            
	mov R24,R20
	andi R24,255
	in R2,0x1b
	or R2,R24
	out 0x1b,R2
	.dbline 88
;     LCD16xx_en_write();
	xcall _LCD16xx_en_write
	.dbline 90
; 	
; 	data=data<<4;
	mov R24,R20
	andi R24,#0x0F
	swap R24
	mov R20,R24
	.dbline 91
; 	LCD_DATA_PORT &=0x0F;
	in R24,0x1b
	andi R24,15
	out 0x1b,R24
	.dbline 92
;     LCD_DATA_PORT |= data&0xf0;            
	mov R24,R20
	andi R24,240
	in R2,0x1b
	or R2,R24
	out 0x1b,R2
	.dbline 93
;     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_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 118
; 	
; }
; /*
; void LCD16xx_wait_Ready(void)              //等待LCD空闲
; {
;     LCD_DATA_DDR &= ~0x80;                 //PA7 I/O口方向设置为输入
;     RW_H;                                  //RW=1
;     RS_L;                                  //RS=0
;     E_H;                                   //EN=1
;     while (!( LCD_DATA_PIN&0x80 ) == 0);   //RW=1,读PA7,为0表示空闲;
;     E_L;                                   //EN=0
;     LCD_DATA_DDR |= LCD_DATA;
; }
; */
; /*-----------------------------------------------------------------------
; LCD_set_xy        : 设置LCD显示的起始位置
; 
; 输入参数:x、y    : 显示字符串的位置,X:0-15,Y:0-1
;                     LCD第一行显示寄存器地址:0x80-0x8F
;                     LCD第一行显示寄存器地址:0xC0-0xCF
; 编写日期          :2008年04月11日
; 最后修改日期      :2008年04月11日
; -----------------------------------------------------------------------*/
; void LCD16xx_set_xy( unsigned char x, unsigned char y )
; {
	.dbline 120
;     unsigned char address;
;     if (y == 0)
	tst R10
	brne L8
	.dbline 121
;        address = 0x80 + x;
	mov R20,R22
	subi R20,128    ; addi 128
	xjmp L9
L8:
	.dbline 122
;     else if(y == 1)
	mov R24,R10
	cpi R24,1
	brne L10
	.dbline 123
;        address = 0xc0 + x;
	mov R20,R22
	subi R20,64    ; addi 192
	xjmp L11
L10:
	.dbline 124
;     else if(y == 2)
	mov R24,R10
	cpi R24,2
	brne L12
	.dbline 125
;        address = 0x90 + x;
	mov R20,R22
	subi R20,112    ; addi 144
	xjmp L13
L12:
	.dbline 127
;     else
;        address = 0xd0 + x;
	mov R20,R22
	subi R20,48    ; addi 208
L13:
L11:
L9:
	.dbline 128
;     LCD16xx_write_char( 1,address );
	mov R18,R20
	ldi R16,1
	xcall _LCD16xx_write_char
	.dbline -2
L7:
	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 139
; }
; /*-----------------------------------------------------------------------
; LCD16xx_write_string  : 英文字符串显示函数
; 
; 输入参数:*s      :英文字符串指针;
;           X、Y    : 显示字符串的位置
; 编写日期          :2008年04月11日
; 最后修改日期      :2008年04月11日 		
; -----------------------------------------------------------------------*/
; void LCD16xx_write_string(unsigned char X,unsigned char Y,unsigned char *s)
; {
	.dbline 140
;     LCD16xx_set_xy( X, Y );
	mov R18,R10
	mov R16,R22
	xcall _LCD16xx_set_xy
	xjmp L16
L15:
	.dbline 142
	.dbline 143
	ldi R16,5
	ldi R17,0
	xcall _delay_nus
	.dbline 144
	movw R30,R20
	ldd R18,z+0
	clr R16
	xcall _LCD16xx_write_char
	.dbline 145
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 146
L16:
	.dbline 141
;     while (*s) 
	movw R30,R20
	ldd R2,z+0
	tst R2
	brne L15
	.dbline -2
L14:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r s 20 pc
	.dbsym r Y 10 c
	.dbsym r X 22 c
	.dbend
	.dbfunc e LCD16xx_dispaly_char _LCD16xx_dispaly_char fV
;            key -> y+4
;              Y -> R22
;              X -> R20
	.even
_LCD16xx_dispaly_char::
	xcall push_gset2
	mov R22,R18
	mov R20,R16
	.dbline -1
	.dbline 152
;     {
;         delay_nus(5);
;         LCD16xx_write_char( 0, *s );
;         s++;
;     }
; }
; 
; 
; void LCD16xx_dispaly_char(unsigned char X,unsigned char Y,unsigned char key)
;  
;   {
	.dbline 153
;     LCD16xx_set_xy( X, Y );
	mov R18,R22
	mov R16,R20
	xcall _LCD16xx_set_xy
	.dbline 154
; 	LCD16xx_write_char(0,key);
	ldd R18,y+4
	clr R16
	xcall _LCD16xx_write_char
	.dbline -2
L18:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym l key 4 c
	.dbsym r Y 22 c
	.dbsym r X 20 c
	.dbend

⌨️ 快捷键说明

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