📄 lcd.s
字号:
_LCD_write_char::
xcall push_gset2
mov R22,R16
.dbline -1
.dbline 92
; }
;
; /*-----------------------------------------------------------------------
; LCD_write_char: 显示英文字符
; 输入参数:c:显示的字符;
; 编写日期:2004-8-10
; 最后修改日期:2006-10-23
; -----------------------------------------------------------------------*/
; void LCD_write_char(unsigned char c)
; {
.dbline 94
; unsigned char line;
; c -= 32;
subi R22,32
.dbline 95
; for (line=0; line<6; line++)
clr R20
xjmp L18
L15:
.dbline 96
ldi R18,1
ldi R24,6
mul R24,R22
movw R2,R0
ldi R24,<_font6x8
ldi R25,>_font6x8
add R2,R24
adc R3,R25
mov R30,R20
clr R31
add R30,R2
adc R31,R3
lpm R16,Z
xcall _LCD_write_byte
L16:
.dbline 95
inc R20
L18:
.dbline 95
cpi R20,6
brlo L15
.dbline -2
L14:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r line 20 c
.dbsym r c 22 c
.dbend
.dbfunc e LCD_write_String _LCD_write_String fV
; s -> R20,R21
; Y -> R10
; X -> R22
.even
_LCD_write_String::
xcall push_gset3
mov R10,R18
mov R22,R16
ldd R20,y+6
ldd R21,y+7
.dbline -1
.dbline 107
; LCD_write_byte(font6x8[c][line], 1);
; }
;
; /*-----------------------------------------------------------------------
; LCD_write_char: 英文字符串显示函数
; 输入参数:*s:英文字符串指针;
; X、Y: 显示字符串的位置
; 编写日期:2004-8-10
; 最后修改日期:2006-10-23
; -----------------------------------------------------------------------*/
; void LCD_write_String(unsigned char X,unsigned char Y,char *s)
; {
.dbline 108
; LCD_set_XY(X,Y);
mov R18,R10
mov R16,R22
xcall _LCD_set_XY
xjmp L21
L20:
.dbline 110
.dbline 111
movw R30,R20
ldd R16,z+0
xcall _LCD_write_char
.dbline 112
subi R20,255 ; offset = 1
sbci R21,255
.dbline 113
L21:
.dbline 109
; while (*s)
movw R30,R20
ldd R2,z+0
tst R2
brne L20
.dbline -2
L19:
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 LCD_write_chi _LCD_write_chi fV
; i -> R20
; n -> R14
; row -> R10
; line -> R12
; num -> R22
; ch_with -> y+14
; Y -> y+12
; X -> y+10
.even
_LCD_write_chi::
xcall push_arg4
xcall push_gset5
ldd R22,y+16
ldd R12,y+18
ldd R10,y+20
.dbline -1
.dbline 130
; {
; LCD_write_char(*s);
; s++;
; }
; }
;
; /*-----------------------------------------------------------------------
;
; LCD_write_chi: 在LCD上显示汉字
; 输入参数:X、Y:显示汉字的起始X、Y坐标;
; ch_with :汉字点阵的宽度
; num:显示汉字的个数;
; line:汉字点阵数组中的起始行数
; row:汉字显示的行间距
; 编写日期:2004-8-11
; 最后修改日期:2006-10-23
; -----------------------------------------------------------------------*/
; void LCD_write_chi(unsigned char X, unsigned char Y,
; unsigned char ch_with,unsigned char num,
; unsigned char line,unsigned char row)
; {
.dbline 132
; unsigned char i,n;
; LCD_set_XY(X,Y);//设置初始位置
ldd R18,y+12
ldd R16,y+10
xcall _LCD_set_XY
.dbline 133
; for (i=0;i<num;)
clr R20
xjmp L27
L24:
.dbline 134
; {
.dbline 135
; for (n=0; n<ch_with*2; n++)//写一个汉字
clr R14
xjmp L31
L28:
.dbline 136
; {
.dbline 137
; if (n==ch_with)//写汉字的下半部分
ldd R0,y+14
cp R14,R0
brne L32
.dbline 138
; {
.dbline 139
; if (i==0)
tst R20
brne L34
.dbline 140
; LCD_set_XY(X,Y+1);
ldd R18,y+12
subi R18,255 ; addi 1
ldd R16,y+10
xcall _LCD_set_XY
xjmp L35
L34:
.dbline 142
; else
; LCD_set_XY((X+(ch_with+row)*i),Y+1);
ldd R18,y+12
subi R18,255 ; addi 1
ldd R2,y+14
add R2,R10
mul R2,R20
ldd R16,y+10
add R16,R0
xcall _LCD_set_XY
L35:
.dbline 143
; }
L32:
.dbline 144
ldi R18,1
mov R2,R12
add R2,R20
ldi R24,24
mul R24,R2
movw R2,R0
ldi R24,<_china_char
ldi R25,>_china_char
add R2,R24
adc R3,R25
mov R30,R14
clr R31
add R30,R2
adc R31,R3
lpm R16,Z
xcall _LCD_write_byte
.dbline 145
L29:
.dbline 135
inc R14
L31:
.dbline 135
ldi R24,2
ldd R0,y+14
mul R24,R0
cp R14,R0
brlo L28
.dbline 146
inc R20
.dbline 147
ldd R18,y+12
ldd R2,y+14
add R2,R10
mul R2,R20
ldd R16,y+10
add R16,R0
xcall _LCD_set_XY
.dbline 148
L25:
.dbline 133
L27:
.dbline 133
cp R20,R22
brsh X0
xjmp L24
X0:
.dbline -2
L23:
xcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r n 14 c
.dbsym r row 10 c
.dbsym r line 12 c
.dbsym r num 22 c
.dbsym l ch_with 14 c
.dbsym l Y 12 c
.dbsym l X 10 c
.dbend
.area lit(rom, con, rel)
L37:
.byte 0
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.word 0,0,0,0,0
.word 0,0,0,0,0
.byte 0,0,0
L38:
.byte 0
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.word 0,0,0,0,0
.word 0,0,0,0,0
.byte 0,0,0
.area text(rom, con, rel)
.dbfile E:\V3U~1\sd\M64-SD卡MP3程序\lcd.c
.dbfunc e LCD_move_chi _LCD_move_chi fV
; i -> R20
; j -> R22
; buffer_l -> y+84
; buffer_h -> y+0
; n -> R10
; T -> R12
; Y -> R14
; X -> y+178
.even
_LCD_move_chi::
xcall push_arg4
xcall push_gset5
mov R14,R18
sbiw R28,63
sbiw R28,63
sbiw R28,42 ; offset = 168
movw R30,R28
subi R30,74 ; addi 182
sbci R31,255
ldd R12,z+0
.dbline -1
.dbline 159
; LCD_write_byte(china_char[line+i][n],1);
; }
; i++;
; LCD_set_XY((X+(ch_with+row)*i),Y);
; }
; }
;
; /*-----------------------------------------------------------------------
; LCD_write_chi: 汉字移动
; 输入参数:X、Y:显示汉字的起始X、Y坐标;
; T:移动速度;
; 编写日期:2004-8-13
; 最后修改日期:2006-10-23
; -----------------------------------------------------------------------*/
; void LCD_move_chi(unsigned char X, unsigned char Y, unsigned char T)
; {
.dbline 160
; unsigned char i,n,j=0;
clr R22
.dbline 161
; unsigned char buffer_h[84]={0};
ldi R24,<L37
ldi R25,>L37
movw R30,R28
ldi R16,84
ldi R17,0
st -y,R31
st -y,R30
st -y,R25
st -y,R24
xcall asgncblk
.dbline 162
; unsigned char buffer_l[84]={0};
ldi R24,<L38
ldi R25,>L38
movw R30,R28
subi R30,172 ; offset = 84
sbci R31,255
ldi R16,84
ldi R17,0
st -y,R31
st -y,R30
st -y,R25
st -y,R24
xcall asgncblk
.dbline 163
; for (i=0; i<144; i++)
clr R20
xjmp L42
L39:
.dbline 164
; {
.dbline 165
; buffer_h[83] = china_char[i/12][j];
ldi R17,12
mov R16,R20
xcall div8u
ldi R24,24
mul R24,R16
movw R2,R0
ldi R24,<_china_char
ldi R25,>_china_char
add R2,R24
adc R3,R25
mov R30,R22
clr R31
add R30,R2
adc R31,R3
lpm R30,Z
movw R26,R28
subi R26,173 ; addi 83
sbci R27,255
st x,R30
.dbline 166
; buffer_l[83] = china_char[i/12][j+12];
ldi R17,12
mov R16,R20
xcall div8u
ldi R24,24
mul R24,R16
movw R2,R0
ldi R24,<_china_char
ldi R25,>_china_char
add R2,R24
adc R3,R25
mov R30,R22
clr R31
adiw R30,12
add R30,R2
adc R31,R3
lpm R30,Z
movw R26,R28
subi R26,89 ; addi 167
sbci R27,255
st x,R30
.dbline 167
; j++;
inc R22
.dbline 168
; if (j==12)
cpi R22,12
brne L45
.dbline 169
; j=0;
clr R22
L45:
.dbline 170
; for (n=0; n<83; n++)
clr R10
xjmp L50
L47:
.dbline 171
.dbline 172
movw R24,R28
adiw R24,1
mov R30,R10
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
movw R24,R28
mov R30,R10
clr R31
add R30,R24
adc R31,R25
std z+0,R2
.dbline 173
movw R24,R28
subi R24,171 ; offset = 85
sbci R25,255
mov R30,R10
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
movw R24,R28
subi R24,172 ; offset = 84
sbci R25,255
mov R30,R10
clr R31
add R30,R24
adc R31,R25
std z+0,R2
.dbline 174
L48:
.dbline 170
inc R10
L50:
.dbline 170
mov R24,R10
cpi R24,83
brlo L47
.dbline 175
; {
; buffer_h[n]=buffer_h[n+1];
; buffer_l[n]=buffer_l[n+1];
; }
; LCD_set_XY(X,Y);
mov R18,R14
movw R30,R28
subi R30,78 ; addi 178
sbci R31,255
ldd R16,z+0
xcall _LCD_set_XY
.dbline 176
; for (n=0; n<83; n++)
clr R10
xjmp L56
L53:
.dbline 177
.dbline 178
ldi R18,1
movw R24,R28
mov R30,R10
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _LCD_write_byte
.dbline 179
L54:
.dbline 176
inc R10
L56:
.dbline 176
mov R24,R10
cpi R24,83
brlo L53
.dbline 180
; {
; LCD_write_byte(buffer_h[n],1);
; }
; LCD_set_XY(X,Y+1);
mov R18,R14
subi R18,255 ; addi 1
movw R30,R28
subi R30,78 ; addi 178
sbci R31,255
ldd R16,z+0
xcall _LCD_set_XY
.dbline 181
; for (n=0; n<83; n++)
clr R10
xjmp L60
L57:
.dbline 182
.dbline 183
ldi R18,1
movw R24,R28
subi R24,172 ; offset = 84
sbci R25,255
mov R30,R10
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _LCD_write_byte
.dbline 184
L58:
.dbline 181
inc R10
L60:
.dbline 181
mov R24,R10
cpi R24,83
brlo L57
.dbline 185
mov R16,R12
clr R17
xcall _delay_nms
.dbline 186
L40:
.dbline 163
inc R20
L42:
.dbline 163
cpi R20,144
brsh X1
xjmp L39
X1:
.dbline -2
L36:
adiw R28,63
adiw R28,63
adiw R28,42 ; offset = 168
xcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r j 22 c
.dbsym l buffer_l 84 A[84:84]c
.dbsym l buffer_h 0 A[84:84]c
.dbsym r n 10 c
.dbsym r T 12 c
.dbsym r Y 14 c
.dbsym l X 178 c
.dbend
.dbfunc e LCD_draw_map _LCD_draw_map fV
; row -> R20
; n -> R22,R23
; i -> R14,R15
; Pix_y -> y+18
; Pix_x -> R10
; map -> R12,R13
; Y -> y+12
; X -> y+10
.even
_LCD_draw_map::
xcall push_arg4
xcall push_gset5
ldd R12,y+14
ldd R13,y+15
ldd R10,y+16
.dbline -1
.dbline 200
; {
; LCD_write_byte(buffer_l[n],1);
; }
; delay_nms(T);
; }
; }
;
; /*-----------------------------------------------------------------------
; LCD_draw_map: 位图绘制函数
; 输入参数:X、Y:位图绘制的起始X、Y坐标;
; *map:位图点阵数据;
; Pix_x:位图像素(长)
; Pix_y:位图像素(宽)
; 编写日期:2004-8-13
; 最后修改日期:2006-10-23
; -----------------------------------------------------------------------*/
; void LCD_draw_map(unsigned char X,unsigned char Y,unsigned char *map,
; unsigned char Pix_x,unsigned char Pix_y)
; {
.dbline 203
; unsigned int i,n;
; unsigned char row;
; if (Pix_y%8==0)
ldi R17,8
ldd R16,y+18
xcall mod8u
tst R16
brne L62
.dbline 204
; row=Pix_y/8;//计算位图所占行数
ldd R20,y+18
lsr R20
lsr R20
lsr R20
xjmp L63
L62:
.dbline 206
; else
; row=Pix_y/8+1;
ldd R20,y+18
lsr R20
lsr R20
lsr R20
subi R20,255 ; addi 1
L63:
.dbline 207
; for (n=0;n<row;n++)
clr R22
clr R23
xjmp L67
L64:
.dbline 208
; {
.dbline 209
; LCD_set_XY(X,Y);
ldd R18,y+12
ldd R16,y+10
xcall _LCD_set_XY
.dbline 210
; for(i=0; i<Pix_x; i++)
clr R14
clr R15
xjmp L71
L68:
.dbline 211
.dbline 212
ldi R18,1
mov R2,R10
clr R3
push R18
push R19
movw R18,R2
movw R16,R22
xcall empy16s
pop R19
pop R18
movw R30,R14
add R30,R16
adc R31,R17
add R30,R12
adc R31,R13
ldd R16,z+0
xcall _LCD_write_byte
.dbline 213
L69:
.dbline 210
movw R24,R14
adiw R24,1
movw R14,R24
L71:
.dbline 210
mov R2,R10
clr R3
cp R14,R2
cpc R15,R3
brlo L68
.dbline 214
ldd R0,y+12
inc R0
std y+12,R0
.dbline 215
L65:
.dbline 207
subi R22,255 ; offset = 1
sbci R23,255
L67:
.dbline 207
mov R2,R20
clr R3
cp R22,R2
cpc R23,R3
brlo L64
.dbline -2
L61:
xcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
.dbsym r row 20 c
.dbsym r n 22 i
.dbsym r i 14 i
.dbsym l Pix_y 18 c
.dbsym r Pix_x 10 c
.dbsym r map 12 pc
.dbsym l Y 12 c
.dbsym l X 10 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -