📄 3310_5110lcd.s
字号:
; p=s;
ldd R20,y+22
ldd R21,y+23
.dbline 137
; LCD_set_XY(X,Y); //设置初始位置
ldd R18,y+12
ldd R16,y+10
xcall _LCD_set_XY
.dbline 139
;
; for (i=0;i<num;)
clr R22
xjmp L21
L18:
.dbline 140
; {
.dbline 141
; for (n=0; n<ch_with*2; n++) //写一个汉字
clr R10
xjmp L25
L22:
.dbline 142
; {
.dbline 143
; if (n==ch_with) //写汉字的下半部分
ldd R0,y+14
cp R10,R0
brne L26
.dbline 144
; {
.dbline 145
; if (i==0) LCD_set_XY(X,Y+1);
tst R22
brne L28
.dbline 145
ldd R18,y+12
subi R18,255 ; addi 1
ldd R16,y+10
xcall _LCD_set_XY
xjmp L29
L28:
.dbline 147
; 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,R12
mul R2,R22
ldd R16,y+10
add R16,R0
xcall _LCD_set_XY
L29:
.dbline 148
; }
L26:
.dbline 149
ldi R18,1
mov R2,R14
add R2,R22
ldi R24,24
mul R24,R2
movw R2,R0
add R2,R20
adc R3,R21
mov R30,R10
clr R31
add R30,R2
adc R31,R3
ldd R16,z+0
xcall _LCD_write_byte
.dbline 150
L23:
.dbline 141
inc R10
L25:
.dbline 141
ldi R24,2
ldd R0,y+14
mul R24,R0
cp R10,R0
brlo L22
.dbline 151
inc R22
.dbline 152
ldd R18,y+12
ldd R2,y+14
add R2,R12
mul R2,R22
ldd R16,y+10
add R16,R0
xcall _LCD_set_XY
.dbline 153
L19:
.dbline 139
L21:
.dbline 139
ldd R0,y+16
cp R22,R0
brlo L18
.dbline -2
L17:
xcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
.dbsym r p 20 pA[24:24]c
.dbsym r i 22 c
.dbsym r n 10 c
.dbsym l s 22 pA[24:24]c
.dbsym r row 12 c
.dbsym r line 14 c
.dbsym l num 16 c
.dbsym l ch_with 14 c
.dbsym l Y 12 c
.dbsym l X 10 c
.dbend
.area lit(rom, con, rel)
L31:
.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
L32:
.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 D:\avrvi\democode\5110_综合演示\source\lib\3310_5110LCD.c
.dbfunc e LCD_move_chinese_string _LCD_move_chinese_string fV
; p -> R20,R21
; i -> R22
; j -> R10
; buffer_l -> y+84
; buffer_h -> y+0
; n -> R12
; s -> y+184
; T -> R14
; Y -> y+180
; X -> y+178
.even
_LCD_move_chinese_string::
xcall push_arg4
xcall push_gset5
sbiw R28,63
sbiw R28,63
sbiw R28,42 ; offset = 168
movw R30,R28
subi R30,74 ; addi 182
sbci R31,255
ldd R14,z+0
.dbline -1
.dbline 167
; LCD_write_byte(*(*(p+(line+i))+n),1);
; }
; i++;
; LCD_set_XY((X+(ch_with+row)*i),Y);
; }
; }
; /*************************************************************************
; ** 函数名称: LCD_move_chinese_string (unsigned char X, unsigned char Y, unsigned char T,unsigned char (*s)[24])
; ** 功能描述: 汉字移动
; ** 输 入: X、Y :显示汉字的起始X、Y坐标;
; T :移动速度;
; ** 输出 :
; ** 全局变量: 无
; ** 调用模块:
; ** 说明:
; ** 注意:
; **************************************************************************/
; void LCD_move_chinese_string (unsigned char X, unsigned char Y, unsigned char T,unsigned char (*s)[24])
; {
.dbline 168
; unsigned char i,n,j=0,(*p)[24];
clr R10
.dbline 169
; unsigned char buffer_h[84]={0};
ldi R24,<L31
ldi R25,>L31
movw R30,R28
ldi R16,84
ldi R17,0
st -y,R31
st -y,R30
st -y,R25
st -y,R24
xcall asgncblk
.dbline 170
; unsigned char buffer_l[84]={0};
ldi R24,<L32
ldi R25,>L32
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 171
; p=s;
movw R30,R28
subi R30,72 ; addi 184
sbci R31,255
ldd R20,z+0
ldd R21,z+1
.dbline 172
; for (i=0; i<156; i++)
clr R22
xjmp L36
L33:
.dbline 173
; {
.dbline 174
; buffer_h[83] = *(*(p+(i/12))+j);
ldi R17,12
mov R16,R22
xcall div8u
ldi R24,24
mul R24,R16
movw R2,R0
add R2,R20
adc R3,R21
mov R30,R10
clr R31
add R30,R2
adc R31,R3
ldd R2,z+0
movw R30,R28
subi R30,173 ; addi 83
sbci R31,255
std z+0,R2
.dbline 175
; buffer_l[83] = *(*(p+(i/12))+(j+12));
ldi R17,12
mov R16,R22
xcall div8u
ldi R24,24
mul R24,R16
movw R2,R0
add R2,R20
adc R3,R21
mov R30,R10
clr R31
adiw R30,12
add R30,R2
adc R31,R3
ldd R2,z+0
movw R30,R28
subi R30,89 ; addi 167
sbci R31,255
std z+0,R2
.dbline 176
; j++;
inc R10
.dbline 177
; if (j==12) j=0;
mov R24,R10
cpi R24,12
brne L39
.dbline 177
clr R10
L39:
.dbline 179
;
; for (n=0; n<83; n++)
clr R12
xjmp L44
L41:
.dbline 180
.dbline 181
movw R24,R28
adiw R24,1
mov R30,R12
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
movw R24,R28
mov R30,R12
clr R31
add R30,R24
adc R31,R25
std z+0,R2
.dbline 182
movw R24,R28
subi R24,171 ; offset = 85
sbci R25,255
mov R30,R12
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,R12
clr R31
add R30,R24
adc R31,R25
std z+0,R2
.dbline 183
L42:
.dbline 179
inc R12
L44:
.dbline 179
mov R24,R12
cpi R24,83
brlo L41
.dbline 185
; {
; buffer_h[n]=buffer_h[n+1];
; buffer_l[n]=buffer_l[n+1];
; }
;
; LCD_set_XY(X,Y);
movw R30,R28
subi R30,76 ; addi 180
sbci R31,255
ldd R18,z+0
movw R30,R28
subi R30,78 ; addi 178
sbci R31,255
ldd R16,z+0
xcall _LCD_set_XY
.dbline 186
; for (n=0; n<83; n++)
clr R12
xjmp L50
L47:
.dbline 187
.dbline 188
ldi R18,1
movw R24,R28
mov R30,R12
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _LCD_write_byte
.dbline 189
L48:
.dbline 186
inc R12
L50:
.dbline 186
mov R24,R12
cpi R24,83
brlo L47
.dbline 191
; {
; LCD_write_byte(buffer_h[n],1);
; }
;
; LCD_set_XY(X,Y+1);
movw R30,R28
subi R30,76 ; addi 180
sbci R31,255
ldd R18,z+0
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 192
; for (n=0; n<83; n++)
clr R12
xjmp L54
L51:
.dbline 193
.dbline 194
ldi R18,1
movw R24,R28
subi R24,172 ; offset = 84
sbci R25,255
mov R30,R12
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _LCD_write_byte
.dbline 195
L52:
.dbline 192
inc R12
L54:
.dbline 192
mov R24,R12
cpi R24,83
brlo L51
.dbline 197
mov R16,R14
clr R17
xcall _delay_nms
.dbline 198
L34:
.dbline 172
inc R22
L36:
.dbline 172
cpi R22,156
brsh X0
xjmp L33
X0:
.dbline -2
L30:
adiw R28,63
adiw R28,63
adiw R28,42 ; offset = 168
xcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
.dbsym r p 20 pA[24:24]c
.dbsym r i 22 c
.dbsym r j 10 c
.dbsym l buffer_l 84 A[84:84]c
.dbsym l buffer_h 0 A[84:84]c
.dbsym r n 12 c
.dbsym l s 184 pA[24:24]c
.dbsym r T 14 c
.dbsym l Y 180 c
.dbsym l X 178 c
.dbend
.dbfunc e LCD_draw_bmp_pixel _LCD_draw_bmp_pixel 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_bmp_pixel::
xcall push_arg4
xcall push_gset5
ldd R12,y+14
ldd R13,y+15
ldd R10,y+16
.dbline -1
.dbline 214
; {
; LCD_write_byte(buffer_l[n],1);
; }
;
; delay_nms(T);
; }
; }
; /*************************************************************************
; ** 函数名称: LCD_draw_bmp_pixel(unsigned char X,unsigned char Y,unsigned char *map,unsigned char Pix_x,unsigned char Pix_y)
; ** 功能描述: 位图绘制函数
; ** 输 入: X、Y :位图绘制的起始X、Y坐标;
; *map :位图点阵数据;
; Pix_x :位图像素(长)
; Pix_y :位图像素(宽)
; ** 输出 :
; ** 全局变量: 无
; ** 调用模块:
; ** 说明:
; ** 注意:
; **************************************************************************/
; void LCD_draw_bmp_pixel(unsigned char X,unsigned char Y,unsigned char *map,unsigned char Pix_x,unsigned char Pix_y)
; {
.dbline 218
; unsigned int i,n;
; unsigned char row;
;
; if (Pix_y%8==0) row=Pix_y/8; //计算位图所占行数
ldi R17,8
ldd R16,y+18
xcall mod8u
tst R16
brne L56
.dbline 218
ldd R20,y+18
lsr R20
lsr R20
lsr R20
xjmp L57
L56:
.dbline 219
; else row=Pix_y/8+1;
ldd R20,y+18
lsr R20
lsr R20
lsr R20
subi R20,255 ; addi 1
L57:
.dbline 221
;
; for (n=0;n<row;n++)
clr R22
clr R23
xjmp L61
L58:
.dbline 222
; {
.dbline 223
; LCD_set_XY(X,Y);
ldd R18,y+12
ldd R16,y+10
xcall _LCD_set_XY
.dbline 224
; for(i=0; i<Pix_x; i++)
clr R14
clr R15
xjmp L65
L62:
.dbline 225
.dbline 226
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 227
L63:
.dbline 224
movw R24,R14
adiw R24,1
movw R14,R24
L65:
.dbline 224
mov R2,R10
clr R3
cp R14,R2
cpc R15,R3
brlo L62
.dbline 228
ldd R0,y+12
inc R0
std y+12,R0
.dbline 229
L59:
.dbline 221
subi R22,255 ; offset = 1
sbci R23,255
L61:
.dbline 221
mov R2,R20
clr R3
cp R22,R2
cpc R23,R3
brlo L58
.dbline -2
L55:
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
.dbfunc e LCD_write_byte _LCD_write_byte fV
; command -> R18
; data -> R16
.even
_LCD_write_byte::
.dbline -1
.dbline 243
; {
; LCD_write_byte(map[i+n*Pix_x], 1);
; }
; Y++; //换行
; }
; }
; /*************************************************************************
; ** 函数名称: LCD_write_byte(unsigned char data, unsigned char command)
; ** 功能描述: 使用SPI接口写数据到LCD
; ** 输 入: data :写入的数据;
; command :写数据/命令选择;
; ** 输出 :
; ** 全局变量: 无
; ** 调用模块:
; ** 说明:
; ** 注意:
; **************************************************************************/
; void LCD_write_byte(unsigned char data, unsigned char command)
; {
.dbline 244
; PORTB &= ~LCD_CE ; // 使能LCD
cbi 0x18,4
.dbline 246
;
; if (command == 0)
tst R18
brne L67
.dbline 247
; PORTB &= ~LCD_DC ; // 传送命令
cbi 0x18,3
xjmp L68
L67:
.dbline 249
; else
; PORTB |= LCD_DC ; // 传送数据
sbi 0x18,3
L68:
.dbline 251
;
; SPDR = data; // 传送数据到SPI寄存器
out 0xf,R16
L69:
.dbline 253
L70:
.dbline 253
;
; while ((SPSR & 0x80) == 0); // 等待数据传送完毕
sbis 0xe,7
rjmp L69
.dbline 255
;
; PORTB |= LCD_CE ; // 关闭LCD
sbi 0x18,4
.dbline -2
L66:
.dbline 0 ; func end
ret
.dbsym r command 18 c
.dbsym r data 16 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -