📄 3310lcd_function.s
字号:
L14:
.dbline 99
.dbline 100
movw R30,R20
ldd R16,z+0
xcall _LCD_write_char
.dbline 101
subi R20,255 ; offset = 1
sbci R21,255
.dbline 102
L15:
.dbline 98
; while (*s)
movw R30,R20
ldd R2,z+0
tst R2
brne L14
.dbline -2
L13:
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_chinese_string _LCD_write_chinese_string fV
; i -> R20
; n -> R14
; row -> R10
; line -> R12
; num -> R22
; ch_with -> y+14
; Y -> y+12
; X -> y+10
.even
_LCD_write_chinese_string::
xcall push_arg4
xcall push_gset5
ldd R22,y+16
ldd R12,y+18
ldd R10,y+20
.dbline -1
.dbline 122
; {
; LCD_write_char(*s);
; s++;
; }
; }
; /*-----------------------------------------------------------------------
; LCD_write_chinese_string: 在LCD上显示汉字
;
; 输入参数:X、Y :显示汉字的起始X、Y坐标;
; ch_with :汉字点阵的宽度
; num :显示汉字的个数;
; line :汉字点阵数组中的起始行数
; row :汉字显示的行间距
; 编写日期 :2004-8-11
; 最后修改日期 :2004-8-12
; 测试:
; LCD_write_chi(0,0,12,7,0,0);
; LCD_write_chi(0,2,12,7,0,0);
; LCD_write_chi(0,4,12,7,0,0);
; -----------------------------------------------------------------------*/
; void LCD_write_chinese_string(unsigned char X, unsigned char Y,
; unsigned char ch_with,unsigned char num,
; unsigned char line,unsigned char row)
; {
.dbline 125
; unsigned char i,n;
;
; LCD_set_XY(X,Y); //设置初始位置
ldd R18,y+12
ldd R16,y+10
xcall _LCD_set_XY
.dbline 127
;
; for (i=0;i<num;)
clr R20
xjmp L21
L18:
.dbline 128
; {
.dbline 129
; for (n=0; n<ch_with*2; n++) //写一个汉字
clr R14
xjmp L25
L22:
.dbline 130
; {
.dbline 131
; if (n==ch_with) //写汉字的下半部分
ldd R0,y+14
cp R14,R0
brne L26
.dbline 132
; {
.dbline 133
; if (i==0) LCD_set_XY(X,Y+1);
tst R20
brne L28
.dbline 133
ldd R18,y+12
subi R18,255 ; addi 1
ldd R16,y+10
xcall _LCD_set_XY
xjmp L29
L28:
.dbline 135
; 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
L29:
.dbline 136
; }
L26:
.dbline 137
ldi R18,1
mov R2,R12
add R2,R20
ldi R24,24
mul R24,R2
movw R2,R0
ldi R24,<_write_chinese_string
ldi R25,>_write_chinese_string
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 138
L23:
.dbline 129
inc R14
L25:
.dbline 129
ldi R24,2
ldd R0,y+14
mul R24,R0
cp R14,R0
brlo L22
.dbline 139
inc R20
.dbline 140
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 141
L19:
.dbline 127
L21:
.dbline 127
cp R20,R22
brsh X0
xjmp L18
X0:
.dbline -2
L17:
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)
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:\AVR\527dz\00--Mega16\3310\3310LCD_function.c
.dbfunc e LCD_move_chinese_string _LCD_move_chinese_string 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_chinese_string::
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 154
; LCD_write_byte(write_chinese_string[line+i][n],1);
; }
; i++;
; LCD_set_XY((X+(ch_with+row)*i),Y);
; }
; }
;
; /*-----------------------------------------------------------------------
; LCD_move_chinese_string: 汉字移动
;
; 输入参数:X、Y :显示汉字的起始X、Y坐标;
; T :移动速度;
;
; 编写日期 :2004-8-13
; 最后修改日期 :2004-8-13
; -----------------------------------------------------------------------*/
; void LCD_move_chinese_string (unsigned char X, unsigned char Y, unsigned char T)
; {
.dbline 155
; unsigned char i,n,j=0;
clr R22
.dbline 156
; 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 157
; 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 159
;
; for (i=0; i<156; i++)
clr R20
xjmp L36
L33:
.dbline 160
; {
.dbline 161
; buffer_h[83] = move_chinese_string[i/12][j];
ldi R17,12
mov R16,R20
xcall div8u
ldi R24,24
mul R24,R16
movw R2,R0
ldi R24,<_move_chinese_string
ldi R25,>_move_chinese_string
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 162
; buffer_l[83] = move_chinese_string[i/12][j+12];
ldi R17,12
mov R16,R20
xcall div8u
ldi R24,24
mul R24,R16
movw R2,R0
ldi R24,<_move_chinese_string
ldi R25,>_move_chinese_string
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 163
; j++;
inc R22
.dbline 164
; if (j==12) j=0;
cpi R22,12
brne L39
.dbline 164
clr R22
L39:
.dbline 166
;
; for (n=0; n<83; n++)
clr R10
xjmp L44
L41:
.dbline 167
.dbline 168
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 169
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 170
L42:
.dbline 166
inc R10
L44:
.dbline 166
mov R24,R10
cpi R24,83
brlo L41
.dbline 172
; {
; 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 173
; for (n=0; n<83; n++)
clr R10
xjmp L50
L47:
.dbline 174
.dbline 175
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 176
L48:
.dbline 173
inc R10
L50:
.dbline 173
mov R24,R10
cpi R24,83
brlo L47
.dbline 178
; {
; 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 179
; for (n=0; n<83; n++)
clr R10
xjmp L54
L51:
.dbline 180
.dbline 181
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 182
L52:
.dbline 179
inc R10
L54:
.dbline 179
mov R24,R10
cpi R24,83
brlo L51
.dbline 184
mov R16,R12
clr R17
xcall _delay_nms
.dbline 185
L34:
.dbline 159
inc R20
L36:
.dbline 159
cpi R20,156
brsh X1
xjmp L33
X1:
.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 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_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 201
; {
; 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
; 最后修改日期 :2004-8-13
; -----------------------------------------------------------------------*/
; void LCD_draw_bmp_pixel(unsigned char X,unsigned char Y,unsigned char *map,
; unsigned char Pix_x,unsigned char Pix_y)
; {
.dbline 205
; 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 205
ldd R20,y+18
lsr R20
lsr R20
lsr R20
xjmp L57
L56:
.dbline 207
; else
; row=Pix_y/8+1;
ldd R20,y+18
lsr R20
lsr R20
lsr R20
subi R20,255 ; addi 1
L57:
.dbline 209
;
; for (n=0;n<row;n++)
clr R22
clr R23
xjmp L61
L58:
.dbline 210
; {
.dbline 211
; LCD_set_XY(X,Y);
ldd R18,y+12
ldd R16,y+10
xcall _LCD_set_XY
.dbline 212
; for(i=0; i<Pix_x; i++)
clr R14
clr R15
xjmp L65
L62:
.dbline 213
.dbline 214
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 215
L63:
.dbline 212
movw R24,R14
adiw R24,1
movw R14,R24
L65:
.dbline 212
mov R2,R10
clr R3
cp R14,R2
cpc R15,R3
brlo L62
.dbline 216
ldd R0,y+12
inc R0
std y+12,R0
.dbline 217
L59:
.dbline 209
subi R22,255 ; offset = 1
sbci R23,255
L61:
.dbline 209
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 230
; {
; LCD_write_byte(map[i+n*Pix_x], 1);
; }
; Y++; //换行
; }
; }
;
; /*-----------------------------------------------------------------------
; LCD_write_byte : 使用SPI接口写数据到LCD
;
; 输入参数:data :写入的数据;
; command :写数据/命令选择;
;
; 编写日期 :2004-8-10
; 最后修改日期 :2004-8-13
; -----------------------------------------------------------------------*/
; void LCD_write_byte(unsigned char data, unsigned char command)
; {
.dbline 231
; PORTB &= ~LCD_CE ; // 使能LCD
cbi 0x18,4
.dbline 233
;
; if (command == 0)
tst R18
brne L67
.dbline 234
; PORTB &= ~LCD_DC ; // 传送命令
cbi 0x18,3
xjmp L68
L67:
.dbline 236
; else
; PORTB |= LCD_DC ; // 传送数据
sbi 0x18,3
L68:
.dbline 238
;
; SPDR = data; // 传送数据到SPI寄存器
out 0xf,R16
L69:
.dbline 240
L70:
.dbline 240
;
; while ((SPSR & 0x80) == 0); // 等待数据传送完毕
sbis 0xe,7
rjmp L69
.dbline 242
;
; 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 + -