📄 lcd.s
字号:
.dbline 124
; {
.dbline 125
; *( datastr1 + (k-i) ) = '\0';
mov R2,R20
clr R3
mov R30,R10
clr R31
sub R30,R2
sbc R31,R3
movw R24,R28
adiw R24,2
add R30,R24
adc R31,R25
clr R2
std z+0,R2
.dbline 126
; }
L46:
.dbline 128
;
; strcpy( datastr, datastr1 );
movw R18,R28
subi R18,254 ; offset = 2
sbci R19,255
ldd R16,y+30
ldd R17,y+31
xcall _strcpy
.dbline -2
L23:
.dbline 0 ; func end
adiw R28,16
xcall pop_xgsetF0FC
adiw R28,4
ret
.dbsym r flag2 12 c
.dbsym r flag1 14 c
.dbsym r k 10 c
.dbsym l dataftmp 12 D
.dbsym l datastr1 2 A[10:10]c
.dbsym r i 20 c
.dbsym r p 22 c
.dbsym l datastr 30 pc
.dbsym l dataf 26 D
.dbend
.dbfunc e LCD_en_write _LCD_en_write fV
.even
_LCD_en_write::
.dbline -1
.dbline 139
; }
; //*********************************************************************************************
;
; //==========================================
; //函数名称:液晶模块使能
; //函数作用: 使能液晶
; //入口参数: 无
; //返回类型:无
; //==========================================
; void LCD_en_write(void)
; {
.dbline 140
; EN_SET;
sbi 0x1b,3
.dbline 141
; delay_nus(4);
ldi R16,4
ldi R17,0
xcall _delay_nus
.dbline 142
; EN_CLR;
cbi 0x1b,3
.dbline -2
L48:
.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 152
; }
;
; //==========================================
; //函数名称:写指令
; //函数作用:
; //入口参数: 液晶指令command
; //返回类型:无
; //==========================================
; void LCD_write_command(uchar command)
; {
.dbline 153
; delay_nus( 16 );
ldi R16,16
ldi R17,0
xcall _delay_nus
.dbline 154
; RS_CLR;
cbi 0x1b,1
.dbline 155
; DB &= 0X0F; //清高四位
in R24,0x1b
andi R24,15
out 0x1b,R24
.dbline 156
; DB |= command & 0xf0; //写高四位
mov R24,R20
andi R24,240
in R2,0x1b
or R2,R24
out 0x1b,R2
.dbline 157
; LCD_en_write();
xcall _LCD_en_write
.dbline 158
; command=command << 4; //低四位移到高四位
mov R24,R20
andi R24,#0x0F
swap R24
mov R20,R24
.dbline 159
; DB &= 0x0f; //清高四位
in R24,0x1b
andi R24,15
out 0x1b,R24
.dbline 160
; DB |= command & 0xf0; //写低四位
mov R24,R20
andi R24,240
in R2,0x1b
or R2,R24
out 0x1b,R2
.dbline 161
; LCD_en_write();
xcall _LCD_en_write
.dbline -2
L49:
.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 172
; //delay_nms(2); //清屏指令时间很长, 保险起见,可以增加
; }
;
; //==========================================
; //函数名称:写数据
; //函数作用:
; //入口参数: 数据DATA
; //返回类型:无
; //==========================================
; void LCD_write_data(uchar DATA)
; {
.dbline 173
; delay_nus(16);
ldi R16,16
ldi R17,0
xcall _delay_nus
.dbline 174
; RS_SET; //RS=1
sbi 0x1b,1
.dbline 175
; DB &= 0X0f; //清高四位
in R24,0x1b
andi R24,15
out 0x1b,R24
.dbline 176
; DB |= DATA&0xf0; //写高四位
mov R24,R20
andi R24,240
in R2,0x1b
or R2,R24
out 0x1b,R2
.dbline 177
; LCD_en_write();
xcall _LCD_en_write
.dbline 178
; DATA = DATA << 4; //低四位移到高四位
mov R24,R20
andi R24,#0x0F
swap R24
mov R20,R24
.dbline 179
; DB &= 0X0f; //清高四位
in R24,0x1b
andi R24,15
out 0x1b,R24
.dbline 180
; DB |= DATA&0xf0; //写低四位
mov R24,R20
andi R24,240
in R2,0x1b
or R2,R24
out 0x1b,R2
.dbline 181
; LCD_en_write();
xcall _LCD_en_write
.dbline -2
L50:
.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 191
; }
;
; //==========================================
; //函数名称:液晶初始化函数
; //函数作用:
; //入口参数: 无
; //返回类型:无
; //==========================================
; void LCD_init( void )
; {
.dbline 192
; DB_DDR_OUT;
.dbline 192
in R24,0x1a
ori R24,240
out 0x1a,R24
in R24,0x1a
ori R24,10
out 0x1a,R24
.dbline 192
.dbline 192
.dbline 193
; LCD_write_command(0x28);
ldi R16,40
xcall _LCD_write_command
.dbline 194
; LCD_en_write(); //********总结这里一定要加这液晶使能*********
xcall _LCD_en_write
.dbline 195
; delay_nus(20);
ldi R16,20
ldi R17,0
xcall _delay_nus
.dbline 196
; LCD_write_command(0x28); //4位显示
ldi R16,40
xcall _LCD_write_command
.dbline 197
; LCD_write_command(0x0c); //显示开
ldi R16,12
xcall _LCD_write_command
.dbline 198
; LCD_write_command(0x01); //清屏
ldi R16,1
xcall _LCD_write_command
.dbline 199
; delay_nms(5); //延时一定要长
ldi R16,5
ldi R17,0
xcall _delay_nms
.dbline -2
L51:
.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 209
; }
;
; //==========================================
; //函数名称:写地址
; //函数作用:
; //入口参数: 行位置r, 列位置c
; //返回类型:无
; //==========================================
; void LCD_set_rc( uchar r, uchar c )
; {
.dbline 212
; uchar address;
;
; if (r == 1)
mov R24,R10
cpi R24,1
brne L53
X16:
.dbline 213
; address = 0x80 + c;
mov R20,R22
subi R20,128 ; addi 128
xjmp L54
L53:
.dbline 214
; else if(r == 2)
mov R24,R10
cpi R24,2
brne L55
X17:
.dbline 215
; address = 0xc0 + c;
mov R20,R22
subi R20,64 ; addi 192
L55:
L54:
.dbline 217
;
; LCD_write_command( address );
mov R16,R20
xcall _LCD_write_command
.dbline -2
L52:
.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 228
; }
;
; //==========================================
; //函数名称:写字符串
; //函数作用: 在指定位置写一串字符串
; //入口参数: 行位置r, 列位置c, 字符串*s
; //返回类型:无
; //示例 : LCD_write_string( 1, 2, "dongxixiaonanbei" );
; //==========================================
; void LCD_write_string(uchar r, uchar c, uchar *s)
; {
.dbline 229
; LCD_set_rc( r, c ); //写地址
mov R18,R12
mov R16,R10
xcall _LCD_set_rc
xjmp L59
L58:
.dbline 232
;
; while( *s ) // 写显示字符
; {
.dbline 233
; LCD_write_data( *s );
movw R30,R20
ldd R16,z+0
xcall _LCD_write_data
.dbline 234
; s++;
subi R20,255 ; offset = 1
sbci R21,255
.dbline 235
; }
L59:
.dbline 231
movw R30,R20
ldd R2,z+0
tst R2
brne L58
X18:
.dbline -2
L57:
.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 241
; }
;
; //写字符
; //示例 : LCD_write_char( 1, 2, 'a' );
; void LCD_write_char(uchar r, uchar c, uchar DATA)
; {
.dbline 242
; LCD_set_rc( r, c );
mov R18,R12
mov R16,R10
xcall _LCD_set_rc
.dbline 243
; LCD_write_data( DATA );
ldd R16,y+2
xcall _LCD_write_data
.dbline -2
L61:
.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 255
; }
;
; //==========================================
; //函数名称:写字符数组
; //函数作用: 在指定位置写一串字符串
; //入口参数: 行位置r, 列位置c, 字符数组chardata[], 字符个数
; //返回类型:无
; //示例 : uchar a[] = "dongxixiaonanbei@163.com"
; // LCD_write_array( 1, 2, a );
; //==========================================
; void LCD_write_array( uchar r, uchar c, uchar array[] )
; {
.dbline 256
; uchar i = 0;
clr R10
xjmp L64
L63:
.dbline 258
; while( array[i] != '\0' )
; {
.dbline 259
; 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 260
; if( ++c == 16 )
mov R24,R22
subi R24,255 ; addi 1
mov R22,R24
cpi R22,16
brne L66
X19:
.dbline 261
; {
.dbline 262
; if( r == 1 )
cpi R20,1
brne L68
X20:
.dbline 263
; {
.dbline 264
; c = 0;
clr R22
.dbline 265
; r = 2;
ldi R20,2
.dbline 266
; 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 267
; }
xjmp L69
L68:
.dbline 269
;
; else if( r == 2 )
cpi R20,2
brne L70
X21:
.dbline 270
; {
.dbline 271
; c = 0;
clr R22
.dbline 272
; r = 1;
ldi R20,1
.dbline 273
; 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 274
; }
L70:
L69:
.dbline 275
; }
L66:
.dbline 276
; i++;
inc R10
.dbline 277
; }
L64:
.dbline 257
mov R30,R10
clr R31
add R30,R12
adc R31,R13
ldd R2,z+0
tst R2
breq X23
xjmp L63
X23:
X22:
.dbline -2
L62:
.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 LCD_write_datalongint _LCD_write_datalongint fV
; a -> y+2
; datalongint -> y+14
; c -> R12
; r -> R10
.even
_LCD_write_datalongint::
st -y,R10
st -y,R12
mov R12,R18
mov R10,R16
sbiw R28,12
.dbline -1
.dbline 283
; }
;
; //写整数
; //例子: LCD_write_datalongint( 1, 5, 89 ); 在液晶第一行,第5列显示89
; void LCD_write_datalongint( uchar r, uchar c, long int datalongint )
; {
.dbline 285
; char a[10];
; long_to_string( datalongint, a ) ;
movw R24,R28
adiw R24,2
std y+1,R25
std y+0,R24
ldd R16,y+14
ldd R17,y+15
ldd R18,y+16
ldd R19,y+17
xcall _long_to_string
.dbline 286
; LCD_write_string( r, c, a );
movw R24,R28
adiw R24,2
std y+1,R25
std y+0,R24
mov R18,R12
mov R16,R10
xcall _LCD_write_string
.dbline -2
L72:
.dbline 0 ; func end
adiw R28,12
ld R12,y+
ld R10,y+
ret
.dbsym l a 2 A[10:10]c
.dbsym l datalongint 14 L
.dbsym r c 12 c
.dbsym r r 10 c
.dbend
.dbfunc e LCD_write_datafloat _LCD_write_datafloat fV
; a -> y+3
; p -> y+19
; dataf -> y+15
; c -> R12
; r -> R10
.even
_LCD_write_datafloat::
st -y,R10
st -y,R12
mov R12,R18
mov R10,R16
sbiw R28,13
.dbline -1
.dbline 292
; }
;
; //写浮点型数据
; //例子: LCD_write_datafloat( 1, 5, -0.33, 4 ); 在液晶第一行,第5列显示-0.33, 显示小数点后4位。
; void LCD_write_datafloat( uchar r, uchar c, float dataf, uchar p )
; {
.dbline 294
; char a[10];
; float_2_string( dataf, a, p );
ldd R0,y+19
std y+2,R0
movw R24,R28
adiw R24,3
std y+1,R25
std y+0,R24
ldd R16,y+15
ldd R17,y+16
ldd R18,y+17
ldd R19,y+18
xcall _float_2_string
.dbline 295
; LCD_write_string( r, c, a );
movw R24,R28
adiw R24,3
std y+1,R25
std y+0,R24
mov R18,R12
mov R16,R10
xcall _LCD_write_string
.dbline -2
L73:
.dbline 0 ; func end
adiw R28,13
ld R12,y+
ld R10,y+
ret
.dbsym l a 3 A[10:10]c
.dbsym l p 19 c
.dbsym l dataf 15 D
.dbsym r c 12 c
.dbsym r r 10 c
.dbend
.area lit(rom, con, rel)
L35:
.word 0x0,0x4120
L30:
.word 0x0,0x4080
L29:
.word 0x0,0x0
L26:
.word 0x0,0x4000
; }
; //******************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -