📄 课程设计.s
字号:
.dbsym l data 6 i
.dbsym l yy 4 i
.dbsym r xx 20 i
.dbsym r type 22 i
.dbend
.dbfunc e asc_tran _asc_tran fV
; asc_p -> R20,R21
; y -> R22
; x -> R10
.even
_asc_tran::
xcall push_gset3
mov R22,R18
mov R10,R16
ldd R20,y+6
ldd R21,y+7
.dbline -1
.dbline 266
; }
; /*********************************************************************/
; /***********************传送ASCII字母到LCD ********************** */
; /*************************** x:0x00~0x0f y:0~64 显示8*16个字符 */
; void asc_tran(unsigned char x,unsigned char y,unsigned char *asc_p)
; {
.dbline 267
; x+=4;
mov R24,R10
subi R24,252 ; addi 4
mov R10,R24
xjmp L37
L36:
.dbline 269
; while((*asc_p)!=0)
; {
.dbline 270
; ocmj_write(0xf1);
ldi R16,241
xcall _ocmj_write
.dbline 271
; ocmj_write(x);
mov R16,R10
xcall _ocmj_write
.dbline 272
; ocmj_write(y);
mov R16,R22
xcall _ocmj_write
.dbline 273
; ocmj_write(*asc_p);
movw R30,R20
ldd R16,z+0
xcall _ocmj_write
.dbline 274
; asc_p++;
subi R20,255 ; offset = 1
sbci R21,255
.dbline 275
; if (x<0x13)
mov R24,R10
cpi R24,19
brsh L39
.dbline 276
; x++;
inc R10
xjmp L40
L39:
.dbline 278
; else
; {
.dbline 279
; x=0x04;
ldi R24,4
mov R10,R24
.dbline 280
; y+=8;
subi R22,248 ; addi 8
.dbline 281
; }
L40:
.dbline 282
L37:
.dbline 268
movw R30,R20
ldd R2,z+0
tst R2
brne L36
.dbline -2
L35:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r asc_p 20 pc
.dbsym r y 22 c
.dbsym r x 10 c
.dbend
.dbfunc e write_hazi _write_hazi fV
; data2 -> y+6
; data1 -> y+4
; yy -> R20,R21
; xx -> R22,R23
.even
_write_hazi::
xcall push_gset2
movw R20,R18
movw R22,R16
.dbline -1
.dbline 289
; }
; }
;
; /**********************************************/
; /* 写汉字初始化 *///找代码
; /**********************************************/
; void write_hazi(unsigned xx,unsigned yy,unsigned data1,unsigned data2)
; {
.dbline 290
; ocmj_write(0xf0);//表示汉字//f0表示特殊符号,如&,以下
ldi R16,240
xcall _ocmj_write
.dbline 291
; ocmj_write(xx);
mov R16,R22
xcall _ocmj_write
.dbline 292
; ocmj_write(yy);
mov R16,R20
xcall _ocmj_write
.dbline 293
; ocmj_write(data1);
ldd R16,y+4
ldd R17,y+5
xcall _ocmj_write
.dbline 294
; ocmj_write(data2);
ldd R16,y+6
ldd R17,y+7
xcall _ocmj_write
.dbline -2
L41:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym l data2 6 i
.dbsym l data1 4 i
.dbsym r yy 20 i
.dbsym r xx 22 i
.dbend
.dbfunc e hz_tran _hz_tran fV
; hz_p -> R20,R21
; y -> R22
; x -> R10
.even
_hz_tran::
xcall push_gset3
mov R22,R18
mov R10,R16
ldd R20,y+6
ldd R21,y+7
.dbline -1
.dbline 301
; }
;
; /* ***********************************************************
; 传送LCD内部汉字数据到LCD
; /* ************************** x:0x00~0x07 y:0x00~0x03********/
; void hz_tran(unsigned char x,unsigned char y,unsigned char *hz_p)
; {
.dbline 302
; x+=2;
mov R24,R10
subi R24,254 ; addi 2
mov R10,R24
xjmp L44
L43:
.dbline 304
; while((*hz_p)!=0)
; {
.dbline 305
; ocmj_write(0xf0);
ldi R16,240
xcall _ocmj_write
.dbline 306
; ocmj_write(x);
mov R16,R10
xcall _ocmj_write
.dbline 307
; ocmj_write(y);
mov R16,R22
xcall _ocmj_write
.dbline 308
; ocmj_write(*hz_p-0xa0);
movw R30,R20
ldd R16,z+0
subi R16,160
xcall _ocmj_write
.dbline 309
; hz_p++;
subi R20,255 ; offset = 1
sbci R21,255
.dbline 310
; ocmj_write(*hz_p-0xa0);
movw R30,R20
ldd R16,z+0
subi R16,160
xcall _ocmj_write
.dbline 311
; hz_p++;
subi R20,255 ; offset = 1
sbci R21,255
.dbline 312
; if(x<0x09)
mov R24,R10
cpi R24,9
brsh L46
.dbline 313
; x++;
inc R10
xjmp L47
L46:
.dbline 315
; else
; {
.dbline 316
; x=0x02;
ldi R24,2
mov R10,R24
.dbline 317
; y++;
inc R22
.dbline 318
; }
L47:
.dbline 319
L44:
.dbline 303
movw R30,R20
ldd R2,z+0
tst R2
brne L43
.dbline -2
L42:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r hz_p 20 pc
.dbsym r y 22 c
.dbsym r x 10 c
.dbend
.dbfunc e up _up fV
.even
_up::
.dbline -1
.dbline 326
; }
; }
; /* ***********************************************************
; 移动函数
; /* **********************************************************/
;
; void up(void) //上移
; {
.dbline 327
; ocmj_write(0xf5);
ldi R16,245
xcall _ocmj_write
.dbline -2
L48:
.dbline 0 ; func end
ret
.dbend
.dbfunc e down _down fV
.even
_down::
.dbline -1
.dbline 331
; }
;
; void down(void) //下移
; {
.dbline 332
; ocmj_write(0xf6);
ldi R16,246
xcall _ocmj_write
.dbline -2
L49:
.dbline 0 ; func end
ret
.dbend
.dbfunc e left _left fV
.even
_left::
.dbline -1
.dbline 336
; }
;
; void left(void) //左移
; {
.dbline 337
; ocmj_write(0xf7);
ldi R16,247
xcall _ocmj_write
.dbline -2
L50:
.dbline 0 ; func end
ret
.dbend
.dbfunc e right _right fV
.even
_right::
.dbline -1
.dbline 341
; }
;
; void right(void) //右移
; {
.dbline 342
; ocmj_write(0xf8);
ldi R16,248
xcall _ocmj_write
.dbline -2
L51:
.dbline 0 ; func end
ret
.dbend
.dbfunc e fangbai _fangbai fV
.even
_fangbai::
.dbline -1
.dbline 345
; }
; void fangbai()
; {
.dbline 346
; ocmj_write(0xfa);
ldi R16,250
xcall _ocmj_write
.dbline -2
L52:
.dbline 0 ; func end
ret
.dbend
.dbfunc e mouse _mouse fV
.even
_mouse::
.dbline -1
.dbline 350
;
; }
; void mouse (void)
; {
.dbline 351
; ocmj_write(0xFB);
ldi R16,251
xcall _ocmj_write
.dbline 352
; ocmj_write(0x07);
ldi R16,7
xcall _ocmj_write
.dbline -2
L53:
.dbline 0 ; func end
ret
.dbend
.dbfunc e pset _pset fV
; y -> R20
; x -> R22
.even
_pset::
xcall push_gset2
mov R20,R18
mov R22,R16
.dbline -1
.dbline 359
; }
;
; /* ***********************************************************
; 画点函数
; /* **********************************************************/
; void pset(unsigned char x,unsigned char y)
; {
.dbline 360
; ocmj_write(0xf2);
ldi R16,242
xcall _ocmj_write
.dbline 361
; ocmj_write(x+32);
mov R16,R22
subi R16,224 ; addi 32
xcall _ocmj_write
.dbline 362
; ocmj_write(y);
mov R16,R20
xcall _ocmj_write
.dbline -2
L54:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r y 20 c
.dbsym r x 22 c
.dbend
.dbfunc e line _line fV
; incy -> R20
; incx -> R22
; delta_y -> R10,R11
; delta_x -> y+4
; t -> R14
; yerr -> y+2
; xerr -> y+0
; distance -> R12,R13
; y2 -> y+22
; x2 -> y+20
; y1 -> y+18
; x1 -> y+16
.even
_line::
xcall push_arg4
xcall push_gset5
sbiw R28,6
.dbline -1
.dbline 369
; }
;
; /* ***********************************************************
; 画线函数
; /* **********************************************************/
; void line(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2)
; {
.dbline 371
; unsigned char t;
; signed int xerr=0,yerr=0;
clr R0
clr R1
std y+1,R1
std y+0,R0
.dbline 371
std y+3,R1
std y+2,R0
.dbline 376
; signed int delta_x,delta_y,distance;
; signed char incx,incy;
;
; /* 计算两个方向的长度 */
; delta_x=x2-x1;
ldd R2,y+16
clr R3
ldd R4,y+20
clr R5
sub R4,R2
sbc R5,R3
std y+5,R5
std y+4,R4
.dbline 377
; delta_y=y2-y1;
ldd R2,y+18
clr R3
ldd R10,y+22
clr R11
sub R10,R2
sbc R11,R3
.dbline 380
;
; /* 计算增量的方向,增量为"0"表示为垂直或水平线 */
; if(delta_x>0)
clr R2
movw R0,R4
cp R2,R4
cpc R3,R5
brge L56
.dbline 381
; incx=1;
ldi R22,1
xjmp L57
L56:
.dbline 383
; else
; {
.dbline 384
; if( delta_x==0 )
ldd R0,y+4
ldd R1,y+5
tst R0
brne L58
tst R1
brne L58
X0:
.dbline 385
; incx=0;
clr R22
xjmp L59
L58:
.dbline 387
; else
; {
.dbline 388
; incx=-1;
ldi R22,255
.dbline 389
; delta_x =-delta_x;
ldd R24,y+4
ldd R25,y+5
com R24
com R25
subi R24,0xFF
sbci R25,0xFF
std y+5,R25
std y+4,R24
.dbline 390
; }
L59:
.dbline 391
; }
L57:
.dbline 392
; if(delta_y>0)
clr R2
clr R3
cp R2,R10
cpc R3,R11
brge L60
.dbline 393
; incy=1;
ldi R20,1
xjmp L61
L60:
.dbline 395
; else
; {
.dbline 396
; if( delta_y==0 )
tst R10
brne L62
tst R11
brne L62
X1:
.dbline 397
; incy=0;
clr R20
xjmp L63
L62:
.dbline 399
; else
; {
.dbline 400
; incy=-1;
ldi R20,255
.dbline 401
; delta_y =-delta_y;
movw R24,R10
com R24
com R25
subi R24,0xFF
sbci R25,0xFF
movw R10,R24
.dbline 402
; }
L63:
.dbline 403
; }
L61:
.dbline 405
; /* 确定画线的范围 */
; if( delta_x > delta_y ) distance=delta_x;
ldd R0,y+4
ldd R1,y+5
cp R10,R0
cpc R11,R1
brge L64
.dbline 405
movw R12,R0
xjmp L65
L64:
.dbline 406
; else distance=delta_y;
movw R12,R10
L65:
.dbline 409
;
; /* 画线 */
; for(t=0;t<= distance+1;t++)
clr R14
xjmp L69
L66:
.dbline 410
; {
.dbline 411
; ocmj_write(0xf2);
ldi R16,242
xcall _ocmj_write
.dbline 412
; ocmj_write(x1+32);
ldd R16,y+16
subi R16,224 ; addi 32
xcall _ocmj_write
.dbline 413
; ocmj_write(y1);
ldd R16,y+18
xcall _ocmj_write
.dbline 414
; xerr += delta_x ;
ldd R0,y+0
ldd R1,y+1
ldd R16,y+4
ldd R17,y+5
add R0,R16
adc R1,R17
std y+1,R1
std y+0,R0
.dbline 415
; yerr += delta_y ;
ldd R0,y+2
ldd R1,y+3
add R0,R10
adc R1,R11
std y+3,R1
std y+2,R0
.dbline 416
; if( xerr > distance )
ldd R0,y+0
ldd R1,y+1
cp R12,R0
cpc R13,R1
brge L70
.dbline 417
; {
.dbline 418
; xerr-=distance;
sub R0,R12
sbc R1,R13
std y+1,R1
std y+0,R0
.dbline 419
; x1+=incx;
ldd R0,y+16
add R0,R22
std y+16,R0
.dbline 420
; }
L70:
.dbline 421
; if( yerr > distance )
ldd R0,y+2
ldd R1,y+3
cp R12,R0
cpc R13,R1
brge L72
.dbline 422
; {
.dbline 423
; yerr-=distance;
sub R0,R12
sbc R1,R13
std y+3,R1
std y+2,R0
.dbline 424
; y1+=incy;
ldd R0,y+18
add R0,R20
std y+18,R0
.dbline 425
; }
L72:
.dbline 426
L67:
.dbline 409
inc R14
L69:
.dbline 409
movw R24,R12
adiw R24,1
mov R2,R14
clr R3
cp R24,R2
cpc R25,R3
brge L66
.dbline -2
L55:
adiw R28,6
xcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
.dbsym r incy 20 C
.dbsym r incx 22 C
.dbsym r delta_y 10 I
.dbsym l delta_x 4 I
.dbsym r t 14 c
.dbsym l yerr 2 I
.dbsym l xerr 0 I
.dbsym r distance 12 I
.dbsym l y2 22 c
.dbsym l x2 20 c
.dbsym l y1 18 c
.dbsym l x1 16 c
.dbend
.dbfunc e scan_key _scan_key fc
; i -> R22
.even
_scan_key::
xcall push_gset2
.dbline -1
.dbline 433
; }
; }
;
; /**********************************************/
; /* 键盘子程序 */
; /**********************************************/
; unsigned char scan_key(void)
; {
.dbline 435
; unsigned char i;
; DDRB=0x0f; //列接低位,输出
ldi R24,15
out 0x17,R24
.dbline 436
; PORTB=0xff;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -