指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)_第1頁(yè)
指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)_第2頁(yè)
指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)_第3頁(yè)
指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)_第4頁(yè)
指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩63頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第四章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)任課教師:劉忠國(guó)山東大學(xué)課程中心網(wǎng)站:/G2S/Template/View.aspx?action=view&courseType=0&courseId=5819宏晶官方網(wǎng)站:/ stc15系列單片機(jī)器件手冊(cè)等 keil vision軟件下載及指導(dǎo)手冊(cè)(Helpvision Help) /STC15系列單片機(jī)器件手冊(cè)-1473頁(yè) (2015/6/29更新)2第四章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì) 本章學(xué)習(xí)目標(biāo)了解助記符、指令格式掌握單片機(jī)尋址方式 掌握單片機(jī)指令系統(tǒng)掌握單片機(jī)匯編語(yǔ)言程序設(shè)計(jì)及開(kāi)發(fā)環(huán)境參考資料: keil Vision軟件的幫助文件300:07:1

2、4第四章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)語(yǔ)言4.1 編程語(yǔ)言簡(jiǎn)介 4.2 指令和偽指令 4.3 匯編語(yǔ)言程序調(diào)試4.4 利用STC-ISP工具將程序下載到單片機(jī)中驗(yàn)證程序4.5各類(lèi)指令詳解4.5.1 數(shù)據(jù)傳送類(lèi)指令4.5.2 邏輯操作類(lèi)指令4.5.3 算術(shù)運(yùn)算類(lèi)指令4.5.4 位操作指令4.5.5 控制類(lèi)轉(zhuǎn)移指令4.6 匯編語(yǔ)言程序設(shè)計(jì)4.6.1 匯編語(yǔ)言程序設(shè)計(jì)的一般步驟和基本框架4.6.2 匯編語(yǔ)言程序設(shè)計(jì)舉例400:07:14作業(yè)4.6 匯編語(yǔ)言程序設(shè)計(jì)匯編語(yǔ)言程序設(shè)計(jì)的一般步驟是:分析課題,確定算法或解題思路。根據(jù)算法或思路畫(huà)出流程圖。分配資源: 內(nèi)部RAM、定時(shí)器、中斷等資源的分配。根據(jù)

3、流程圖編寫(xiě)程序。上機(jī)調(diào)試源程序,進(jìn)而確定源程序。對(duì)復(fù)雜的程序可按功能分為不同的模塊, 按模塊功能確定結(jié)構(gòu), 編寫(xiě)程序時(shí)應(yīng)采用模塊化的程序設(shè)計(jì)方法。500:07:144.6.1 匯編語(yǔ)言程序設(shè)計(jì)的一般步驟和基本框架4.6.1 匯編語(yǔ)言程序設(shè)計(jì)的一般步驟和基本框架600:07:14$INCLUDE (STC15.INC) ;自此以下是匯編語(yǔ)言程序的框架 ; 包含IAP15W4K58S4寄存器定義頭文件 ;-這里可以編寫(xiě)程序中用到的一些符號(hào)定義(使用EQU, DATA, BIT等偽指令) ORG0000HSTART: LJMPMAIN ;跳轉(zhuǎn)到主程序 ORG0003H LJMPINT0_ISR ;外

4、部中斷0入口 ORG000BH LJMPT0_ISR ;定時(shí)器0中斷入口 ORG0013H LJMPINT1_ISR ;外部中斷1入口 ORG001BH LJMPT1_ISR ;定時(shí)器1中斷入口 ORG0023H LJMPUART1_ISR ;串口1中斷入口COLUMN EQU 32H BUFFER DATA 40H(例: P0 DATA 80H) ORG0100HMAIN: MOV SP, #70H ;設(shè)置堆棧指針 ;初始化內(nèi)存區(qū)域內(nèi)容MAINLOOP: ;主程序循環(huán) LJMP MAINLOOP4.6.1 匯編語(yǔ)言程序設(shè)計(jì)的一般步驟和基本框架 ORG002BH LJMPADC_ISR ;AD

5、C中斷服務(wù)程序入口 ORG0033H LJMPLVD_ISR ;低電壓檢測(cè)中斷服務(wù)程序入口 ORG003BH LJMPPCA_ISR ;PCA中斷服務(wù)程序入口 ORG0043H LJMPUART2_ISR ;串口2中斷服務(wù)程序入口 ORG004BH LJMPSPI_ISR ;SPI中斷服務(wù)程序入口 700:07:144.6.1 匯編語(yǔ)言程序設(shè)計(jì)的一般步驟和基本框架 ORG0053H LJMPINT2_ISR ;INT2中斷服務(wù)程序入口 ORG005BH LJMPINT3_ISR ;INT3中斷服務(wù)程序入口 ORG0063H LJMPT2_ISR ;定時(shí)器2中斷服務(wù)程序入口 ORG0083H L

6、JMPINT4_ISR ;INT4中斷服務(wù)程序入口800:07:14IAP15W4K58S4的以上中斷與STC15F2K60S2的相同 4.6.1 匯編語(yǔ)言程序設(shè)計(jì)的一般步驟和基本框架9/198 ORG 008BHLJMP UART3_ISR ; UART3中斷服務(wù)程序入口 ORG 0093HLJMP UART4_ISR ;UART4中斷服務(wù)程序入口ORG 009BHLJMP T3_ISR ;T3中斷服務(wù)程序入口ORG 00A3HLJMP T4_ISR ;T4中斷服務(wù)程序入口ORG 00ABHLJMP COMP_ISR ;比較器中斷服務(wù)程序入口ORG 00B3HLJMP PWM_ISR ;PW

7、M中斷服務(wù)程序入口ORG 00BBHLJMP PWMFD_ISR ;PWM異常檢測(cè)(PWM Fault Detection)IAP15W4K58S4的以下中斷對(duì)STC15F2K60S2不存在4.6.1 匯編語(yǔ)言程序設(shè)計(jì)的一般步驟和基本框架 ORG0100HMAIN: MOVSP, #70H ;設(shè)置堆棧指針(可根據(jù)實(shí)際情況進(jìn)行修改) ;初始化內(nèi)存區(qū)域內(nèi)容 ;設(shè)置有關(guān)特殊功能寄存器(SFR)的控制字;根據(jù)需要開(kāi)放相應(yīng)的中斷控制MAINLOOP: ;主程序循環(huán) LJMP MAINLOOP1000:07:14(鍵盤(pán)掃描、數(shù)碼管-液晶刷新顯示)4.6.1 匯編語(yǔ)言程序設(shè)計(jì)的一般步驟和基本框架;下面是各個(gè)

8、中斷服務(wù)子程序的入口INT0_ISR: ;外部中斷0服務(wù)子程序 ;根據(jù)需要填入適當(dāng)?shù)膬?nèi)容RETIINT1_ISR: ;外部中斷1服務(wù)子程序 ;根據(jù)需要填入適當(dāng)?shù)膬?nèi)容RETIT0_ISR: ;定時(shí)器0中斷服務(wù)子程序 ;根據(jù)需要填入適當(dāng)?shù)膬?nèi)容RETIT1_ISR: ;定時(shí)器1中斷服務(wù)子程序 ;根據(jù)需要填入適當(dāng)?shù)膬?nèi)容RETIUART1_ISR: ;串口1中斷服務(wù)子程序 ;根據(jù)需要填入適當(dāng)內(nèi)容(注意中斷請(qǐng)求標(biāo)志位清零)RETI1100:07:144.6.1 匯編語(yǔ)言程序設(shè)計(jì)的一般步驟和基本框架1200:07:14UART2_ISR:;串口2中斷服務(wù)子程序 ;根據(jù)需要填入適當(dāng)內(nèi)容(注意中斷請(qǐng)求標(biāo)志位清零

9、)RETIADC_ISR: ;ADC中斷服務(wù)子程序 ;根據(jù)需要填入適當(dāng)內(nèi)容(注意中斷請(qǐng)求標(biāo)志位清零)RETISPI_ISR:;SPI通信中斷服務(wù)子程序 ;根據(jù)需要填入適當(dāng)內(nèi)容(注意中斷請(qǐng)求標(biāo)志位清零)RETILVD_ISR:;低電壓檢測(cè)服務(wù)子程序 ;根據(jù)需要填入適當(dāng)內(nèi)容(注意中斷請(qǐng)求標(biāo)志位清零)RETIPCA_ISR:;PCA和PWM中斷服務(wù)子程序 ;根據(jù)需要填入適當(dāng)內(nèi)容(注意中斷請(qǐng)求標(biāo)志位清零)RETI4.6.1 匯編語(yǔ)言程序設(shè)計(jì)的一般步驟和基本框架INT2_ISR: ;INT2中斷服務(wù)子程序 ;根據(jù)需要填入適當(dāng)?shù)膬?nèi)容 RETIINT3_ISR: ;INT3中斷服務(wù)子程序 ;根據(jù)需要填入適當(dāng)

10、的內(nèi)容 RETIT2_ISR: ;定時(shí)器2中斷服務(wù)子程序 ;根據(jù)需要填入適當(dāng)?shù)膬?nèi)容 RETIINT4_ISR: ;INT4中斷服務(wù)子程序 ;根據(jù)需要填入適當(dāng)?shù)膬?nèi)容 RETI; IAP15W4K58S4的以上中斷服務(wù)程序同STC15F2K60S21300:07:1414/1984.6.1 匯編語(yǔ)言程序設(shè)計(jì)的一般步驟和基本框架T3_ISR: ;定時(shí)器3中斷服務(wù)子程序 ;根據(jù)需要填入適當(dāng)?shù)膬?nèi)容RETIT4_ISR: ;定時(shí)器4中斷服務(wù)子程序 ;根據(jù)需要填入適當(dāng)?shù)膬?nèi)容RETIUART3_ISR: ;串口3中斷服務(wù)子程序 ;根據(jù)需要填入適當(dāng)?shù)膬?nèi)容(注意中斷請(qǐng)求標(biāo)志位的清0)RETIUART4_ISR:

11、;串口4中斷服務(wù)子程序 ;根據(jù)需要填入適當(dāng)?shù)膬?nèi)容(注意中斷請(qǐng)求標(biāo)志位的清0)RETICOMP_ISR: ;比較器中斷服務(wù)子程序 ;根據(jù)需要填入適當(dāng)?shù)膬?nèi)容(注意中斷請(qǐng)求標(biāo)志位的清0)RETIPWM_ISR: ;PWM中斷服務(wù)子程序 ;根據(jù)需要填入適當(dāng)?shù)膬?nèi)容(注意中斷請(qǐng)求標(biāo)志位的清0)RETIPWMFD_ISR: ;PWM異常檢測(cè)中斷服務(wù)子程序 ;根據(jù)需要填入適當(dāng)?shù)膬?nèi)容(注意中斷請(qǐng)求標(biāo)志位的清0)RETI;這里可以編寫(xiě)其他子程序或者定義程序中所用的常數(shù) ENDIAP15W4K58S4的以下中斷中斷服務(wù)程序?qū)TC15F2K60S2不存在4.6.1 匯編語(yǔ)言程序設(shè)計(jì)的一般步驟和基本框架注意: 由于地

12、址0003H、000BH、0013H、001BH、0023H 、002BH、0033H、003BH、0043H、004BH、0053H、005BH、0063H、0083H、008BH、0093H、009BH、00A3H、00ABH、00B3H和00BBH是專(zhuān)為中斷處理子程預(yù)留的入口地址,所以第一條指令是一條長(zhǎng)跳轉(zhuǎn)指令, 避開(kāi)上述中斷矢量表, 跳到0100H地址, 主程序MAIN從這個(gè)地址開(kāi)始;1500:07:14 ORG 0000HSTART: LJMP MAIN ;跳轉(zhuǎn)到主程序 ; 中斷服務(wù)程序入口地址(中斷矢量表) ORG 0100HMAIN: MOV SP, #70H ;初始化內(nèi)存區(qū)域內(nèi)

13、容4.6.1 匯編語(yǔ)言程序設(shè)計(jì)的一般步驟和基本框架主程序的末尾是一條長(zhǎng)跳轉(zhuǎn)指令,跳轉(zhuǎn)到某個(gè)合適的地方反復(fù)執(zhí)行主程序。一般的子程序不可形成死循環(huán),但是作為整個(gè)主程序卻應(yīng)該是一個(gè)最大的死循環(huán)。無(wú)論執(zhí)行哪個(gè)子程序,之后都要回到主程序,反復(fù)循環(huán)運(yùn)行。 1600:07:14 ORG0100HMAIN: MOVSP, #70H MAINLOOP: ;主程序循環(huán) LJMP MAINLOOP4.6.1 匯編語(yǔ)言程序設(shè)計(jì)的一般步驟和基本框架程序流程圖編程之前,根據(jù)系統(tǒng)方案繪制程序流程圖是一個(gè)好方法。程序流程圖可簡(jiǎn)潔地將程序的分支走向標(biāo)示清楚,尤其是在程序復(fù)雜,分工編寫(xiě)時(shí),利用流程圖理順各部分關(guān)系顯得尤為重要。1

14、700:07:14畫(huà)流程圖有兩個(gè)常用的結(jié)構(gòu):順序執(zhí)行的矩形框和條件分支的菱形框。流程圖的兩種結(jié)構(gòu):順序執(zhí)行:順序執(zhí)行的語(yǔ)句使用矩形方框表示,矩形框內(nèi)注明程序的功能, 各方框之間用箭頭表示執(zhí)行順序;條件分支: 需要根據(jù)條件判斷是否轉(zhuǎn)移時(shí),使用菱形方框表示, 菱形框內(nèi)注明分支條件, 不同出口表明分支的去向。1800:07:14存儲(chǔ)單元清零堆棧指針賦初值調(diào)用延時(shí)子程序順序結(jié)構(gòu)計(jì)數(shù)單元-1=0?退出循環(huán)YN循環(huán)體分支結(jié)構(gòu)YN循環(huán)體R0-1R0=0?分支結(jié)構(gòu)另種畫(huà)法例: DJNZ R0, L1流程圖的兩種結(jié)構(gòu):條件分支: 一般框圖如下所示:1900:07:14二分支結(jié)構(gòu)多分支結(jié)構(gòu)條件指令有CJNZ, J

15、Z, J(N)C, J(N)B 等 圖4-47 典型循環(huán)程序結(jié)構(gòu)的流程圖 程序流程圖循環(huán)程序設(shè)計(jì)當(dāng)程序處理的對(duì)象具有重復(fù)性規(guī)律時(shí),可以使用循環(huán)程序設(shè)計(jì)。2000:07:144.6.2 典型匯編語(yǔ)言程序設(shè)計(jì)舉例1、分支程序設(shè)計(jì)2、循環(huán)程序設(shè)計(jì)3、查表程序設(shè)計(jì)4、定點(diǎn)數(shù)運(yùn)算子程序設(shè)計(jì)5、數(shù)據(jù)排序程序設(shè)計(jì)6、代碼轉(zhuǎn)換程序設(shè)計(jì)2100:07:14作業(yè)1、分支程序設(shè)計(jì)程序分支是通過(guò)條件轉(zhuǎn)移指令實(shí)現(xiàn)的,即根據(jù)條件進(jìn)行判斷后決定程序的走向。條件滿(mǎn)足則進(jìn)行程序轉(zhuǎn)移,不滿(mǎn)足就順序執(zhí)行程序。通過(guò)條件判斷實(shí)現(xiàn)單分支程序轉(zhuǎn)移的指令有JZ、JNZ、CJNE (4條)和DJNZ(2條)等。以位狀態(tài)為條件,進(jìn)行程序分支的指

16、令JC、JNC、JB、JNB和JBC等。2200:07:141、分支程序設(shè)計(jì)【例4-10】編程實(shí)現(xiàn)下面的比較函數(shù)。設(shè)變量x存放在R0,求得的y 值存入SIGN單元。2300:07:14解:可以利用比較轉(zhuǎn)移CJNE指令和進(jìn)位位C狀態(tài)控制轉(zhuǎn)移(JC指令)來(lái)實(shí)現(xiàn)三分支轉(zhuǎn)移。2)比較轉(zhuǎn)移指令(4條)CJNE (目的字節(jié)), (源字節(jié)),rel2400:07:14比較轉(zhuǎn)移指令有4條:CJNE A, #data8,rel CJNE A, addr8,relCJNE Ri, #data8, relCJNE Rn, #data8, rel 該指令比較前面兩個(gè)操作數(shù)的大小,如果它們的值不相等則轉(zhuǎn)移,相等則繼續(xù)執(zhí)

17、行。三字節(jié)指令,PC當(dāng)前值(PC3 PC)與指令第三字節(jié)帶符號(hào)的偏移量相加即得到轉(zhuǎn)移地址。對(duì)進(jìn)位位CY有影響: 如果目的字節(jié)的無(wú)符號(hào)整數(shù)值小于源字節(jié)的無(wú)符號(hào)整數(shù)值,則置位進(jìn)位標(biāo)志,否則清“0”進(jìn)位位,指令不影響任何一個(gè)操作數(shù)。機(jī)器碼:B8BF【例4-10】程序 SIGN EQU 50H ;求得的y 值存入SIGN單元ORG0000HLJMPMAINORG 0100HMAIN: CJNE R0, #37, NOTEQ ;R0與37比較, 不相等則轉(zhuǎn)NOTEQMOV SIGN, #00H ;若比較相等,則SIGN0LJMP ENDM ;轉(zhuǎn)到程序結(jié)束NOTEQ:JC NEG ;兩數(shù)不相等, 若R03

18、7則C=1, 轉(zhuǎn)NEG處理MOV SIGN,#01H ;R037時(shí),SIGN+1LJMP ENDM ;轉(zhuǎn)到程序結(jié)束NEG:MOV SIGN, #0FFH ;R037時(shí), SIGN-1ENDM:NOPEND2500:07:14設(shè)變量x值存放在R02、循環(huán)程序設(shè)計(jì)2600:07:14延時(shí)程序是典型的循環(huán)程序。下面就以延時(shí)程序?yàn)槔? 說(shuō)明循環(huán)程序的設(shè)計(jì)方法。流程圖如圖所示。圖4-48 延時(shí)程序流程圖LOOP: DJNZ R7, LOOP MOV R7, #218 可把 R7換成一個(gè)存儲(chǔ)單元30H2、循環(huán)程序設(shè)計(jì)簡(jiǎn)單延時(shí)子程序如下(注釋部分為指令的時(shí)鐘周期數(shù)):DELAY100US : ;11.059

19、2MHz PUSH 30H ;指令的時(shí)鐘周期數(shù)3T MOV 30H, #218 ;3TDLY_LOOP: DJNZ 30H, DLY_LOOP ; 5T ;30H(30H)-1, 若(30H)0, 則轉(zhuǎn)到DLY_LOOP執(zhí)行 POP 30H ;2T RET ;4T IAP15W4K58S4為1T的單片機(jī), 當(dāng)時(shí)鐘為11.0592MHz時(shí), 上述程序可延時(shí)約0.1ms。2700:07:14R7R72、循環(huán)程序設(shè)計(jì)創(chuàng)建延時(shí)程序最簡(jiǎn)單的方法是利用下載工具STC-ISP的“軟件延時(shí)計(jì)算器”獲得延時(shí)程序代碼, 如圖4-49所示。在工具中選擇“軟件延時(shí)計(jì)算器”標(biāo)簽頁(yè), 設(shè)置系統(tǒng)頻率,定時(shí)長(zhǎng)度和8051指令

20、集, 單擊“生成ASM代碼”按鈕即可生成延時(shí)子程序匯編代碼。也可生成C程序代碼。2800:07:14作業(yè)3、查表程序設(shè)計(jì)查表法產(chǎn)生的背景:參數(shù)的計(jì)算非常復(fù)雜;公式計(jì)算法計(jì)算程序長(zhǎng),難于計(jì)算;非線(xiàn)性參數(shù),無(wú)法用一般算術(shù)運(yùn)算就可以計(jì)算出來(lái),如指數(shù)、對(duì)數(shù)、三角函數(shù)以及積分、微分等運(yùn)算;查表法定義 把事先計(jì)算或測(cè)得的數(shù)據(jù)按一定順序編制成表格,查表程序根據(jù)被測(cè)參數(shù)的值或中間結(jié)果, 查出最終所需結(jié)果。2900:07:14(用DB, DW偽指令)3、查表程序設(shè)計(jì)應(yīng)用:在一些快速計(jì)算的場(chǎng)合,根據(jù)自變量的值,從表格上查找相應(yīng)的函數(shù)值(正弦值) 、代碼轉(zhuǎn)換值等。常用MOVC A,ADPTR查找程序存儲(chǔ)器空間的表格

21、數(shù)據(jù)。舉例: 在LED顯示程序中, 獲得LED數(shù)碼管顯示字模;3000:07:143、查表程序設(shè)計(jì)3100:07:14 假如要顯示的數(shù)據(jù)需放到累加器A中, 采用共陽(yáng)極LED顯示, 則可采用下面查表法程序獲得LED顯示字模: MOVDPTR, #SEGTAB;獲得字模表的首地址 MOVC A, A+DPTR;查表獲得字模 MOV P1, A ; 送出字模進(jìn)行顯示SEGTAB: DB 0C0H ;0的字模 DB0F9H ;1的字模 DB0A4H ;2的字模 DB0B0H ;3的字模 DB99H ;4的字模 DB92H ;5的字模 DB82H ;6的字模 DB0F8H ;7的字模 DB80H ;8的

22、字模 DB90H ;9的字模D7D6D5D4D3D2D1D0hgfedcba1100000011111001hgfedcbaA中存要顯示的09的數(shù)字如何轉(zhuǎn)換?數(shù)字的字模各位設(shè)由P1口8條口線(xiàn)P1.7P1.0輸出要顯示的數(shù)據(jù)P1.0P1.1P1.7P1.2P1.3P1.4P1.5P1.6作業(yè)4、定點(diǎn)數(shù)運(yùn)算子程序設(shè)計(jì)多字節(jié)無(wú)符號(hào)加法子程序和減法子程序設(shè)計(jì)較簡(jiǎn)單,在此介紹有代表性的多字節(jié)BCD碼減法程序和多字節(jié)乘法程序的設(shè)計(jì)。(1)多字節(jié)十進(jìn)制BCD碼減法因指令系統(tǒng)中只有十進(jìn)制加法調(diào)整指令DA A, 也即該指令只有在加法指令(ADD、ADDC)后, 才能得到正確的結(jié)果。為了用十進(jìn)制加法調(diào)整指令對(duì)十進(jìn)

23、制減法進(jìn)行調(diào)整,必須采用補(bǔ)碼相加的辦法,用9AH (100)減去減數(shù)即得以10(100)為模的減數(shù)的補(bǔ)碼。3200:07:14參考例4-9GO(1)多字節(jié)十進(jìn)制BCD碼減法求BCD碼8943H - 7649H=? 編程前由實(shí)例測(cè)算計(jì)算過(guò)程。先對(duì)低位字節(jié)運(yùn)算43H - 49H: 1001 1010 模9A-) 0100 1001 減數(shù)49 0101 0001 得49對(duì)100補(bǔ)碼51+)0100 0011 加被減數(shù)43 0 1001 0100 差943300:07:14再對(duì)高字節(jié)運(yùn)算89H -76H - C: 1001 1010 9A -) 0111 0110 76 0010 0100 得76對(duì)1

24、00補(bǔ)碼為24 -)0000 0001 減去借位位C=1 0010 0011 減借位1后的值為23+)1000 1001 加被減數(shù)89 1010 1100 結(jié)果0AC+) 0110 0110 對(duì)結(jié)果加66修正 10001 0010 差為12 C=0無(wú)進(jìn)位, 表示二者相減有借位。應(yīng)對(duì)借位C求反使C=1。DA A 調(diào)整 高字節(jié)減數(shù)變補(bǔ)與被減數(shù)相加調(diào)整后有進(jìn)位1, 表示兩者相減無(wú)借位, 為正確反映借位情況應(yīng)對(duì)進(jìn)位C求反使C=0(減法時(shí)C=1,表示有借位; C=0, 表示無(wú)借位)。最后結(jié)果為1294H, 且無(wú)借位, 計(jì)算正確。43向高位借位與49相減的結(jié)果應(yīng)理解為以十六進(jìn)制形式表示 后C=0(1)多字

25、節(jié)十進(jìn)制BCD碼減法程序說(shuō)明(減法運(yùn)算化成100的補(bǔ)碼加法運(yùn)算)程序中,減數(shù)求補(bǔ)后與被減數(shù)相加,方可利用DA A指令進(jìn)行調(diào)整; 若二者相加調(diào)整(DA A)后結(jié)果無(wú)進(jìn)位(C=0),實(shí)際上表示二者相減有借位;若二者相加調(diào)整(DA A)后有進(jìn)位(C=1),實(shí)際上表示二者相減沒(méi)有借位(教材加文字); 參考例4-9因此, 都需對(duì)進(jìn)位位C進(jìn)行求反操作。3400:07:14BCD碼減法程序舉例:采用補(bǔ)碼相加的辦法,用9AH(100)減去減數(shù)即得以10(100)為模的減數(shù)的補(bǔ)碼。(1)多字節(jié)十進(jìn)制BCD碼減法入口:被減數(shù)低字節(jié)地址存放于R1,減數(shù)低字節(jié)地址存放于R0,字節(jié)數(shù)存放于R2。出口:差 (補(bǔ)碼) 的低

26、字節(jié)地址存放于R0,字節(jié)數(shù)存放于R3。 07H為符號(hào)位。0表示結(jié)果為正,1表示結(jié)果為負(fù)。3500:07:14多字節(jié)十進(jìn)制BCD碼在RAM中存放地址:(1)多字節(jié)十進(jìn)制BCD碼減法 編程代碼:3600:07:14R1: 被減數(shù)低字節(jié)地址; R2: 字節(jié)數(shù); R3: 差的字節(jié)數(shù)。 R0: 減數(shù)低字節(jié)地址;也是最后結(jié)果差(BCD碼)的低字節(jié)地址07H位地址存最終結(jié)果符號(hào)位。0表示結(jié)果為正,1表示結(jié)果為負(fù)。SUBCD: MOV R3, #00H ;差的字節(jié)數(shù)置0 CLR 07H ;符號(hào)位單元清0 CLR C ;下面用帶進(jìn)位減法指令SUBB, 借位位C清0SUBCD1: MOV A, #9AH SUBB

27、 A, R0 ;求減數(shù)的100的補(bǔ)碼 ADD A, R1 ;補(bǔ)碼與被減數(shù)相加 DA A ;十進(jìn)制加法調(diào)整指令 MOV R0, A ;結(jié)果差送到R0間接尋址單元 INC R0 ;減數(shù)地址值增1, 指向高字節(jié) INC R1 ;被減數(shù)地址值增1, 指向高字節(jié) INC R3 ;差的字節(jié)數(shù)增1CPL C ;進(jìn)位求反,以形成正確借位DJNZ R2, SUBCD1 ;每字節(jié)減法算法相同,未完循環(huán), 減完順序執(zhí)行, JNC SUBCD2 ;無(wú)借位去SUBCD2返主, 否則繼續(xù)SETB 07H ;差為負(fù)置符號(hào)位07H為“1” SUBCD2: RET ;返回(2)多字節(jié)乘法運(yùn)算子程序單片機(jī)指令系統(tǒng)中只有單字節(jié)乘法

28、指令MUL AB, 而工程應(yīng)用中常需8位乘16位、兩個(gè)16位數(shù)相乘的運(yùn)算。3700:07:14以?xún)蓚€(gè)16位無(wú)符號(hào)數(shù)相乘為例說(shuō)明多字節(jié)乘法程序設(shè)計(jì)。設(shè)被乘數(shù)放在R2、R3兩單元(高字節(jié)在前), 乘數(shù)放在R6、R7兩單元, 兩個(gè)雙字節(jié)無(wú)符號(hào)數(shù)相乘, 結(jié)果送33H、32H、31H、30H。(R3R7)L表示R3R7的低8位,(R3R7)H表示R3R7的高8位,其余幾項(xiàng)的含義類(lèi)似。程序如下:算法示意圖如圖所示。GO(2)多字節(jié)乘法運(yùn)算子程序DMUL: MOV A, R3MOV B, R7MUL AB ;R3R7MOV 30H, A ;(30H) (R3R7)LMOV 31H, B ;(31H) (R3

29、R7)HMOV A, R2MOV B, R7MUL AB ;R2R7 ADD A, 31H ;(R3R7)H+(R2R7)LMOV 31H, ACLR AADDC A, B ;進(jìn)位位C與(R2R7)H加MOV 32H, A ;(32H) (R2R7)H3800:07:14(2)多字節(jié)乘法運(yùn)算子程序MOV A, R3MOV B, R6MUL AB ;R3R6ADD A, 31HMOV 31H, AMOV A, BADDC A, 32H ;(R2R7)H+(R3R6)HMOV 32H, AMOV F0, C ;暫存Cy ;因下面乘法使C清0 ;也可CLR A, ADDC A, #0, MOV 33

30、H, A;下面程序相應(yīng)修改3900:07:14程序狀態(tài)標(biāo)志寄存器PSW 位號(hào)D7D6D5D4D3D2D1D0符號(hào)CYACF0RS1RS0OVF1PF0: 用戶(hù)標(biāo)志位(2)多字節(jié)乘法運(yùn)算子程序4000:07:14MOV A, R2MOV B, R6MUL AB ;R2R6ADD A, 32HMOV 32H, ACLR AMOV ACC.0, C ;或 ADDC A, #0MOV C, F0 ;前次加法進(jìn)位送C, 為ADDC加(R2R6)H準(zhǔn)備ADDC A, BMOV 33H, ARETMOV F0, C ;暫存Cy程序狀態(tài)標(biāo)志寄存器PSW 位號(hào)D7D6D5D4D3D2D1D0符號(hào)CYACF0RS

31、1RS0OVF1PF0: 用戶(hù)標(biāo)志位5、數(shù)據(jù)排序程序設(shè)計(jì)數(shù)據(jù)排序是將數(shù)據(jù)塊中的數(shù)據(jù)按升序或降序排列。下面以數(shù)據(jù)升序排序?yàn)槔? 說(shuō)明數(shù)據(jù)排序程序設(shè)計(jì)方法。數(shù)據(jù)升序排列常采用冒泡法。冒泡法是一種相鄰數(shù)據(jù)互換的排列方法,同查找極大值方法一樣,一次冒泡即找到數(shù)據(jù)塊的極大值放到數(shù)據(jù)塊最后,4100:07:14例, 將片內(nèi)RAM 30H37H中的數(shù)據(jù)從小到大升序排列。設(shè)R6為循環(huán)次數(shù)計(jì)數(shù)器, R7為比較次數(shù)計(jì)數(shù)器。F0為冒泡過(guò)程中是否有數(shù)據(jù)交換的狀態(tài)標(biāo)志,F(xiàn)0=0表示無(wú)交換發(fā)生,F(xiàn)0=1表示有互換發(fā)生,須繼續(xù)循環(huán)。R0為指向RAM單元的地址指針初值為30H。 再一次冒泡,次大數(shù)排在倒數(shù)第二位置,多次冒泡實(shí)

32、現(xiàn)升序排列。冒泡法數(shù)據(jù)排序程序流程圖4200:07:14數(shù)據(jù)在30H37H中;R6為循環(huán)次數(shù)計(jì)數(shù)器R7為比較次數(shù)計(jì)數(shù)器;F0為數(shù)據(jù)交換狀態(tài)標(biāo)志;R0地址指針.30H56H31H50H32H46H33H36H34H25H35H16H36H13H37H06H比較次數(shù)循環(huán)次數(shù)冒泡法數(shù)據(jù)排序程序SORT: MOV R6,#07H ;循環(huán)次數(shù)送到R6GOON: CLR F0 ;交換標(biāo)志清0 MOV R0, #30H ;數(shù)據(jù)首址送R0 MOV A, R6 MOV R7, A ;各次冒泡比較次數(shù)送R7LOOP: MOV A, R0 ;取前數(shù) MOV 3BH, A ; 3BH單元存前數(shù) INC R0 MOV

33、3AH, R0 ;取后數(shù)送3AH單元 CLR C CJNE A, 3AH, EXCH LJMP NEXT4300:07:14A3AH時(shí)清C, A3AH 時(shí)置C冒泡法數(shù)據(jù)排序程序EXCH: JC NEXT ;前數(shù)(3BH)小于后數(shù)(3AH)不交換 MOV R0, 3BH ;3BH單元內(nèi)前數(shù)存后數(shù)地址 DEC R0 ; R0指向前數(shù) MOV R0, 3AH ; 3AH單元后數(shù)存前數(shù)地址 INC R0 ; R0指向后數(shù)地址 SETB F0 ;置交換標(biāo)志位NEXT: DJNZ R7, LOOP ;未比較完, 進(jìn)行下一次比較 JNB F0, DONE ;一次也沒(méi)交換, 說(shuō)明已按順序排列 DJNZ R6,

34、 GOON ; 循環(huán)次數(shù)減1, 不為0進(jìn)下一輪循環(huán)DONE: RET ;返回4400:07:14CJNE A, 3AH, EXCHLJMP NEXTA3AH清C, A3AH置C6、代碼轉(zhuǎn)換程序設(shè)計(jì)在匯編語(yǔ)言程序設(shè)計(jì)中,數(shù)據(jù)輸入/輸出、A/D、D/A轉(zhuǎn)換等常采用BCD碼,字符的存儲(chǔ)用ASCII碼,算術(shù)邏輯運(yùn)算又采用二進(jìn)制數(shù)。除了用硬件邏輯實(shí)現(xiàn)轉(zhuǎn)換外,可采用算法處理和查表方法軟件實(shí)現(xiàn)。4500:07:14(1)4位二進(jìn)制數(shù)轉(zhuǎn)換為ASCII代碼從ASCII編碼表可知,若4位二進(jìn)制數(shù)小于10,則此二進(jìn)制數(shù)加上30H即變?yōu)橄鄳?yīng)的ASCII碼,若大于10 (包括等于10, 是字符ABCDEF),則應(yīng)加37

35、H。入口: 轉(zhuǎn)換前4位二進(jìn)制數(shù)存R2。出口: 轉(zhuǎn)換后的ASCII碼存R2。41H A 42H B 43H C 44H D 45H E 46H F 37H+0AH=41HASCII字碼表4600:07:14(1)4位二進(jìn)制數(shù)轉(zhuǎn)換為ASCII代碼ASCB1: MOV A, R2 ANL A,#0FH;取出4位二進(jìn)制數(shù) CJNE A, #0AH, NOTA ;影響CY標(biāo)志, 但是不改變A中的值NOTA: JC LOOP ;該數(shù)10去LOOP ADD A, #07H ;否則加37H(下面還加30H)LOOP: ADD A, #30H ;加30H MOV R2, A ;轉(zhuǎn)換之ASCII碼送R2中 RET

36、 ;返回4700:07:14(3)BCD碼轉(zhuǎn)換為二進(jìn)制碼子程序例: 設(shè)有用BCD碼表示的4位十進(jìn)制數(shù)分別存于R1, R2中, 其中R2存千位和百位數(shù), R1存拾位和個(gè)位數(shù), 要把其轉(zhuǎn)換成二進(jìn)制碼。解決思路:可用由高位到低位逐位檢查BCD碼的數(shù)值,然后累加各十進(jìn)制位(乘權(quán)值)對(duì)應(yīng)的二進(jìn)制數(shù)來(lái)實(shí)現(xiàn)。其中, 100003E8H, 100=0064H, 10=000AH (個(gè)位數(shù)的BCD碼與二進(jìn)制碼相同)。4800:07:14入口: 待轉(zhuǎn)換的BCD碼存于R1, R2中, 分配如下: 低位字節(jié) : R1 ; 高位字節(jié) : R2 出口: 結(jié)果存在20H, 21H單元中, 其中20H存低字節(jié), 21H存高字

37、節(jié)。R1十位數(shù)個(gè)位數(shù)R2千位數(shù)百位數(shù)(3)BCD碼轉(zhuǎn)換為二進(jìn)制碼子程序BCDB11:MOV 20H, #00H MOV 21H, #00H ;存結(jié)果單元清0 MOV R3, #0E8H MOV R4, #03H ;1千的二進(jìn)制數(shù)03E8H送R3, R4 MOV A, R2 ANL A, #0F0H ;取千位數(shù) SWAP A ;將千位數(shù)移至低四位 JZ BRAN1 ;千位數(shù)為0則轉(zhuǎn)BRAN1, 去處理百位數(shù)LOOP1: DEC A LCALL ADDT ;千位數(shù)不為0, 加千位數(shù)二進(jìn)制權(quán)碼 ;千位數(shù)是n, 就加n次千位數(shù)二進(jìn)制碼03E8H JNZ LOOP1 ;本循環(huán)即實(shí)現(xiàn)千位數(shù)n乘權(quán)值03E8

38、H4900:07:14BRAN1:MOV R3, #64H ;下面實(shí)現(xiàn)百位數(shù)轉(zhuǎn)二進(jìn)制碼 MOV R4, #00H ;百位數(shù)的二進(jìn)制碼64H送R3, R4 MOV A, R2 ANL A, #0FH ;取百位數(shù) JZ BRAN2 ;百位數(shù)是0轉(zhuǎn)BRAN2, 去處理十位數(shù)LOOP2: DEC A LCALL ADDT ;加百位數(shù)二進(jìn)制權(quán)碼 JNZ LOOP2 ;百位數(shù)是n, 就加n次64H5000:07:14BRAN2: MOV R3, #0AH ;十位數(shù)權(quán)值0AH送R3, R4=00H MOV A, R1 ;下面實(shí)現(xiàn)十位數(shù)轉(zhuǎn)二進(jìn)制碼 ANL A, #0F0H ;取十位數(shù) SWAPA JZ BRA

39、N3 ;十位數(shù)為0轉(zhuǎn)BRAN3, 去處理個(gè)位數(shù)LOOP3: DEC A LCALL ADDT ;十位數(shù)不為0, 加十位數(shù)二進(jìn)制權(quán)碼 JNZ LOOP3 ;十位數(shù)是n, 就加n次0AH5100:07:14BRAN3: MOV A, R1 ANL A, #0FH ;取個(gè)位數(shù) MOV R3, A ;個(gè)位數(shù)(權(quán)值是自身)送R3, R4=00H LCALL ADDT ;加個(gè)位數(shù)二進(jìn)制碼 RETADDT: PUSH PSWPUSH ACCCLR CMOV A, 20H ;20H(低), 21H單元存累加的轉(zhuǎn)換結(jié)果ADD A, R3 ;累加轉(zhuǎn)換結(jié)果MOV 20H, AMOV A, 21HADDC A, R4

40、MOV 21H, APOP ACCPOP PSWRET; R3, R4存1千(百, 十)的二進(jìn)制數(shù)權(quán)值03E8H(0064H, 000AH)7、IAP15W4K58S4單片機(jī)雙數(shù)據(jù)指針的使用兩個(gè)16位的數(shù)據(jù)指針:DPTR0和DPTR1。它們的邏輯地址相同,但是物理上是獨(dú)立的。功能:利用這兩個(gè)數(shù)據(jù)指針,可以方便地進(jìn)行數(shù)據(jù)的遷移和拷貝。使用方法:這兩個(gè)數(shù)據(jù)指針在指令中只能以DPTR的形式出現(xiàn),因此,在使用中,需進(jìn)行切換。這種切換是通過(guò)設(shè)置輔助寄存器AUXR1中的DPS位實(shí)現(xiàn)的。當(dāng)DPS選擇位為0時(shí), 選擇DPTR0;當(dāng)DPS選擇位為1時(shí), 選擇DPTR1。5200:07:14位號(hào)D7D6D5D4D

41、3D2D1D0位名稱(chēng)S1_S1S1_S0CCP_S0CCP_S1SPI_S1SPI_S00DPSAUXR1各位定義:7、IAP15W4K58S4單片機(jī)雙數(shù)據(jù)指針的使用DPS:DPTR寄存器選擇位。0:選擇DPTR0; 1:選擇DPTR15300:07:14位號(hào)D7D6D5D4D3D2D1D0位名稱(chēng)S1_S1S1_S0CCP_S0CCP_S1SPI_S1SPI_S00DPS例4-11編程實(shí)現(xiàn)將單片機(jī)內(nèi)部擴(kuò)展RAM中0000H000FH單元中內(nèi)容傳送到0040H004FH單元中。思路:可以分別由DPTR0和DPTR1分別指向源數(shù)據(jù)地址和目的數(shù)據(jù)地址。AUXR1各位定義7、IAP15W4K58S4單

42、片機(jī)雙數(shù)據(jù)指針的使用編程如下:AUXR1 DATA 0A2H ;定義輔助寄存器AUXR1直接地址 ORG 0000H LJMP MAIN ORG 0100HMAIN: MOV SP, #30H;設(shè)置堆棧指針 MOV R2, #10H;設(shè)置計(jì)數(shù)值(傳送的字節(jié)數(shù)16) ANL AUXR1, #0FEH;令DPS.0=0,選擇DPTR0 MOV DPTR, #0000H;置源數(shù)據(jù)地址指針DPTR0=0H ORL AUXR1, #01H;令DPS.0=1,選擇DPTR1 ;該句可用INC AUXR1代替(思考: 為何?) MOV DPTR, #0040H ;置目的數(shù)據(jù)地址指針DPTR1=40H5400

43、:07:14或$INCLUDE (STC15.INC); 包含STC15寄存器定義頭文件7、IAP15W4K58S4單片機(jī)雙數(shù)據(jù)指針的使用LOOP: ANL AUXR1, #0FEH ;該句可用INC DEC AUXR1代替MOVX A, DPTR ; A (DPTR0) INC DPTR ;修正源數(shù)據(jù)地址指針DPTR0+1 ORL AUXR1, #01H ;該句可用INC AUXR1代替, MOVX DPTR, A ; (DPTR1) A INC DPTR ;修正目的數(shù)據(jù)地址指針DPTR1+1 DJNZ R2, LOOP ;傳送字節(jié)數(shù)16沒(méi)完, 繼續(xù)循環(huán)傳送 SJMP $ ;$表示本條語(yǔ)句地

44、址, 本指令是死循環(huán)等待 ;SJMP $ 相當(dāng)于HERE: SJMP HERE END5500:07:14選DPTR1選DPTR03-2-1單片機(jī)的內(nèi)部結(jié)構(gòu) 2、存儲(chǔ)器的結(jié)構(gòu)(3)數(shù)據(jù)Flash存儲(chǔ)器 1)相關(guān)特殊功能寄存器ISP/IAP命令寄存器IAP_CMDISP/IAP命令寄存器IAP_CMD(地址C5H,復(fù)位值xxxx x000B)的各位定義如下:00:07位號(hào)D7D6D5D4D3D2D1D0位名稱(chēng)-MS1MS0MS1和MS0組合形成不同的命令。MS1MS0命令/操作00待機(jī)模式,無(wú)ISP操作表4-6 ISP/IAP命令選擇01對(duì)“Data Flash/EEPROM區(qū)”進(jìn)行字節(jié)讀10對(duì)

45、“Data Flash/EEPROM區(qū)”進(jìn)行字節(jié)編程11對(duì)“Data Flash/EEPROM區(qū)”進(jìn)行扇區(qū)擦除56ISP/IAP控制寄存器IAP_CONTRISP/IAP控制寄存器IAP_CONTR(地址:C7H, 復(fù)位值為0000 x000B)各位的定義如下:00:07位號(hào)D7D6D5D4D3D2D1D0位名稱(chēng)IAPENSWBSSWRSTCMD_FAIL-WT2WT1WT0IAPEN: ISP/IAP功能允許位。0:禁止IAP讀/寫(xiě)/擦除Data Flash/EEPROM1: 允許IAP讀/寫(xiě)/擦除Data Flash/EEPROMSWBS和SWRST用于設(shè)置單片機(jī)的軟件復(fù)位。(見(jiàn)11章)I

46、APENSWBSSWRST57CMD_FAIL: 若送了ISP/IAP命令, 并對(duì)IAP_TRIG送5AH/A5H觸發(fā)失敗, 則為1, 需由軟件清零。CMD_FAILISP/IAP控制寄存器IAP_CONTRWT2WT0設(shè)置IAP/ISP時(shí)的, CPU等待時(shí)間, CPU讀數(shù)據(jù)Flash的等待時(shí)間固定為2個(gè)時(shí)鐘。其他等待時(shí)間見(jiàn)表4-7。00:07位號(hào)D7D6D5D4D3D2D1D0位名稱(chēng)IAPENSWBSSWRSTCMD_FAIL-WT2WT1WT0WT2WT1WT058表4-7 IAP/ISP時(shí)的CPU等待時(shí)間WT2WT1WT0CPU等待時(shí)間與等待參數(shù)對(duì)應(yīng)的推薦系統(tǒng)時(shí)鐘編程時(shí)間(55us)扇區(qū)

47、擦出(21ms)11155個(gè)時(shí)鐘21012個(gè)時(shí)鐘 1MHz110110個(gè)時(shí)鐘42024個(gè)時(shí)鐘 2MHz101165個(gè)時(shí)鐘63036個(gè)時(shí)鐘 3MHz100330個(gè)時(shí)鐘126072個(gè)時(shí)鐘 6MHz011660個(gè)時(shí)鐘252144個(gè)時(shí)鐘 12MHz0101100個(gè)時(shí)鐘420240個(gè)時(shí)鐘 20MHz0011320個(gè)時(shí)鐘504288個(gè)時(shí)鐘 24MHz0001760個(gè)時(shí)鐘672384個(gè)時(shí)鐘 30MHz8、IAP15W4K58S4單片機(jī)數(shù)據(jù)Flash(EEPROM)的使用IAP15W4K58S4單片機(jī)片內(nèi)集成1KB的數(shù)據(jù)Flash存儲(chǔ)器, 可作為EEPROM使用, 用來(lái)保存程序的設(shè)置參數(shù)。5900:07:14

48、【例4-12】一個(gè)完整的數(shù)據(jù)Flash操作實(shí)例。$INCLUDE (STC15.INC) ;包含IAP15W4K58S4寄存器定義文件;定義ISP/IAP命令 ISP_IAP_BYTE_READ EQU 1H ;字節(jié)讀ISP_IAP_BYTE_PROGRAM EQU 2H ;字節(jié)編程ISP_IAP_SECTOR_ERASE EQU 3H ;扇區(qū)擦除;定義Flash操作等待時(shí)間及允許IAP/ISP操作的常數(shù)(設(shè)置IAP_CONTR)ENABLE_IAP EQU 82H ;系統(tǒng)工作時(shí)鐘20MHz時(shí)DEBUG_DATA EQU 5AH ;EEPROM單元的測(cè)試值,如正確應(yīng)等于該值START_ADDR

49、ESS EQU 0000H ;EEPROM測(cè)試起始地址GO例4-12 一個(gè)完整的數(shù)據(jù)Flash操作實(shí)例(續(xù)) ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV SP, #70H ;堆棧指針指向 70H單元 LCALL Delay ;延時(shí) ;下面程序讀出EEPROM測(cè)試起始地址單元的內(nèi)容MAIN1: MOV DPTR, #START_ADDRESS ;將EEPROM測(cè)試起始地址0H送DPTR數(shù)據(jù)指針 LCALL Byte_Read ;調(diào)子程讀數(shù)據(jù)經(jīng)IAP_DATA送入累加器A MOV 40H, A ;將EEPROM 的值送40H 單元保存 CJNE A, #DEBU

50、G_DATA, NOT_EQU_DEBUG_DATA ;若數(shù)據(jù)不正確(非5AH),就跳轉(zhuǎn);數(shù)據(jù)正確(5AH)時(shí), 順序執(zhí)行 LCALL Delay ;延時(shí) SJMP $ ;數(shù)據(jù)正確, CPU在此無(wú)限循環(huán)執(zhí)行此句6000:07:14例4-12 一個(gè)完整的數(shù)據(jù)Flash操作實(shí)例(續(xù))NOT_EQU_DEBUG_DATA: ;下面代碼是當(dāng)EEPROM里的數(shù)據(jù)錯(cuò)誤時(shí), 需進(jìn)行的處理程序 ;即將該EEPROM所在的扇區(qū)整個(gè)擦除,將正確的數(shù)據(jù)寫(xiě)入 LCALL Delay ;延時(shí) MOV DPTR, #START_ADDRESS ;將EEPROM測(cè)試起始地址0H送DPTR數(shù)據(jù)指針 LCALL Sector_

51、Erase ;調(diào)擦除整個(gè)扇區(qū)子程序 MOV DPTR, #START_ADDRESS ;將EEPROM測(cè)試起始地址送DPTR數(shù)據(jù)指針 MOV A, #DEBUG_DATA ;寫(xiě)入 EEPROM 數(shù)據(jù) #DEBUG_DATA(5A) LCALL Byte_Program ;字節(jié)編程 SJMP $ ;字節(jié)編程后,CPU在此無(wú)限循環(huán)執(zhí)行此句6100:07:14例4-12 一個(gè)完整的數(shù)據(jù)Flash操作實(shí)例(續(xù)) ;下面程序是讀一字節(jié), 調(diào)用前需打開(kāi)IAP功能, Byte_Read: ;入口: DPTR=字節(jié)地址, 返回: A=讀出字節(jié) MOV IAP_CONTR, #ENABLE_IAP ; IAP_

52、CONTR82H, 打開(kāi)IAP功能,設(shè)置Flash操作等待時(shí)間 MOV IAP_CMD, #ISP_IAP_BYTE_READ ; IAP_CMD01H,設(shè)置為IAP/ISP字節(jié)讀模式命令 MOV IAP_ADDRH, DPH ;設(shè)置目標(biāo)單元地址的高8位地址0H MOV IAP_ADDRL, DPL ;設(shè)置目標(biāo)單元地址的低8位地址0H MOV IAP_TRIG, #5AH ;先送5AH,再送A5H到ISP/IAP觸發(fā)寄存器 MOV IAP_TRIG, #0A5H ;送A5H后,ISP/IAP命令即被觸發(fā)啟動(dòng) NOP MOV A, IAP_DATA ;讀出數(shù)據(jù)在IAP_DATA單元,送累加器A

53、LCALL IAP_Disable ;關(guān)閉IAP功能, 清相關(guān)特殊功能寄存器 RET 6200:07:14字節(jié)讀操作也可用MOVC指令, 用MOVC訪(fǎng)問(wèn)數(shù)據(jù)Flash存儲(chǔ)器時(shí), 其地址范圍為F000HF3FFH。例4-12 一個(gè)完整的數(shù)據(jù)Flash操作實(shí)例(續(xù)) ;下面程序是字節(jié)編程, 調(diào)用前需打開(kāi)IAP功能, Byte_Program: ;入口:DPTR=字節(jié)地址, A=需寫(xiě)入的數(shù)據(jù) MOV IAP_CONTR, #ENABLE_IAP ; IAP_CONTR82H, 打開(kāi)IAP功能,設(shè)置Flash操作等待時(shí)間 MOV IAP_CMD, #ISP_IAP_BYTE_PROGRAM ; IAP_CMD02H, 設(shè)置為IAP/ISP字節(jié)讀模式命令 MOV IAP_ADDRH, DPH ;設(shè)置目標(biāo)單元地址的高8位地址0H MOV IAP_ADDRL, DP

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論