📄 lcd.s
字号:
.module lcd.c
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\自动充电小车\自动充电小车\298\lcd.c
.dbfunc e LCD_en_write _LCD_en_write fV
.even
_LCD_en_write::
.dbline -1
.dbline 11
; #define _LCD_C_
; #include "LCD.h"
; #include <iom16v.h>
; //==========================================
; //函数名称:液晶模块使能
; //函数作用: 使能液晶
; //入口参数: 无
; //返回类型:无
; //==========================================
; void LCD_en_write(void)
; {
.dbline 12
; EN_SET;
sbi 0x18,7
.dbline 13
; delay_nus(4);
ldi R16,4
ldi R17,0
xcall _delay_nus
.dbline 14
; EN_CLR;
cbi 0x18,7
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e LCD_write_command _LCD_write_command fV
; command -> R20
.even
_LCD_write_command::
st -y,R20
mov R20,R16
.dbline -1
.dbline 24
; }
;
; //==========================================
; //函数名称:写指令
; //函数作用:
; //入口参数: 液晶指令command
; //返回类型:无
; //==========================================
; void LCD_write_command(uchar command)
; {
.dbline 25
; delay_nus( 16 );
ldi R16,16
ldi R17,0
xcall _delay_nus
.dbline 26
; RS_CLR;
cbi 0x18,6
.dbline 27
; DB &= 0X0F; //清高四位
in R24,0x1b
andi R24,15
out 0x1b,R24
.dbline 28
; DB |= command & 0xf0; //写高四位
mov R24,R20
andi R24,240
in R2,0x1b
or R2,R24
out 0x1b,R2
.dbline 29
; LCD_en_write();
xcall _LCD_en_write
.dbline 30
; command=command << 4; //低四位移到高四位
mov R24,R20
andi R24,#0x0F
swap R24
mov R20,R24
.dbline 31
; DB &= 0x0f; //清高四位
in R24,0x1b
andi R24,15
out 0x1b,R24
.dbline 32
; DB |= command & 0xf0; //写低四位
mov R24,R20
andi R24,240
in R2,0x1b
or R2,R24
out 0x1b,R2
.dbline 33
; LCD_en_write();
xcall _LCD_en_write
.dbline -2
L2:
.dbline 0 ; func end
ld R20,y+
ret
.dbsym r command 20 c
.dbend
.dbfunc e LCD_write_data _LCD_write_data fV
; DATA -> R20
.even
_LCD_write_data::
st -y,R20
mov R20,R16
.dbline -1
.dbline 44
; //delay_nms(2); //清屏指令时间很长, 保险起见,可以增加
; }
;
; //==========================================
; //函数名称:写数据
; //函数作用:
; //入口参数: 数据DATA
; //返回类型:无
; //==========================================
; void LCD_write_data(uchar DATA)
; {
.dbline 45
; delay_nus(16);
ldi R16,16
ldi R17,0
xcall _delay_nus
.dbline 46
; RS_SET; //RS=1
sbi 0x18,6
.dbline 47
; DB &= 0X0f; //清高四位
in R24,0x1b
andi R24,15
out 0x1b,R24
.dbline 48
; DB |= DATA&0xf0; //写高四位
mov R24,R20
andi R24,240
in R2,0x1b
or R2,R24
out 0x1b,R2
.dbline 49
; LCD_en_write();
xcall _LCD_en_write
.dbline 50
; DATA = DATA << 4; //低四位移到高四位
mov R24,R20
andi R24,#0x0F
swap R24
mov R20,R24
.dbline 51
; DB &= 0X0f; //清高四位
in R24,0x1b
andi R24,15
out 0x1b,R24
.dbline 52
; DB |= DATA&0xf0; //写低四位
mov R24,R20
andi R24,240
in R2,0x1b
or R2,R24
out 0x1b,R2
.dbline 53
; LCD_en_write();
xcall _LCD_en_write
.dbline -2
L3:
.dbline 0 ; func end
ld R20,y+
ret
.dbsym r DATA 20 c
.dbend
.dbfunc e LCD_init _LCD_init fV
.even
_LCD_init::
.dbline -1
.dbline 63
; }
;
; //==========================================
; //函数名称:液晶初始化函数
; //函数作用:
; //入口参数: 无
; //返回类型:无
; //==========================================
; void LCD_init( void )
; {
.dbline 64
; DB_DDR_OUT;
.dbline 64
in R24,0x1a
ori R24,240
out 0x1a,R24
in R24,0x17
ori R24,192
out 0x17,R24
.dbline 64
.dbline 64
.dbline 65
; LCD_write_command(0x28);
ldi R16,40
xcall _LCD_write_command
.dbline 66
; LCD_en_write(); //********总结这里一定要加这液晶使能*********
xcall _LCD_en_write
.dbline 67
; delay_nus(20);
ldi R16,20
ldi R17,0
xcall _delay_nus
.dbline 68
; LCD_write_command(0x28); //4位显示
ldi R16,40
xcall _LCD_write_command
.dbline 69
; LCD_write_command(0x0c); //显示开
ldi R16,12
xcall _LCD_write_command
.dbline 70
; LCD_write_command(0x01); //清屏
ldi R16,1
xcall _LCD_write_command
.dbline 71
; delay_nms(5); //延时一定要长
ldi R16,5
ldi R17,0
xcall _delay_nms
.dbline -2
L4:
.dbline 0 ; func end
ret
.dbend
.dbfunc e LCD_set_rc _LCD_set_rc fV
; address -> R20
; c -> R22
; r -> R10
.even
_LCD_set_rc::
xcall push_xgsetF00C
mov R22,R18
mov R10,R16
.dbline -1
.dbline 81
; }
;
; //==========================================
; //函数名称:写地址
; //函数作用:
; //入口参数: 行位置r, 列位置c
; //返回类型:无
; //==========================================
; void LCD_set_rc( uchar r, uchar c )
; {
.dbline 84
; uchar address;
;
; if (r == 1)
mov R24,R10
cpi R24,1
brne L6
X0:
.dbline 85
; address = 0x80 + c;
mov R20,R22
subi R20,128 ; addi 128
xjmp L7
L6:
.dbline 86
; else if(r == 2)
mov R24,R10
cpi R24,2
brne L8
X1:
.dbline 87
; address = 0xc0 + c;
mov R20,R22
subi R20,64 ; addi 192
L8:
L7:
.dbline 89
;
; LCD_write_command( address );
mov R16,R20
xcall _LCD_write_command
.dbline -2
L5:
.dbline 0 ; func end
xjmp pop_xgsetF00C
.dbsym r address 20 c
.dbsym r c 22 c
.dbsym r r 10 c
.dbend
.dbfunc e LCD_write_string _LCD_write_string fV
; s -> R20,R21
; c -> R12
; r -> R10
.even
_LCD_write_string::
xcall push_xgset303C
mov R12,R18
mov R10,R16
ldd R20,y+6
ldd R21,y+7
.dbline -1
.dbline 99
; }
;
; //==========================================
; //函数名称:写字符串
; //函数作用: 在指定位置写一串字符串
; //入口参数: 行位置r, 列位置c, 字符串*s
; //返回类型:无
; //==========================================
; void LCD_write_string(uchar r, uchar c, uchar *s)
; {
.dbline 100
; LCD_set_rc( r, c ); //写地址
mov R18,R12
mov R16,R10
xcall _LCD_set_rc
xjmp L12
L11:
.dbline 103
;
; while( *s ) // 写显示字符
; {
.dbline 104
; LCD_write_data( *s );
movw R30,R20
ldd R16,z+0
xcall _LCD_write_data
.dbline 105
; s++;
subi R20,255 ; offset = 1
sbci R21,255
.dbline 106
; }
L12:
.dbline 102
movw R30,R20
ldd R2,z+0
tst R2
brne L11
X2:
.dbline -2
L10:
.dbline 0 ; func end
xjmp pop_xgset303C
.dbsym r s 20 pc
.dbsym r c 12 c
.dbsym r r 10 c
.dbend
.dbfunc e LCD_write_char _LCD_write_char fV
; DATA -> y+2
; c -> R12
; r -> R10
.even
_LCD_write_char::
st -y,R10
st -y,R12
mov R12,R18
mov R10,R16
.dbline -1
.dbline 110
; }
;
; void LCD_write_char(uchar r, uchar c, uchar DATA) //写字符
; {
.dbline 111
; LCD_set_rc( r, c );
mov R18,R12
mov R16,R10
xcall _LCD_set_rc
.dbline 112
; LCD_write_data( DATA );
ldd R16,y+2
xcall _LCD_write_data
.dbline -2
L14:
.dbline 0 ; func end
ld R12,y+
ld R10,y+
ret
.dbsym l DATA 2 c
.dbsym r c 12 c
.dbsym r r 10 c
.dbend
.dbfunc e LCD_write_array _LCD_write_array fV
; i -> R10
; array -> R12,R13
; c -> R22
; r -> R20
.even
_LCD_write_array::
xcall push_xgsetF03C
mov R22,R18
mov R20,R16
sbiw R28,1
ldd R12,y+9
ldd R13,y+10
.dbline -1
.dbline 122
; }
;
; //==========================================
; //函数名称:写字符数组
; //函数作用: 在指定位置写一串字符串
; //入口参数: 行位置r, 列位置c, 字符数组chardata[], 字符个数
; //返回类型:无
; //==========================================
; void LCD_write_array( uchar r, uchar c, uchar array[] )
; {
.dbline 123
; uchar i = 0;
clr R10
xjmp L17
L16:
.dbline 125
; while( array[i] != '\0' )
; {
.dbline 126
; LCD_write_char( r, c, array[i] );
mov R30,R10
clr R31
add R30,R12
adc R31,R13
ldd R2,z+0
std y+0,R2
mov R18,R22
mov R16,R20
xcall _LCD_write_char
.dbline 127
; if( ++c == 16 )
mov R24,R22
subi R24,255 ; addi 1
mov R22,R24
cpi R22,16
brne L19
X3:
.dbline 128
; {
.dbline 129
; if( r == 1 )
cpi R20,1
brne L21
X4:
.dbline 130
; {
.dbline 131
; c = 0;
clr R22
.dbline 132
; r = 2;
ldi R20,2
.dbline 133
; LCD_write_char( r, c, array[i] );
mov R30,R10
clr R31
add R30,R12
adc R31,R13
ldd R2,z+0
std y+0,R2
mov R18,R22
mov R16,R20
xcall _LCD_write_char
.dbline 134
; }
xjmp L22
L21:
.dbline 136
;
; else if( r == 2 )
cpi R20,2
brne L23
X5:
.dbline 137
; {
.dbline 138
; c = 0;
clr R22
.dbline 139
; r = 1;
ldi R20,1
.dbline 140
; LCD_write_char( r, c, array[i] );
mov R30,R10
clr R31
add R30,R12
adc R31,R13
ldd R2,z+0
std y+0,R2
mov R18,R22
mov R16,R20
xcall _LCD_write_char
.dbline 141
; }
L23:
L22:
.dbline 142
; }
L19:
.dbline 143
; i++;
inc R10
.dbline 144
; }
L17:
.dbline 124
mov R30,R10
clr R31
add R30,R12
adc R31,R13
ldd R2,z+0
tst R2
breq X7
xjmp L16
X7:
X6:
.dbline -2
L15:
.dbline 0 ; func end
adiw R28,1
xjmp pop_xgsetF03C
.dbsym r i 10 c
.dbsym r array 12 pc
.dbsym r c 22 c
.dbsym r r 20 c
.dbend
.dbfunc e lengh_longint _lengh_longint fc
; data_n -> R20
; datatmp -> y+0
; datalongint -> y+5
.even
_lengh_longint::
xcall push_arg4
st -y,R20
sbiw R28,4
.dbline -1
.dbline 149
; }
;
; //返回整形数据的长度
; char lengh_longint( long unsigned datalongint )
; {
.dbline 150
; long signed datatmp = datalongint;
ldd R2,y+5
ldd R3,y+6
ldd R4,y+7
ldd R5,y+8
std y+0,R2
std y+1,R3
std y+2,R4
std y+3,R5
.dbline 151
; uchar data_n = 0;
clr R20
xjmp L27
L26:
.dbline 153
; while( datatmp != 0 )
; {
.dbline 154
; datatmp /= 10;
ldi R24,10
ldi R25,0
ldi R26,0
ldi R27,0
ldd R16,y+0
ldd R17,y+1
ldd R18,y+2
ldd R19,y+3
st -y,R27
st -y,R26
st -y,R25
st -y,R24
xcall div32s
std y+0,R16
std y+1,R17
std y+2,R18
std y+3,R19
.dbline 155
; data_n++;
inc R20
.dbline 156
; }
L27:
.dbline 152
ldd R2,y+0
ldd R3,y+1
ldd R4,y+2
ldd R5,y+3
clc
tst R2
cpc R3,R2
cpc R4,R2
cpc R5,R2
brne L26
X8:
.dbline 158
;
; if( datalongint == 0 )
ldd R2,y+5
ldd R3,y+6
ldd R4,y+7
ldd R5,y+8
clc
tst R2
cpc R3,R2
cpc R4,R2
cpc R5,R2
brne L29
X9:
.dbline 159
; {
.dbline 160
; data_n = 1;
ldi R20,1
.dbline 161
; }
L29:
.dbline 163
;
; return data_n;
mov R16,R20
.dbline -2
L25:
.dbline 0 ; func end
adiw R28,4
ld R20,y+
adiw R28,4
ret
.dbsym r data_n 20 c
.dbsym l datatmp 0 L
.dbsym l datalongint 5 l
.dbend
.dbfunc e LCD_write_datalongint _LCD_write_datalongint fV
; datachar2 -> y+13
; kk -> R14
; k -> R22
; n -> R10
; datachar1 -> y+5
; datainttmp -> y+1
; i -> R12
; dataint -> y+35
; c -> R20
; r -> y+31
.even
_LCD_write_datalongint::
xcall push_arg4
xcall push_xgsetF0FC
mov R20,R18
sbiw R28,21
.dbline -1
.dbline 174
; }
;
;
; //==========================================
; //函数名称:显示一个整型数据
; //函数作用: 在指定位置显示整数
; //入口参数: 行位置r, 列位置c, 字符数组dataint[]
; //返回类型:无
; //==========================================
; void LCD_write_datalongint( uchar r, uchar c, long int dataint )
; {
.dbline 177
; uchar datachar1[8];
; uchar datachar2[8];
; uchar n = 0;
clr R10
.dbline 178
; uchar i =0;
clr R12
.dbline 179
; uchar k =0; //取字符个数
clr R22
.dbline 180
; uchar kk = 0; //取字符个数
clr R14
.dbline 181
; long int datainttmp = dataint;
ldd R2,y+35
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -