📄 nokia_5110.s
字号:
_LCD_write_char::
rcall push_gset2
mov R22,R16
.dbline -1
.dbline 114
;
; /*-----------------------------------------------------------------------
; LCD_write_char : 显示英文字符
;
; 输入参数:c :显示的字符;
;
; 编写日期 :2004-8-10
; 最后修改日期 :2004-8-10
; -----------------------------------------------------------------------*/
; void LCD_write_char(unsigned char c)
; {
.dbline 117
; unsigned char line;
;
; c -= 32;
subi R22,32
.dbline 119
;
; for (line=0; line<6; line++)
clr R20
rjmp L27
L24:
.dbline 120
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
rcall _LCD_write_byte
L25:
.dbline 119
inc R20
L27:
.dbline 119
cpi R20,6
brlo L24
.dbline -2
.dbline 121
; LCD_write_byte(font6x8[c][line], 1);
; }
L23:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r line 20 c
.dbsym r c 22 c
.dbend
.dbfunc e LCD_write_english_string _LCD_write_english_string fV
; s -> R20,R21
; Y -> R10
; X -> R22
.even
_LCD_write_english_string::
rcall push_gset3
mov R10,R18
mov R22,R16
ldd R20,y+6
ldd R21,y+7
.dbline -1
.dbline 133
;
; /*-----------------------------------------------------------------------
; LCD_write_english_String : 英文字符串显示函数
;
; 输入参数:*s :英文字符串指针;
; X、Y : 显示字符串的位置,x 0-83 ,y 0-5
;
; 编写日期 :2004-8-10
; 最后修改日期 :2004-8-10
; -----------------------------------------------------------------------*/
; void LCD_write_english_string(unsigned char X,unsigned char Y,char *s)
; {
.dbline 134
; LCD_set_XY(X,Y);
mov R18,R10
mov R16,R22
rcall _LCD_set_XY
rjmp L30
L29:
.dbline 136
.dbline 137
movw R30,R20
ldd R16,z+0
rcall _LCD_write_char
.dbline 138
subi R20,255 ; offset = 1
sbci R21,255
.dbline 139
L30:
.dbline 135
; while (*s)
movw R30,R20
ldd R2,z+0
tst R2
brne L29
.dbline -2
.dbline 140
; {
; LCD_write_char(*s);
; s++;
; }
; }
L28:
rcall 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::
rcall push_arg4
rcall push_gset5
ldd R22,y+16
ldd R12,y+18
ldd R10,y+20
.dbline -1
.dbline 159
; /*-----------------------------------------------------------------------
; 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 162
; unsigned char i,n;
;
; LCD_set_XY(X,Y); //设置初始位置
ldd R18,y+12
ldd R16,y+10
rcall _LCD_set_XY
.dbline 164
;
; for (i=0;i<num;)
clr R20
rjmp L36
L33:
.dbline 165
; {
.dbline 166
; for (n=0; n<ch_with*2; n++) //写一个汉字
clr R14
rjmp L40
L37:
.dbline 167
; {
.dbline 168
; if (n==ch_with) //写汉字的下半部分
ldd R0,y+14
cp R14,R0
brne L41
.dbline 169
; {
.dbline 170
; if (i==0) LCD_set_XY(X,Y+1);
tst R20
brne L43
.dbline 170
ldd R18,y+12
subi R18,255 ; addi 1
ldd R16,y+10
rcall _LCD_set_XY
rjmp L44
L43:
.dbline 172
; 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
rcall _LCD_set_XY
L44:
.dbline 173
; }
L41:
.dbline 174
ldi R18,1
mov R2,R12
add R2,R20
ldi R24,24
mul R24,R2
movw R2,R0
ldi R24,<_write_chinese
ldi R25,>_write_chinese
add R2,R24
adc R3,R25
mov R30,R14
clr R31
add R30,R2
adc R31,R3
lpm R16,Z
rcall _LCD_write_byte
.dbline 175
L38:
.dbline 166
inc R14
L40:
.dbline 166
ldi R24,2
ldd R0,y+14
mul R24,R0
cp R14,R0
brlo L37
.dbline 176
inc R20
.dbline 177
ldd R18,y+12
ldd R2,y+14
add R2,R10
mul R2,R20
ldd R16,y+10
add R16,R0
rcall _LCD_set_XY
.dbline 178
L34:
.dbline 164
L36:
.dbline 164
cp R20,R22
brsh X0
rjmp L33
X0:
.dbline -2
.dbline 179
; LCD_write_byte(write_chinese[line+i][n],1);
; }
; i++;
; LCD_set_XY((X+(ch_with+row)*i),Y);
; }
; }
L32:
rcall 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)
L46:
.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
L47:
.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:\Study\AVR\nokia5110\nokia_5110.c
.dbfunc e chinese_string _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
_chinese_string::
rcall push_arg4
rcall 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 191
;
; /*-----------------------------------------------------------------------
; LCD_move_chinese_string: 汉字移动
;
; 输入参数:X、Y :显示汉字的起始X、Y坐标;
; T :移动速度;
;
; 编写日期 :2004-8-13
; 最后修改日期 :2004-8-13
; -----------------------------------------------------------------------*/
; void chinese_string (unsigned char X, unsigned char Y, unsigned char T)
; {
.dbline 192
; unsigned char i,n,j=0;
clr R22
.dbline 193
; unsigned char buffer_h[84]={0};
ldi R24,<L46
ldi R25,>L46
movw R30,R28
ldi R16,84
ldi R17,0
st -y,R31
st -y,R30
st -y,R25
st -y,R24
rcall asgncblk
.dbline 194
; unsigned char buffer_l[84]={0};
ldi R24,<L47
ldi R25,>L47
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
rcall asgncblk
.dbline 196
;
; for (i=0; i<156; i++)
clr R20
rjmp L51
L48:
.dbline 197
; {
.dbline 198
; buffer_h[83] = move_chinese_string[i/12][j];
ldi R17,12
mov R16,R20
rcall 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 199
; buffer_l[83] = move_chinese_string[i/12][j+12];
ldi R17,12
mov R16,R20
rcall 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 200
; j++;
inc R22
.dbline 201
; if (j==12) j=0;
cpi R22,12
brne L54
.dbline 201
clr R22
L54:
.dbline 203
;
; for (n=0; n<83; n++)
clr R10
rjmp L59
L56:
.dbline 204
.dbline 205
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 206
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 207
L57:
.dbline 203
inc R10
L59:
.dbline 203
mov R24,R10
cpi R24,83
brlo L56
.dbline 209
; {
; 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
rcall _LCD_set_XY
.dbline 210
; for (n=0; n<83; n++)
clr R10
rjmp L65
L62:
.dbline 211
.dbline 212
ldi R18,1
movw R24,R28
mov R30,R10
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
rcall _LCD_write_byte
.dbline 213
L63:
.dbline 210
inc R10
L65:
.dbline 210
mov R24,R10
cpi R24,83
brlo L62
.dbline 215
; {
; 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
rcall _LCD_set_XY
.dbline 216
; for (n=0; n<83; n++)
clr R10
rjmp L69
L66:
.dbline 217
.dbline 218
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
rcall _LCD_write_byte
.dbline 219
L67:
.dbline 216
inc R10
L69:
.dbline 216
mov R24,R10
cpi R24,83
brlo L66
.dbline 221
mov R16,R12
clr R17
rcall _delay_nms
.dbline 222
L49:
.dbline 196
inc R20
L51:
.dbline 196
cpi R20,156
brsh X1
rjmp L48
X1:
.dbline -2
.dbline 223
; {
; LCD_write_byte(buffer_l[n],1);
; }
;
; delay_nms(T);
; }
; }
L45:
adiw R28,63
adiw R28,63
adiw R28,42 ; offset = 168
rcall 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::
rcall push_arg4
rcall push_gset5
ldd R12,y+14
ldd R13,y+15
ldd R10,y+16
.dbline -1
.dbline 238
;
; /*-----------------------------------------------------------------------
; 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 242
; unsigned int i,n;
; unsigned char row;
;
; if (Pix_y%8==0) row=Pix_y/8; //计算位图所占行数
ldi R17,8
ldd R16,y+18
rcall mod8u
tst R16
brne L71
.dbline 242
ldd R20,y+18
lsr R20
lsr R20
lsr R20
rjmp L72
L71:
.dbline 244
; else
; row=Pix_y/8+1;
ldd R20,y+18
lsr R20
lsr R20
lsr R20
subi R20,255 ; addi 1
L72:
.dbline 246
;
; for (n=0;n<row;n++)
clr R22
clr R23
rjmp L76
L73:
.dbline 247
; {
.dbline 248
; LCD_set_XY(X,Y);
ldd R18,y+12
ldd R16,y+10
rcall _LCD_set_XY
.dbline 249
; for(i=0; i<Pix_x; i++)
clr R14
clr R15
rjmp L80
L77:
.dbline 250
.dbline 251
ldi R18,1
mov R2,R10
clr R3
push R18
push R19
movw R18,R2
movw R16,R22
rcall empy16s
pop R19
pop R18
movw R30,R14
add R30,R16
adc R31,R17
add R30,R12
adc R31,R13
ldd R16,z+0
rcall _LCD_write_byte
.dbline 252
L78:
.dbline 249
movw R24,R14
adiw R24,1
movw R14,R24
L80:
.dbline 249
mov R2,R10
clr R3
cp R14,R2
cpc R15,R3
brlo L77
.dbline 253
ldd R0,y+12
inc R0
std y+12,R0
.dbline 254
L74:
.dbline 246
subi R22,255 ; offset = 1
sbci R23,255
L76:
.dbline 246
mov R2,R20
clr R3
cp R22,R2
cpc R23,R3
brlo L73
.dbline -2
.dbline 255
; {
; LCD_write_byte(map[i+n*Pix_x], 1);
; }
; Y++; //换行
; }
; }
L70:
rcall 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
; i -> R20
; command -> R18
; dat -> R16
.even
_LCD_write_byte::
rcall push_gset1
.dbline -1
.dbline 267
;
; /*-----------------------------------------------------------------------
; LCD_write_byte : 使用SPI接口写数据到LCD
;
; 输入参数:data :写入的数据;
; command :写数据/命令选择;
;
; 编写日期 :2004-8-10
; 最后修改日期 :2004-8-13
; -----------------------------------------------------------------------*/
; void LCD_write_byte(unsigned char dat, unsigned char command)
; {
.dbline 271
; unsigned char i;
; //PORTB &= ~LCD_CE ; // avr
; //LCD_CE = 0; // 51
; LCD_5110_PORT &= ~(0x01 << LCD_CE); // msp430
cbi 0x12,3
.dbline 273
;
; if (command == 0)
tst R18
brne L82
.dbline 276
; // PORTB &= ~LCD_DC ; // 传送命令
; // LCD_DC = 0;
; LCD_5110_PORT &= ~(0x01 << LCD_DC);
cbi 0x12,2
rjmp L83
L82:
.dbline 280
; else
; // PORTB |= LCD_DC ; // 传送数据
; // LCD_DC = 1;
; LCD_5110_PORT |= (0x01 << LCD_DC);
sbi 0x12,2
L83:
.dbline 281
; for(i=0;i<8;i++)
clr R20
rjmp L87
L84:
.dbline 282
; {
.dbline 283
; if(dat&0x80)
sbrs R16,7
rjmp L88
.dbline 285
; //SDIN = 1;
; LCD_5110_PORT |= (0x01 << LCD_DIN);
sbi 0x12,1
rjmp L89
L88:
.dbline 288
; else
; //SDIN = 0;
; LCD_5110_PORT &= ~(0x01 << LCD_DIN);
cbi 0x12,1
L89:
.dbline 290
cbi 0x12,0
.dbline 291
lsl R16
.dbline 293
sbi 0x12,0
.dbline 294
L85:
.dbline 281
inc R20
L87:
.dbline 281
cpi R20,8
brlo L84
.dbline 301
; //SCLK = 0;
; LCD_5110_PORT &= ~(0x01 << LCD_CLK);
; dat = dat << 1;
; //SCLK = 1;
; LCD_5110_PORT |= (0x01 << LCD_CLK);
; }
; // SPDR = data; // 传送数据到SPI寄存器
;
; //while ((SPSR & 0x80) == 0); // 等待数据传送完毕
;
; //PORTB |= LCD_CE ; // 关闭LCD
; // LCD_CE = 1;
; LCD_5110_PORT |= (0x01 << LCD_CE);
sbi 0x12,3
.dbline -2
.dbline 302
; }
L81:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r command 18 c
.dbsym r dat 16 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -