📄 main.s
字号:
;
; #define DISP_ON 0xAf
; #define DISP_OFF 0xAe
; #define COL_ADDRESS 0xB0//列首地址
; #define PAGE_ADDRESS 0xB0//业首地址
; //#define START_LINE 0xc0//启始行
;
; unsigned char col_address;//列地址
; unsigned char page_address;//页地址
;
; unsigned char lcd_ram_12864[8][128];//刷屏缓冲区8*128
;
;
;
;
;
;
;
;
; /***********************************************************************
; /*直接写入lcd12864数据区方式
; /**********************************************************************/
; void Hz_Display16x16_12864//指定位置显示汉字16*16
; (
; unsigned char y, //显示的Y坐标
; unsigned char x, //显示的X坐标
; unsigned char const *p
; )
; {
.dbline 79
; unsigned char j,i ;
; for(j=0;j<2;j++)
clr R20
xjmp L47
L44:
.dbline 80
; {
.dbline 81
; Write_Com_12864(PAGE_ADDRESS+y+j);//写入汉字显示地址
mov R16,R10
subi R16,80 ; addi 176
add R16,R20
xcall _Write_Com_12864
.dbline 82
; Write_Com_12864(0x10|((x&0xf0)>>4));
mov R16,R22
andi R16,240
swap R16
andi R16,#0x0F
ori R16,16
xcall _Write_Com_12864
.dbline 83
; Write_Com_12864(0x00|(x&0x0f));
mov R16,R22
andi R16,15
xcall _Write_Com_12864
.dbline 84
; for(i=0;i<16;i++)
clr R12
xjmp L51
L48:
.dbline 85
; {
.dbline 86
; Write_Data_12864(p[16*j+i]);
ldi R24,16
mul R24,R20
movw R30,R0
mov R2,R12
clr R3
add R30,R2
adc R31,R3
ldd R0,y+8
ldd R1,y+9
add R30,R0
adc R31,R1
elpm R16,Z
xcall _Write_Data_12864
.dbline 87
; }
L49:
.dbline 84
inc R12
L51:
.dbline 84
mov R24,R12
cpi R24,16
brlo L48
X8:
.dbline 88
; }
L45:
.dbline 79
inc R20
L47:
.dbline 79
cpi R20,2
brlo L44
X9:
.dbline -2
L43:
.dbline 0 ; func end
xjmp pop_xgsetF03C
.dbsym r j 20 c
.dbsym r i 12 c
.dbsym l p 8 pkc
.dbsym r x 22 c
.dbsym r y 10 c
.dbend
.dbfunc e Lcd_Ascii8x16_12864 _Lcd_Ascii8x16_12864 fV
; cow_num -> R22
; sizeb -> R12
; j -> R10
; k -> R20
; i -> R14
; p -> y+14
; x -> y+12
; y -> y+10
.even
_Lcd_Ascii8x16_12864::
xcall push_arg4
xcall push_xgsetF0FC
.dbline -1
.dbline 97
; }
;
; void Lcd_Ascii8x16_12864//指定位置显示字符8*16
; (
; unsigned char y, //显示的Y坐标
; unsigned char x, //显示的X坐标
; unsigned char *p//字符指针
; )
; {
.dbline 98
; unsigned char j=0,i=0,k=0;
clr R10
.dbline 98
clr R14
.dbline 98
clr R20
.dbline 99
; unsigned char sizeb=0,cow_num;
clr R12
xjmp L54
L53:
.dbline 101
; while(*(p+sizeb) != '\0')//字符串长度
; {
.dbline 102
; sizeb++;
inc R12
.dbline 103
; }
L54:
.dbline 100
mov R30,R12
clr R31
ldd R0,y+14
ldd R1,y+15
add R30,R0
adc R31,R1
ldd R2,z+0
tst R2
brne L53
X10:
.dbline 104
; cow_num = sizeb/16+2;
mov R22,R12
swap R22
andi R22,#0x0F
subi R22,254 ; addi 2
.dbline 105
; for(j=0;j<cow_num;j++)//字符高度为16 需要刷新2行
clr R10
xjmp L59
L56:
.dbline 106
; {
.dbline 107
; Write_Com_12864(PAGE_ADDRESS+y+j);//写入显示地址
ldd R16,y+10
subi R16,80 ; addi 176
add R16,R10
xcall _Write_Com_12864
.dbline 108
; Write_Com_12864(0x10|((x&0xf0)>>4));
ldd R16,y+12
andi R16,240
swap R16
andi R16,#0x0F
ori R16,16
xcall _Write_Com_12864
.dbline 109
; Write_Com_12864(0x00|(x&0x0f));
ldd R16,y+12
andi R16,15
xcall _Write_Com_12864
.dbline 110
; for(k=0;k<sizeb;k++)//纵向的总的长度
clr R20
xjmp L63
L60:
.dbline 111
; {
.dbline 112
; for(i=0;i<8;i++)//一个字符纵向8 次
clr R14
xjmp L67
L64:
.dbline 113
; {
.dbline 114
; Write_Data_12864(asciidot8x16[*(p+k)-0x20][8*j+i]);
mov R30,R20
clr R31
ldd R0,y+14
ldd R1,y+15
add R30,R0
adc R31,R1
ldd R2,z+0
ldi R24,16
mul R24,R2
movw R2,R0
ldi R24,<_asciidot8x16-512
ldi R25,>_asciidot8x16-512
add R2,R24
adc R3,R25
mov R4,R14
clr R5
mov R30,R10
clr R31
lsl R30
rol R31
lsl R30
rol R31
lsl R30
rol R31
add R30,R4
adc R31,R5
add R30,R2
adc R31,R3
elpm R16,Z
xcall _Write_Data_12864
.dbline 115
; }
L65:
.dbline 112
inc R14
L67:
.dbline 112
mov R24,R14
cpi R24,8
brlo L64
X11:
.dbline 116
; }
L61:
.dbline 110
inc R20
L63:
.dbline 110
cp R20,R12
brlo L60
X12:
.dbline 117
; }
L57:
.dbline 105
inc R10
L59:
.dbline 105
cp R10,R22
brsh X14
xjmp L56
X14:
X13:
.dbline -2
L52:
.dbline 0 ; func end
xcall pop_xgsetF0FC
adiw R28,4
ret
.dbsym r cow_num 22 c
.dbsym r sizeb 12 c
.dbsym r j 10 c
.dbsym r k 20 c
.dbsym r i 14 c
.dbsym l p 14 pc
.dbsym l x 12 c
.dbsym l y 10 c
.dbend
.dbfunc e Ram_12864 _Ram_12864 fV
; i -> R20
; j -> R22
.even
_Ram_12864::
st -y,R20
st -y,R22
.dbline -1
.dbline 127
; }
; /*************************************************************************/
;
;
;
; /*************************************************************************/
; /*写入单片机RAM缓冲区刷屏方式
; /*************************************************************************/
; void Ram_12864(void)//刷屏
; {
.dbline 129
; unsigned char i,j;
; for(i=0;i<8;i++)
clr R20
xjmp L73
L70:
.dbline 130
; {
.dbline 131
; Write_Com_12864(0X10);//SET COLUMN ADDRESS = 0X00 UPPER-4BIT
ldi R16,16
xcall _Write_Com_12864
.dbline 132
; Write_Com_12864(0X00);//SET COLUMN ADDRESS = 0X00 LOWER-4BIT
clr R16
xcall _Write_Com_12864
.dbline 133
; Write_Com_12864(0xB0|(i&0X0F));
mov R16,R20
andi R16,15
ori R16,176
xcall _Write_Com_12864
.dbline 134
; for(j=0;j<128;j++)
clr R22
xjmp L77
L74:
.dbline 135
; {
.dbline 136
; Write_Data_12864(lcd_ram_12864[i][j]);
ldi R24,128
mul R24,R20
movw R2,R0
ldi R24,<_lcd_ram_12864
ldi R25,>_lcd_ram_12864
add R2,R24
adc R3,R25
mov R30,R22
clr R31
add R30,R2
adc R31,R3
ldd R16,z+0
xcall _Write_Data_12864
.dbline 137
; }
L75:
.dbline 134
inc R22
L77:
.dbline 134
cpi R22,128
brlo L74
X15:
.dbline 139
;
; }
L71:
.dbline 129
inc R20
L73:
.dbline 129
cpi R20,8
brlo L70
X16:
.dbline -2
L69:
.dbline 0 ; func end
ld R22,y+
ld R20,y+
ret
.dbsym r i 20 c
.dbsym r j 22 c
.dbend
.dbfunc e Ram_Ascii8x16_12864 _Ram_Ascii8x16_12864 fV
; cow_num -> <dead>
; sizeb -> R10
; i -> R20
; j -> R14
; k -> R22
; p -> R12,R13
; x -> y+12
; y -> y+10
.even
_Ram_Ascii8x16_12864::
xcall push_arg4
xcall push_xgsetF0FC
ldd R12,y+14
ldd R13,y+15
.dbline -1
.dbline 148
; }
;
; void Ram_Ascii8x16_12864//指定位置显示字符串8*16 到ram
; (
; unsigned char y, //显示的Y坐标
; unsigned char x, //显示的X坐标
; unsigned char *p//字符指针
; )
; {
.dbline 149
; unsigned char j=0,i=0,k=0;
clr R14
.dbline 149
clr R20
.dbline 149
clr R22
.dbline 150
; unsigned char sizeb=0,cow_num;
clr R10
xjmp L80
L79:
.dbline 152
; while(*(p+sizeb) != '\0')//字符串长度
; {
.dbline 153
; sizeb++;
inc R10
.dbline 154
; }
L80:
.dbline 151
mov R30,R10
clr R31
add R30,R12
adc R31,R13
ldd R2,z+0
tst R2
brne L79
X17:
.dbline 156
; //cow_num = sizeb/16+2;
; for(i=0;i<2;i++)
clr R20
xjmp L85
L82:
.dbline 157
; {
.dbline 158
; for(j=0;j<sizeb;j++)
clr R14
xjmp L89
L86:
.dbline 159
; {
.dbline 160
; for(k=0;k<8;k++)
clr R22
xjmp L93
L90:
.dbline 161
; {
.dbline 162
; lcd_ram_12864[y+i][x+k+8*j] = asciidot8x16[*(p+j)-0x20][k+8*i];
ldd R2,y+10
add R2,R20
ldi R24,128
mul R24,R2
movw R2,R0
ldi R24,<_lcd_ram_12864
ldi R25,>_lcd_ram_12864
add R2,R24
adc R3,R25
mov R4,R22
clr R5
ldd R30,y+12
clr R31
add R30,R4
adc R31,R5
mov R4,R14
clr R5
lsl R4
rol R5
lsl R4
rol R5
lsl R4
rol R5
add R30,R4
adc R31,R5
add R30,R2
adc R31,R3
mov R26,R14
clr R27
add R26,R12
adc R27,R13
ld R2,x
ldi R24,16
mul R24,R2
movw R2,R0
ldi R24,<_asciidot8x16-512
ldi R25,>_asciidot8x16-512
add R2,R24
adc R3,R25
mov R4,R20
clr R5
lsl R4
rol R5
lsl R4
rol R5
lsl R4
rol R5
mov R26,R22
clr R27
add R26,R4
adc R27,R5
add R26,R2
adc R27,R3
st -y,R31
st -y,R30
movw R30,R26
elpm R2,Z
ld R30,y+
ld R31,y+
std z+0,R2
.dbline 163
; }
L91:
.dbline 160
inc R22
L93:
.dbline 160
cpi R22,8
brsh X21
xjmp L90
X21:
X18:
.dbline 164
; }
L87:
.dbline 158
inc R14
L89:
.dbline 158
cp R14,R10
brsh X22
xjmp L86
X22:
X19:
.dbline 165
; }
L83:
.dbline 156
inc R20
L85:
.dbline 156
cpi R20,2
brsh X23
xjmp L82
X23:
X20:
.dbline 166
; Ram_12864();
xcall _Ram_12864
.dbline -2
L78:
.dbline 0 ; func end
xcall pop_xgsetF0FC
adiw R28,4
ret
.dbsym l cow_num 1 c
.dbsym r sizeb 10 c
.dbsym r i 20 c
.dbsym r j 14 c
.dbsym r k 22 c
.dbsym r p 12 pc
.dbsym l x 12 c
.dbsym l y 10 c
.dbend
.dbfunc e Ram_Hz16x16_12864 _Ram_Hz16x16_12864 fV
; cow_num -> <dead>
; sizeb -> R12
; index_num -> R14
; lcd_p -> R22,R23
; i -> R10
; j -> y+0
; k -> R20
; p -> y+15
; x -> y+13
; y -> y+11
.even
_Ram_Hz16x16_12864::
xcall push_arg4
xcall push_xgsetF0FC
sbiw R28,1
.dbline -1
.dbline 175
; }
;
; void Ram_Hz16x16_12864//指定位置显示汉字16*16 到ram
; (
; unsigned char y, //显示的Y坐标
; unsigned char x, //显示的X坐标
; unsigned char *p//字符指针
; )
; {
.dbline 176
; unsigned char j=0,i=0,k=0;
clr R0
std y+0,R0
.dbline 176
clr R10
.dbline 176
clr R20
.dbline 177
; unsigned char sizeb=0,cow_num;
clr R12
.dbline 178
; unsigned char index_num =0;//汉字索引号
clr R14
xjmp L97
L96:
.dbline 181
; unsigned char const *lcd_p;
; while(*(p+sizeb) != '\0')//字符串长度
; {
.dbline 182
; sizeb++;
inc R12
.dbline 183
; }
L97:
.dbline 180
mov R30,R12
clr R31
ldd R0,y+15
ldd R1,y+16
add R30,R0
adc R31,R1
ldd R2,z+0
tst R2
brne L96
X24:
.dbline 184
; for(i=0;i<sizeb/2;i++)
clr R10
xjmp L102
L103:
.dbline 188
; {
; while((*(p+2*i) != GB_16[index_num].Index[0]) //查出索引号
; || (*(p+1+2*i) != GB_16[index_num].Index[1]))
; {
.dbline 189
; index_num ++;
inc R14
.dbline 190
; }
L104:
.dbline 186
mov R2,R10
clr R3
lsl R2
rol R3
movw R4,R2
ldi R24,34
mul R24,R14
movw R6,R0
ldi R24,<_GB_16
ldi R25,>_GB_16
movw R30,R6
add R30,R24
adc R31,R25
elpm R2,Z
movw R30,R4
ldd R0,y+15
ldd R1,y+16
add R30,R0
adc R31,R1
ldd R3,z+0
cp R3,R2
brne L103
X25:
ldi R24,<_GB_16+1
ldi R25,>_GB_16+1
movw R30,R6
add R30,R24
adc R31,R25
elpm R2,Z
movw R24,R0
adiw R24,1
movw R30,R4
add R30,R24
adc R31,R25
ldd R3,z+0
cp R3,R2
brne L103
X26:
.dbline 191
; lcd_p = GB_16[index_num].Msk;
ldi R24,34
mul R24,R14
movw R22,R0
ldi R24,<_GB_16+2
ldi R25,>_GB_16+2
add R22,R24
adc R23,R25
.dbline 192
; for(j=0;j<2;j++)//刷新先上后下
clr R0
std y+0,R0
xjmp L111
L108:
.dbline 193
; {
.dbline 194
; for(k=0;k<16;k++)
clr R20
xjmp L115
L112:
.dbline 195
; {
.dbline 196
; lcd_ram_12864[y+j][x+k+16*i] = *(lcd_p+k+16*j);
ldd R2,y+11
ldd R0,y+0
add R2,R0
ldi R24,128
mul R24,R2
movw R2,R0
ldi R24,<_lcd_ram_12864
ldi R25,>_lcd_ram_12864
add R2,R24
adc R3,R25
ldi R24,16
mul R24,R10
mov R4,R20
clr R5
ldd R30,y+13
clr R31
add R30,R4
adc R31,R5
add R30,R0
adc R31,R1
add R30,R2
adc R31,R3
mov R2,R4
clr R3
add R2,R22
adc R3,R23
ldd R0,y+0
mul R24,R0
movw R26,R0
add R26,R2
adc R27,R3
st -y,R31
st -y,R30
movw R30,R26
elpm R2,Z
ld R30,y+
ld R31,y+
std z+0,R2
.dbline 197
; }
L113:
.dbline 194
inc R20
L115:
.dbline 194
cpi R20,16
brlo L112
X27:
.dbline 198
; }
L109:
.dbline 192
ldd R0,y+0
inc R0
std y+0,R0
L111:
.dbline 192
ldd R24,y+0
cpi R24,2
brlo L108
X28:
.dbline 199
; }
L100:
.dbline 184
inc R10
L102:
.dbline 184
mov R2,R12
lsr R2
cp R10,R2
brsh X30
xjmp L104
X30:
X29:
.dbline 200
; Ram_12864();
xcall _Ram_12864
.dbline -2
L95:
.dbline 0 ; func end
adiw R28,1
xcall pop_xgsetF0FC
adiw R28,4
ret
.dbsym l cow_num 1 c
.dbsym r sizeb 12 c
.dbsym r index_num 14 c
.dbsym r lcd_p 22 pkc
.dbsym r i 10 c
.dbsym l j 0 c
.dbsym r k 20 c
.dbsym l p 15 pc
.dbsym l x 13 c
.dbsym l y 11 c
.dbend
.dbfunc e Reverse_16x16_12864 _Reverse_16x16_12864 fV
; i -> R20
; j -> R22
; y -> R10
.even
_Reverse_16x16_12864::
xcall push_xgsetF00C
mov R10,R16
.dbline -1
.dbline 204
; }
;
; void Reverse_16x16_12864(unsigned char y)//反显示一行
; {
.dbline 205
; unsigned char j=0,i=0;
clr R22
.dbline 205
clr R20
.dbline 206
; for(i=0;i<2;i++)
xjmp L120
L117:
.dbline 207
; {
.dbline 208
; for(j=0;j<128;j++)
clr R22
xjmp L124
L121:
.dbline 209
; {
.dbline 210
; lcd_ram_12864[y+i][j] = ~lcd_ram_12864[y+i][j];
mov R2,R10
add R2,R20
ldi R24,128
mul R24,R2
movw R2,R0
ldi R24,<_lcd_ram_12864
ldi R25,>_lcd_ram_12864
add R2,R24
adc R3,R25
mov R4,R22
clr R5
add R4,R2
adc R5,R3
movw R30,R4
ldd R2,z+0
com R2
std z+0,R2
.dbline 211
; }
L122:
.dbline 208
inc R22
L124:
.dbline 208
cpi R22,128
brlo L121
X31:
.dbline 212
; }
L118:
.dbline 206
inc R20
L120:
.dbline 206
cpi R20,2
brlo L117
X32:
.dbline 213
; Ram_12864();
xcall _Ram_12864
.dbline -2
L116:
.dbline 0 ; func en
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -