📄 lcd_1602_driver.s
字号:
.module LCD_1602_Driver.c
.area data(ram, con, rel)
_new::
.blkb 1
.area idata
.byte 32
.area data(ram, con, rel)
.dbfile E:\刻录的\电子技术\项目\驱动程序\LCD1602四线接口应用范例\LCD_1602_Driver.c
.dbsym e new _new c
_num::
.blkb 2
.area idata
.word 0
.area data(ram, con, rel)
.dbfile E:\刻录的\电子技术\项目\驱动程序\LCD1602四线接口应用范例\LCD_1602_Driver.c
.dbsym e num _num i
.area text(rom, con, rel)
.dbfile E:\刻录的\电子技术\项目\驱动程序\LCD1602四线接口应用范例\LCD_1602_Driver.c
.dbfunc e LCD_init _LCD_init fV
.even
_LCD_init::
.dbline -1
.dbline 21
; #include <iom8v.h>
; #include <macros.h>
; #include "LCD_1602.h"
; void delay_nms(unsigned int n);
; void delay_nus(unsigned int n);
; unsigned char lcd_data[32];//32字节显存,记录LCD上显示的数据
; unsigned char data[32];//32字节缓存,保存将要写入LCD的数据
; unsigned char add;//显存地址标号
; unsigned char new=32;//显存标号
; unsigned int num=0;
; /**********************************************************
; TC1602B LCD DISPLAY
; 建立时间:2005年12月12号
; 修改日期:2005年12月12号
; LCD_write函数功能:当command=0时,向LCD写入数据,否则向LCD写
; 入命令
; LCD第一行显示寄存器地址:0X80-0X8F
; LCD第二行显示寄存器地址:0XC0-0XCF
; **********************************************************/
; void LCD_init(void)
; {
.dbline 22
; LCD_EN_DDR|=LCD_EN;//设定该引脚方向为输出
sbi 0x11,6
.dbline 23
; LCD_RS_DDR|=LCD_RS;//设定该引脚方向为输出
sbi 0x11,7
.dbline 24
; LCD_D4_DDR|=LCD_D4;//设定数据口为输出
sbi 0x11,5
.dbline 25
; LCD_D5_DDR|=LCD_D5;//设定数据口为输出
sbi 0x11,4
.dbline 26
; LCD_D6_DDR|=LCD_D6;//设定数据口为输出
sbi 0x11,3
.dbline 27
; LCD_D7_DDR|=LCD_D7;//设定数据口为输出
sbi 0x11,2
.dbline 29
;
; LCD_EN_PORT&=~LCD_EN;//EN设为低电平
cbi 0x12,6
.dbline 30
; LCD_RS_PORT&=~LCD_RS;//RS设为低电平
cbi 0x12,7
.dbline 31
; LCD_D4_PORT&=~LCD_D4;//数据口置低电平
cbi 0x12,5
.dbline 32
; LCD_D5_PORT&=~LCD_D5;//数据口置低电平
cbi 0x12,4
.dbline 33
; LCD_D6_PORT&=~LCD_D6;//数据口置低电平
cbi 0x12,3
.dbline 34
; LCD_D7_PORT&=~LCD_D7;//数据口置低电平
cbi 0x12,2
.dbline 36
;
; LCD_write_char(0,0x33); //4bit test
ldi R18,51
ldi R19,0
clr R16
clr R17
rcall _LCD_write_char
.dbline 37
; delay_nms(25);
ldi R16,25
ldi R17,0
rcall _delay_nms
.dbline 38
; LCD_write_char(0,0x32);
ldi R18,50
ldi R19,0
clr R16
clr R17
rcall _LCD_write_char
.dbline 39
; delay_nms(15);
ldi R16,15
ldi R17,0
rcall _delay_nms
.dbline 40
; LCD_write_char(0,0x28);
ldi R18,40
ldi R19,0
clr R16
clr R17
rcall _LCD_write_char
.dbline 41
; delay_nms(15);
ldi R16,15
ldi R17,0
rcall _delay_nms
.dbline 42
; LCD_write_char(0,0x0C); //显示开
ldi R18,12
ldi R19,0
clr R16
clr R17
rcall _LCD_write_char
.dbline 43
; delay_nms(15);
ldi R16,15
ldi R17,0
rcall _delay_nms
.dbline 44
; LCD_write_char(0,0x01); //显示清屏
ldi R18,1
ldi R19,0
clr R16
clr R17
rcall _LCD_write_char
.dbline 45
; delay_nms(15);
ldi R16,15
ldi R17,0
rcall _delay_nms
.dbline 46
; LCD_write_char(0,0x06); //显示光标移动设置
ldi R18,6
ldi R19,0
clr R16
clr R17
rcall _LCD_write_char
.dbline 47
; LCD_clear();
rcall _LCD_clear
.dbline 48
; delay_nms(10);
ldi R16,10
ldi R17,0
rcall _delay_nms
.dbline 49
; LCD_init_CGRAM();
rcall _LCD_init_CGRAM
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e LCD_write_char _LCD_write_char fV
; data -> R20,R21
; command -> R22,R23
.even
_LCD_write_char::
rcall push_gset2
movw R20,R18
movw R22,R16
.dbline -1
.dbline 57
; }
; /*-----------------------------------------------------------------------
; LCD_write_char : 写一个字节到LCD的函数
; 编写日期 :2005-12-12
; 最后修改日期 :2005-12-12
; -----------------------------------------------------------------------*/
; void LCD_write_char(unsigned command,unsigned data)
; {
.dbline 58
; if (command == 0)
cpi R22,0
cpc R22,R23
brne L3
X0:
.dbline 59
; LCD_RS_PORT &= ~LCD_RS; //RS=0 写地址
cbi 0x12,7
rjmp L4
L3:
.dbline 61
; else
; LCD_RS_PORT |= LCD_RS; //RS=1 写数据
sbi 0x12,7
L4:
.dbline 63
;
; LCD_write_DATA_PORT(data);//写高4位
mov R16,R20
rcall _LCD_write_DATA_PORT
.dbline 64
; LCD_write_DATA_PORT(data<<4);//写低4位
mov R16,R20
lsl R16
rol R17
lsl R16
rol R17
lsl R16
rol R17
lsl R16
rol R17
rcall _LCD_write_DATA_PORT
.dbline 65
; delay_nus(250);
ldi R16,250
ldi R17,0
rcall _delay_nus
.dbline 66
; num++;//统计向LCD发送的字节数
lds R24,_num
lds R25,_num+1
adiw R24,1
sts _num+1,R25
sts _num,R24
.dbline -2
L2:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r data 20 i
.dbsym r command 22 i
.dbend
.dbfunc e LCD_write_DATA_PORT _LCD_write_DATA_PORT fV
; data -> R20
.even
_LCD_write_DATA_PORT::
rcall push_gset1
mov R20,R16
.dbline -1
.dbline 76
; }
; /*-----------------------------------------------------------------------
; LCD_write_DATA_PORT : 写数据到LCD数据口函数
;
; 输入参数data :要写入的数据(仅高4位)
; 编写日期 :2005-12-12
; 最后修改日期 :2005-12-12
; -----------------------------------------------------------------------*/
; void LCD_write_DATA_PORT(unsigned char data)
; {
.dbline 77
; if((data>>4)%2)
ldi R17,2
mov R16,R20
swap R16
andi R16,#0x0F
rcall mod8u
tst R16
breq L6
.dbline 78
; LCD_D4_PORT |=LCD_D4;
sbi 0x12,5
rjmp L7
L6:
.dbline 80
; else
; LCD_D4_PORT &=~LCD_D4;
cbi 0x12,5
L7:
.dbline 82
;
; if((data>>5)%2)
ldi R17,2
mov R16,R20
lsr R16
lsr R16
lsr R16
lsr R16
lsr R16
rcall mod8u
tst R16
breq L8
.dbline 83
; LCD_D5_PORT |=LCD_D5;
sbi 0x12,4
rjmp L9
L8:
.dbline 85
; else
; LCD_D5_PORT &=~LCD_D5;
cbi 0x12,4
L9:
.dbline 87
;
; if((data>>6)%2)
ldi R17,2
mov R16,R20
lsr R16
lsr R16
lsr R16
lsr R16
lsr R16
lsr R16
rcall mod8u
tst R16
breq L10
.dbline 88
; LCD_D6_PORT |=LCD_D6;
sbi 0x12,3
rjmp L11
L10:
.dbline 90
; else
; LCD_D6_PORT &=~LCD_D6;
cbi 0x12,3
L11:
.dbline 92
;
; if((data>>7)%2)
ldi R17,2
mov R16,R20
lsr R16
lsr R16
lsr R16
lsr R16
lsr R16
lsr R16
lsr R16
rcall mod8u
tst R16
breq L12
.dbline 93
; LCD_D7_PORT |=LCD_D7;
sbi 0x12,2
rjmp L13
L12:
.dbline 95
; else
; LCD_D7_PORT &=~LCD_D7;
cbi 0x12,2
L13:
.dbline 97
;
; LCD_EN_PORT |= LCD_EN; //EN端产生一个由低电平变高电平,写LCD
sbi 0x12,6
.dbline 98
; delay_nus(25);
ldi R16,25
ldi R17,0
rcall _delay_nus
.dbline 99
; LCD_EN_PORT &= ~LCD_EN; //EN端产生一个由高电平变低电平,写LCD
cbi 0x12,6
.dbline 100
; delay_nus(25);
ldi R16,25
ldi R17,0
rcall _delay_nus
.dbline -2
L5:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r data 20 c
.dbend
.dbfunc e LCD_clear _LCD_clear fV
; i -> R20
.even
_LCD_clear::
rcall push_gset1
.dbline -1
.dbline 110
; }
; /*-----------------------------------------------------------------------
; LCD_clear : 清除屏幕的函数
;
; 输入参数 :无
; 编写日期 :2005/10/18
; 说明 : lcd_data[]也会被清0
; -----------------------------------------------------------------------*/
; void LCD_clear(void)
; {
.dbline 112
; unsigned char i;
; LCD_write_char(0,0x01);//显示清屏
ldi R18,1
ldi R19,0
clr R16
clr R17
rcall _LCD_write_char
.dbline 113
; for(i=0;i<32;i++)
clr R20
rjmp L18
L15:
.dbline 114
.dbline 115
ldi R24,<_lcd_data
ldi R25,>_lcd_data
mov R30,R20
clr R31
add R30,R24
adc R31,R25
clr R2
std z+0,R2
.dbline 116
L16:
.dbline 113
inc R20
L18:
.dbline 113
cpi R20,32
brlo L15
.dbline 117
; {
; lcd_data[i]=0;
; }
; delay_nus(500);
ldi R16,500
ldi R17,1
rcall _delay_nus
.dbline -2
L14:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbend
.area lit(rom, con, rel)
L20:
.byte 0
.byte 0
.area text(rom, con, rel)
.dbfile E:\刻录的\电子技术\项目\驱动程序\LCD1602四线接口应用范例\LCD_1602_Driver.c
.dbfunc e LCD_check _LCD_check fV
; lcd -> y+0
; i -> R20
; y -> R22
; x -> R20
.even
_LCD_check::
rcall push_gset2
mov R22,R18
mov R20,R16
sbiw R28,2
.dbline -1
.dbline 128
; }
; /*-----------------------------------------------------------------------
; LCD_check : 统计发送数据到LCD次数的函数
;
; 输入参数 :x,y 显示结果的座标
; 编写日期 :2005/10/18
; 说明 :如果每秒调用一次,就是统计每秒的次数
; -----------------------------------------------------------------------*/
; void LCD_check(unsigned char x,unsigned char y) //检测每秒钟写LCD
; //次数的函数
; {
.dbline 130
; unsigned char i;
; unsigned char lcd[2]={0};
ldi R24,<L20
ldi R25,>L20
movw R30,R28
ldi R16,2
ldi R17,0
st -y,R31
st -y,R30
st -y,R25
st -y,R24
rcall asgncblk
.dbline 131
; add=y*16+x;//设置起始座标
ldi R24,16
mul R24,R22
mov R2,R0
add R2,R20
sts _add,R2
.dbline 132
; lcd[0]=num/10+48;
ldi R18,10
ldi R19,0
lds R16,_num
lds R17,_num+1
rcall div16u
movw R24,R16
adiw R24,48
std y+0,R24
.dbline 133
; lcd[1]=num%10+48;
ldi R18,10
ldi R19,0
lds R16,_num
lds R17,_num+1
rcall mod16u
movw R24,R16
adiw R24,48
std y+1,R24
.dbline 134
; num=0;
clr R2
clr R3
sts _num+1,R3
sts _num,R2
.dbline 135
; for (i=0;i<2;i++)
clr R20
rjmp L25
L22:
.dbline 136
; {
.dbline 137
; if(lcd_data[add]==lcd[i]){}
movw R24,R28
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R24,<_lcd_data
ldi R25,>_lcd_data
lds R30,_add
clr R31
add R30,R24
adc R31,R25
ldd R3,z+0
cp R3,R2
brne L26
.dbline 137
.dbline 137
rjmp L27
L26:
.dbline 139
; else
; {data[add]=lcd[i];}
.dbline 139
movw R24,R28
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R24,<_data
ldi R25,>_data
lds R30,_add
clr R31
add R30,R24
adc R31,R25
std z+0,R2
.dbline 139
L27:
.dbline 140
lds R24,_add
subi R24,255 ; addi 1
sts _add,R24
.dbline 141
L23:
.dbline 135
inc R20
L25:
.dbline 135
cpi R20,2
brlo L22
.dbline 142
; add++;
; }
; LCD_updata;
clr R2
sts _new,R2
.dbline -2
L19:
adiw R28,2
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym l lcd 0 A[2:2]c
.dbsym r i 20 c
.dbsym r y 22 c
.dbsym r x 20 c
.dbend
.dbfunc e LCD_write_string _LCD_write_string fV
; e -> R20
; s -> R22,R23
; y -> R18
; x -> R16
.even
_LCD_write_string::
rcall push_gset2
ldd R22,y+4
ldd R23,y+5
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -