📄 lcd.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 + -