410 likes | 625 Views
Keil _51 晶片程式設計. China Institute of Technology Edited by Associated Professor Pu-Sheng Tsai. 程式記憶體 (ROM). 存放本文程式的機械碼 (machine code) 存放程式中所需要的表格資料 MOV A,#_ 07H _ (OFFSET) MOV DPTR,#SEG7_TABLE MOVC A ,@A+DPTR MOV DPTR,#0FFE0H MOVX @DPTR,A SEG7_TABLE:
E N D
Keil_51 晶片程式設計 China Institute of Technology Edited by Associated Professor Pu-Sheng Tsai
程式記憶體 (ROM) • 存放本文程式的機械碼(machine code) • 存放程式中所需要的表格資料 MOV A,#_07H_ (OFFSET) MOV DPTR,#SEG7_TABLE MOVCA,@A+DPTR MOV DPTR,#0FFE0H MOVX@DPTR,A SEG7_TABLE: DB: C0H,F9H,A4H,B0H,99H,92H,82H,F8H, DB: 80H,90H,88H,83H,C6H,A1H,86H,8EH
資料記憶體 (RAM) X X O X O X O X O X
資料記憶體 (RAM) • 30H ~ 7FH: 一般 RAM 區間 • Addressing: 針對 Memory 之存取方式 • Direct Addressing : MOV 30H, #30H • Indirect Addressing: MOV R0,#30H MOV @R0,#30H RAM : 1DH
程式模組: 將30H~7FH的資料記憶體依次寫入#AAH資料 MOV A, #0AAH MOV R0 , #30H (Index) MOV R1 , #80 (Counter) L1: MOV @R0, A INC R0 DJNZ R1 , L1 RET
MCS_51 時脈分析 • 振盪週期: 外部振盪器 2MHz ~ 16MHz 一個基頻時脈為一個相位 • 狀態週期: 兩個相位(P1,P2)構成一個狀態 • 機械週期: 六個狀態(S1~S6)構成一個機械週期 • 指令週期: 每執行一條指令所需機械週期 State Cycle, Machine Cycle, Instruction Cycle
DELAY_0.1MS: • Function: delay R4*0.1ms time • Input: R4 delay_01ms: MOV R3,#48 (1) NOP DJNZ R3,$ (2) DJNZ R4,delay_01ms(2) RET(1) (1+1+2*48+2)*R4=100us*R4=0.1ms*R4
DELAY_10MS: • Function: delay R5*10ms time • Input: R5 delay_10ms: MOV R4,#100 (1) delay1: MOV R3,#48 (1) NOP DJNZ R3,$ (2) DJNZ R4,delay1(2) DJNZ R5, delay_10ms RET (1+(1+1+2*48+2)*100+2)*R5 =10ms* R5
FLOOK_TABLE: • Function: forward look table (index->code) • Input: R1……index, DPTR……表格資料 • Output: R2……code Flook_table: MOV A,R1 MOVC A,@A+DPTR MOV R2,A RET
BLOOK_TABLE: • FUNCTION: BACKWARD LOOK TABLE (CODE -> INDEX) • INPUT : R2 -> CODE, • DPTR -> TABLE, • R3 -> TABLE SIZE • OUTPUT : R1 -> INDEX; • BLOOK_TABLE: • MOV R1,#00H • BL1: • MOV A,R1 • MOVC A,@A+DPTR
BLOOK_TABLE(Coun.) • XRL A,R2 • JNZ BL2 • JMP BL3 • BL2: • INC R1 • DJNZ R3,BL1 • MOV R1,#0FFH • BL3: • RET • END
2.8模組之設計(I) EXTRN CODE(YYY) (呼叫YYY外部模組) PUBLIC XXX(宣告XXX為可供外部呼叫之模組) ROM SEGMENT CODE (共享 ROM空間) RSEG ROM XXX: (模組名稱標記) : CALL YYY : RET (模組程式結束用 RET) END (宣告結束)
2.8主程式之設計(II) EXTRN CODE(YYY) ;RAM DEFINE LED_BUFFER EQU 30H LED_INDEX EQU 38H • ORG 00H JMP START START: LCALL YYY : JMP $ END
MCS_51 輸入/輸出埠(1) • 雙向性 • 每條 I/O 線均可獨立設定為輸入或輸出 • PORT0(80H): 真正雙向I/O埠, MOV PO,#FFH 具有高阻抗浮接特性, 可共用Bus(?) 擴充外部記憶體時, 除了送出低八位元位 址外,還做為資料匯流排使用 • PORT(90H):擬似雙向I/O埠,作為I/O線使用
MCS_51 輸入/輸出埠(2) • PORT2(A0H): 除了作為一般I/O線外, 擴充外部記憶體時, 可作為高八位元位址線 • PORT3(B0H): 每條I/O線可作多工切換 P3.0:RXD, P3.1:TXD, P3.2: P3.3: , P3.4: T0, P3.5: T1 P3.6: , P3.7:
TEST.ASM: 設計一段程式將資料記憶體30H~7FH內容均設為 #30H~7FH. 每隔 1S由 P1送出七段顯示碼(0~F) • ORG 00H • ACALL INIT • L2: • MOV R6,#16 • MOV R1,#00H • MOV DPTR,#SEG_TABLE • L1: • ACALL FLOOK_TABLE • MOV P2,R2 • MOV R5,#100 • ACALL DELAY_10MS • INC R1 • DJNZ R6,L1 • JMP L2
2.7 Home Work (I): Library Form • 針對課堂上所設計的 BASIC.ASM 程式,利用Keil 整合環境進行模擬, 並回答以下幾個問題 • 這個程式佔有多大記憶空間? • Seg7_table表格的起始位址為何? • 三個副程式, FLOOK_TABLE, DELAY_01MS, INIT_RAM 起始位址為何? 分別佔有多大記憶空間? • 程式執行完畢後, DPTR暫存器的內容為何?
ANS FOR HW(1) • DELAY_10MS: • FLOOK_TABLE : • INIT_RAM : • Main Prog. :
2.7 Home Work (II) • 驗證 Text Book中常用模組, 是否正確? 5. ADD_16BIT, 6. SUB_16BIT, 7. MUL_16BIT, 8. DIV_16BIT, 10. HEX_BCD16 11. BCD_HEX16
步驟: • (A) : 參考 Text Book Page 174~196 • (B) : 任意選擇二個10進位的無號數,透過 BCD_HEX16 模組轉換成二個16進位的無號數。251, 214 => FBH, D6H • (C) : 將兩個16進位的無號數,透過 ADD_16BIT、SUB_16BIT、MUL_16BIT、DIV_16BIT 等運算。 • (D) : 最後將 (C) 所得到的結果,透過 HEX_BCD16 模組轉換為 10 進位的答案,並與手算結果比較是否相同 ? • (E) : 至少選擇兩組數據,針對加、減、乘、除作驗証。
2.7 Home Work (III) • V1=[10,12,2,13,4,5,2] • V2=[27,6,14,24,13,12,3] • 為兩個 Vector, • 求 V=V1。V2 • 作業信箱: tsaipusheng@gmail.com • 繳交期限: 2007/10/31. PM 12:00 • 主旨: 96 Keil_51 游嘉輝 96133004
ADD_16BIT • (7FH) (7EH) • + (7DH) (7CH) INPUT • ------------------------------------------------- • (7BH) (7AH) OUTPUT • MOV 7FH,#00H • MOV 7EH,#FBH, 16BIT 被加數 • MOV 7DH,#00H • MOV 7CH,#D6H, 16BIT 加數 • CALL ADD_16BIT • (7BH) = 01H, (7AH)= D1H
BCD_HEX • (7DH) (7CH) (7BH) INPUT • (7FH) (7EH) OUTPUT • MOV 7DH,#06H • MOV 7CH,#55H • MOV 7BH,#36H • CALL BCD_HEX • (7FH)=FFH, (7EH)=FFH
2.7 Home Work (IV) : 程式測試 • 驗證 Text Book中常用模組, 是否正確? 至少舉兩個數值範例作驗證. 模組 1:ADD_16BIT, 模組 2:SUB_16BIT, (7FH)(7EH) (7FH)(7EH) + (7DH)(7CH) - (7DH)(7CH) (7BH)(7AH) (7BH)(7AH)
2.7 Home Work (IV) : 程式測試 模組 3: MUL_16BIT, (7FH)(7EH) * (7DH)(7CH) (7BH) (7AH)(79H)(78H) 模組 4: DIV_16BIT, (7FH)(7EH) / (7DH)(7CH) = (7BH) (7AH) ….. (79H)(78H)
2.7 Home Work (IV) : 程式測試 • 模組 五: HEX_BCD16, INPUT : (7FH)(7EH) – HEX CODE OUTPUT: (7DH)(7CH)(7BH) – BCD CODE • 模組 六: BCD_HEX16, INPUT: (7DH)(7CH)(7BH) – BCD CODE OUTPUT : (7FH)(7EH) – HEX CODE
Note: MCS_51 Family • Mask ROM : 8051 (原廠作 mask) • PROM(OPT): 87C51 • EPROM : 8751(電子12V寫入, 紫外線清除) • EEPROM : 8951 (電子12V寫入,電子清除) • Flash ROM : 89S51 (電子5V寫入,電子清除) • ROMless: 8031 (cheap) • Atmel: ISP(In System Programming) 必需具備 Flash ROM, 以 Batch 型式燒錄, 燒錄速度較 EEPROM 快
Note: MCS_51 搬移指令 • MOV : 搬移 RAM 內資料 • MOVC : 搬移 ROM 內資料 • MOVX : 搬移外部記憶體內資料 • 89S51 : 4K, 89S52 : 8K (ROM) • Addressing :0000H ~ 0FFFH (4K) • 0000H ~ 1FFFH (8K) • 0000H ~ FFFFH (64K)
Note: • MCS_51 內所有暫存器均為八位元,除了 DPTR 為 16 位元, 存放表格名稱. • MCS_51 利用 P0 與 P2 作外部程式擴充, 最多可以擴充至 64K, (0000H~FFFFH) • (O) MOV A,#100 (10進位資料) • (X) MOV R1,#100H (16進位資料) • (O) MOV 30H,#10101010B (2進位) • 89S51 : 128 Bytes (RAM, 00H~7FH)
Note: RAM Structure • 00H ~ 1FH : Register (暫存器) Area • 20H ~ 2FH : 可位元定址區 Bit Addressing • 30H ~ 7FH : Memory (記憶體) • 80H ~ FFH : Special Function Register • RS1 RS0 Register Select Name • 0 0 RB0 R0~R7 • 0 1 RB1 R0~R7 • 1 0 RB2 R0~R7 • 1 1 RB3 R0~R7
Note: Instruction Set • setb bit ; bit=1 • clr bit ; bit=0 • RBn Register Bank n • SETB RS1 • CLR RS0 • MOV R6,#45H • JB BIT,LOOP1; BIT=1 JMP LOOP1 • JNB BIT,LOOP2; BIT=0 JMP LOOP2 RAM: 16H
Note: • Indirect Addressing : R0, R1 • MCS_51外部振盪器採用 12MHz, osc. cycle= 1/12M = 1/12 us state cycle=1/6M = 1/6 us machine cycle=1/1M = 1us MUL AB, DIV AB 所需時間均為 = 4us instruction cycle = 4us
Note: • Keil : MODULE : ASM : BASIC • KEY • TLCD • ADC • UART • C • SYSTEM : ASM : BASIC • KEY • TLCD • ADC • C
Note: • MODULE: 模組程式本身無法執行, 祇能宣告成被主程式呼叫之用(彈性) • SYSTEM :系統程式可以被 Compiler and Link 成 *.HEX 檔, 且可以被燒錄至晶片執行 • Delay 26ms (Input Reg. = R4) MAX:25.5ms • MOV R4, #260 • CALL DELAY_01MS
Note: • Delay 1s (Input Reg. = R5) • MAX:2.55s • MOV R5, #100 • CALL DELAY_10MS • 共陽極七段顯示碼 • 0:C0H, 1:F9H, 2:A4H, 3:B0H, 4:99H, 5:92H, 6:82H, 7:F8H, 8:80H, 9:90H
Note: FLOOK_TABLE 用法 MOV R1,#9 MOV DPTR,#SEG7_TABLE CALL FLOOK_TABLE R2=99H SEG7_TABLE: DB 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H,0F8H, 80H, 90H • PUBLIC, EXTRN, END, EQU 為假指令, 在組譯過程中只負責宣告, 無法產生機械碼(machine code)
Note: • ISP-30A 燒錄程式 • ek51v701 : Keil_51 2K 試用版 • Cybernox. Keil. C51. v8.01 正常版
3 25 76 • + 2 96 45 • 6 22 21 BCD_HEX16 -> ADD_16BIT HEX_BCD16 MOV 7DH,#03H MOV 7CH,#25H MOV 7BH,#76H CALL BCD_HEX16 MOV 79H,7FH MOV 78H,7EH
MOV 7DH,#02H MOV 7CH,#96H MOV 7BH,#45H CALL BCD_HEX16 MOV 7DH,79H MOV 7CH,78H CALL ADD_16BIT MOV 7FH,7BH MOV 7EH,7AH CALL HEX_BCD16 JMP $ ANS: 7DH=06H, 7CH=22H, 7BH=21H