?? main.lst
字號:
+1 420 LOCAL next
+1 421 MOV A, xl
+1 422 JNZ next
+1 423 DEC xh
+1 424 next:
+1 425 DEC xl
+1 426 ENDM
+1 427
428 ;$include (Pointer.INC) ;通用指針處理
+1 429 ;*************************************************************************
+1 430 ;實用的8051單片機通用指針操作程序
+1 431 ;適用于Keil C51編譯器
+1 432 ;*************************************************************************
+1 433 ;關于通用指針:
+1 434 ; 在80C51中,數據可能存儲在不同的邏輯地址空間中,如idata、xdata、
+1 435 ; pdata、code等,如果要進行統一的操作,就必須引入通用指針的概念
+1 436 ;通用指針用3個字節表示,第1字節為指針類型,第2、3字節表示指針內容
+1 437 ; 類型 類型值 屬性 常用性
+1 438 ; idata 0x00 讀/寫 很常用
+1 439 ; xdata 0x01 讀/寫 常用
+1 440 ; pdata 0xFE 讀/寫 不常用
+1 441 ; code 0xFF 只讀 很常用
+1 442 ;通用指針的運算:
+1 443 ; 提取指針數據
+1 444 ; 保存指針數據
+1 445 ; 指針加常數
+1 446 ; 指針減常數
+1 447 ; 兩個指針相減
+1 448 ;通用指針用法:
+1 449 ; 對數據的存取操作:將通用指針復制到(R1,DPTR)中,再調用相應的子程序
+1 450 ; 對通用指針的算術運算:可通過雙字節算術運算來實現
+1 451 ;*************************************************************************
+1 452
+1 453
+1 454 ;*************************************************************************
A51 MACRO ASSEMBLER MAIN 06/23/2006 11:55:35 PAGE 8
+1 455 ;定義指針類型
+1 456 ;*************************************************************************
0000 +1 457 PtrTypeIDATA EQU 0x00
0001 +1 458 PtrTypeXDATA EQU 0x01
00FE +1 459 PtrTypePDATA EQU 0xFE
00FF +1 460 PtrTypeCODE EQU 0xFF
+1 461
+1 462
+1 463 ;*************************************************************************
+1 464 ;函數:BytePtrLD()
+1 465 ;功能:從字節型通用指針指向的存儲單元提取數據
+1 466 ;參數:(R1,DPTR)為通用指針
+1 467 ; R1:指針類型
+1 468 ; DPTR:指針內容
+1 469 ;返回:提取的數據保存在A中
+1 470 ;*************************************************************************
001E +1 471 BytePtrLD:
001E B90004 +1 472 CJNE R1, #PtrTypeIDATA, BytePtrLD_code
0021 A882 +1 473 MOV R0, DPL
0023 E6 +1 474 MOV A, @R0
0024 22 +1 475 RET
0025 +1 476 BytePtrLD_code:
0025 B9FF03 +1 477 CJNE R1, #PtrTypeCODE, BytePtrLD_xdata
0028 E4 +1 478 CLR A
0029 93 +1 479 MOVC A, @A+DPTR
002A 22 +1 480 RET
002B +1 481 BytePtrLD_xdata:
002B B90102 +1 482 CJNE R1, #PtrTypeXDATA, BytePtrLD_pdata
002E E0 +1 483 MOVX A, @DPTR
002F 22 +1 484 RET
0030 +1 485 BytePtrLD_pdata:
0030 B9FE03 +1 486 CJNE R1, #PtrTypePDATA, BytePtrLD_end
0033 A882 +1 487 MOV R0, DPL
0035 E2 +1 488 MOVX A, @R0
0036 +1 489 BytePtrLD_end:
0036 22 +1 490 RET
+1 491
+1 492
+1 493 ;*************************************************************************
+1 494 ;函數:BytePtrST()
+1 495 ;功能:保存數據到字節型通用指針指向的存儲單元
+1 496 ;參數:(R1,DPTR)為通用指針
+1 497 ; R1:指針類型
+1 498 ; DPTR:指針內容
+1 499 ; A:要保存的數據
+1 500 ;注意:不能是code型指針
+1 501 ;*************************************************************************
0037 +1 502 BytePtrST:
0037 B90004 +1 503 CJNE R1, #PtrTypeIDATA, BytePtrST_xdata
003A A882 +1 504 MOV R0, DPL
003C F6 +1 505 MOV @R0, A
003D 22 +1 506 RET
003E +1 507 BytePtrST_xdata:
003E B90102 +1 508 CJNE R1, #PtrTypeXDATA, BytePtrST_pdata
0041 F0 +1 509 MOVX @DPTR, A
0042 22 +1 510 RET
0043 +1 511 BytePtrST_pdata:
0043 B9FE03 +1 512 CJNE R1, #PtrTypePDATA, BytePtrST_end
0046 A882 +1 513 MOV R0, DPL
0048 F2 +1 514 MOVX @R0, A
0049 +1 515 BytePtrST_end:
0049 22 +1 516 RET
+1 517
518 ;$include (Disp.INC) ;數碼管顯示驅動程序
+1 519 ;*************************************************************************
+1 520 ; Disp.INC
A51 MACRO ASSEMBLER MAIN 06/23/2006 11:55:35 PAGE 9
+1 521 ; 數碼管掃描顯示驅動程序
+1 522 ;*************************************************************************
+1 523
+1 524
+1 525 ;*************************************************************************
+1 526 ;定義全局變量
+1 527 ;*************************************************************************
+1 528 ;定義顯示緩沖區(由定時中斷程序自動掃描)
0030 +1 529 DispBuf DATA GLOBAL_IRAM ;GLOBAL_IRAM的定義見main.asm
0038 +1 530 GLOBAL_IRAM SET GLOBAL_IRAM+8
+1 531 ;定義函數T1INTSVC()局部靜態變量
0038 +1 532 T1INTSVC_n DATA GLOBAL_IRAM
0039 +1 533 GLOBAL_IRAM SET GLOBAL_IRAM+1
+1 534
+1 535
+1 536 ;*************************************************************************
+1 537 ;函數:T1INTSVC()
+1 538 ;功能:定時器T1的中斷服務函數
+1 539 ;*************************************************************************
+1 540 ;void T1INTSVC() interrupt 3
004A +1 541 T1INTSVC:
+1 542 ;{
004A C0E0 +1 543 PUSH ACC
004C C0D0 +1 544 PUSH PSW
004E C000 +1 545 PUSH 0x00
0050 C083 +1 546 PUSH DPH
0052 C082 +1 547 PUSH DPL
+1 548 ; code unsigned char com[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
+1 549 ; static unsigned char n = 0;
+1 550 ; TR1 = 0;
+1 551 ; TH1 = 0xFC;
+1 552 ; TL1 = 0x66;
+1 553 ; TR1 = 1;
0054 C28E +1 554 CLR TR1
0056 758DFC +1 555 MOV TH1, #0xFC
0059 758B66 +1 556 MOV TL1, #0x66
005C D28E +1 557 SETB TR1
+1 558 ; P1 = 0xFF; //暫停顯示
005E 7590FF +1 559 MOV P1, #0xFF
+1 560 ; XBYTE[0xE800] = ~DispBuf[n]; //更新掃描數據
0061 7430 +1 561 MOV A, #DispBuf
0063 2538 +1 562 ADD A, T1INTSVC_n
0065 F8 +1 563 MOV R0, A
0066 E6 +1 564 MOV A, @R0
0067 F4 +1 565 CPL A
0068 90E800 +1 566 MOV DPTR, #0xE800
006B F0 +1 567 MOVX @DPTR, A
+1 568 ; P1 = ~com[n]; //重新顯示
006C E538 +1 569 MOV A, T1INTSVC_n
006E 900085 +1 570 MOV DPTR, #T1INTSVC_com
0071 93 +1 571 MOVC A, @A+DPTR
0072 F4 +1 572 CPL A
0073 F590 +1 573 MOV P1, A
+1 574 ; n++;
+1 575 ; n &= 0x07;
0075 0538 +1 576 INC T1INTSVC_n
0077 533807 +1 577 ANL T1INTSVC_n, #0x07
+1 578 ;}
007A D082 +1 579 POP DPL
007C D083 +1 580 POP DPH
007E D000 +1 581 POP 0x00
0080 D0D0 +1 582 POP PSW
0082 D0E0 +1 583 POP ACC
0084 32 +1 584 RETI
0085 +1 585 T1INTSVC_com:
0085 01020408 +1 586 DB 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80
A51 MACRO ASSEMBLER MAIN 06/23/2006 11:55:35 PAGE 10
0089 10204080
+1 587
+1 588
+1 589 ;*************************************************************************
+1 590 ;函數:DispClear()
+1 591 ;功能:清除數碼管的所有顯示
+1 592 ;*************************************************************************
+1 593 ;void DispClear()
008D +1 594 DispClear:
+1 595 ;{
+1 596 ; unsigned char i;
+1 597 ; for ( i=0; i<8; i++ )
008D 7830 +1 598 MOV R0, #DispBuf
008F 7908 +1 599 MOV R1, #8
0091 E4 +1 600 CLR A
0092 +1 601 DispClear_for:
+1 602 ; {
+1 603 ; DispBuf[i] = 0x00;
0092 F6 +1 604 MOV @R0, A
0093 08 +1 605 INC R0
+1 606 ; }
0094 D9FC +1 607 DJNZ R1, DispClear_for
+1 608 ;}
0096 22 +1 609 RET
+1 610
+1 611
+1 612 ;*************************************************************************
+1 613 ;函數:DispChar()
+1 614 ;功能:在數碼管上顯示字符
+1 615 ;參數:
+1 616 ; x:數碼管的坐標位置(0~7)
+1 617 ; c:要顯示的字符(僅限十進制數字和減號)
+1 618 ;*************************************************************************
+1 619 ;void DispChar(unsigned char x, unsigned char c)
+1 620 ;x = R7
+1 621 ;c = R6
0097 +1 622 DispChar:
+1 623 ;{
+1 624 ; //0123456789的數碼管字型數據
+1 625 ; code unsigned char Tab[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
+1 626 ; x &= 0x07;
+1 627 ; x = 7 - x;
0097 7407 +1 628 MOV A, #7
0099 5207 +1 629 ANL 0x07, A
009B C3 +1 630 CLR C
009C 9F +1 631 SUBB A, R7
009D FF +1 632 MOV R7, A
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -