|
單片機(jī)學(xué)習(xí)筆記
一、 單片機(jī)的指令系統(tǒng)
1,指令長(zhǎng)度可分為:?jiǎn)巫止?jié),雙字節(jié),三字節(jié)。
2,指令的格式: 標(biāo)號(hào): 操作碼 操作數(shù)或操作數(shù)地址;注釋
3,試列 DELAY: MOV R3,#0FFH ;一段延時(shí)程序
二、 尋找操作數(shù)
注:以逗號(hào)后面尋找操作數(shù)的方式來確定是什么尋址方式
1,立即數(shù)尋址:立即找到操作數(shù),例:MOV A , #55H
例:MOV Rn, #01H
Rn:工作寄存器00H——1FH
MOV DPTR, #1FFFH
DPTR:特殊功能寄存器兩個(gè)8位DPH,DPL唯一一條16位傳輸指令
MOV 70H(direct), #88H
Direct:一個(gè)通用單片內(nèi)部RAM地址,且只能是8位地址,要具體寫地址某個(gè)單元
ADD A, #55H
將A的內(nèi)容加上后面這個(gè)立即數(shù),得到的值還要送去累加器A
SUB A, #01
將A的內(nèi)容減去后面這個(gè)立即數(shù),得到的差值還要送給累加器A
關(guān)鍵字符:“#”帶這個(gè)字符說明就是一個(gè)數(shù)據(jù)。
2,直接尋址:已知一個(gè)操作數(shù)的地址單元,可根據(jù)這個(gè)地址找到這個(gè)操作數(shù),直接給出單元的地址。
例:MOV A, 20H
將20H這個(gè)地址單元里的操作數(shù)送到累加器A
MOV Rn, 30H
Rn:工作寄存器
MOV @Ri, 30H
ADD A, 30H
SUB A, 30H
3,寄存器尋址:以尋找已知寄存器地址的方式尋找。
例:MOV P1, A
把A寄存器里的值附到P1口
MOV P1, R4
將R4里面的內(nèi)容送P1口
CLR A
清除寄存器A里的值
4,寄存器間接尋址:先找到一個(gè)寄存器里存放操作數(shù)的內(nèi)部RAM地址再找到這個(gè)地址才能找到操作數(shù)。
例:MOV A, @R0
將R0寄存器的內(nèi)容作為地址,這個(gè)地址所確定的單元的內(nèi)容送到累加器A
MOVX A, @DPTR
在外部寄存器DPTR里找到內(nèi)容作為地址,以這個(gè)地址找到所對(duì)應(yīng)的單元里的內(nèi)容送再到累加器A
注:間接寄存器尋址只能在R0、R1、DPTR,里尋址
5,變址尋址:將兩個(gè)寄存器(A、DPTR、PC)相加所得到的值作為程序存儲(chǔ)區(qū)的地址來找到程序存儲(chǔ)區(qū)里的操作數(shù)
例:MOVC A,@A+DPTR
將寄存器A和DPTR兩個(gè)值相加所得到的值作為單元地址再尋找程序存儲(chǔ)區(qū)里的操作數(shù)
MOVC A,@A+PC
將寄存器A里的內(nèi)容與下一條將要執(zhí)行的地址相加所得到的值作為單元地址在程序存儲(chǔ)區(qū)尋找操作數(shù)
6,相對(duì)尋址:相對(duì)尋址不需要操作數(shù),只是PC當(dāng)前執(zhí)行地址的一個(gè)轉(zhuǎn)移值,將PC轉(zhuǎn)移到指定的地方再執(zhí)行程序
例:SJMP 03H
將當(dāng)前PC所執(zhí)行的地址加03H所得到的值作為執(zhí)行地址
7,位尋址:查找單元里某位的值
位尋址區(qū)20H—2FH。
例:SETB 3DH
將3DH里的值改成1
CLR 3DH
將3DH里的值改0
三、 *指令系統(tǒng)
1、 數(shù)據(jù)傳送指令(29條)
1)MOV <目的操作數(shù)>,<源操作數(shù)>8位傳送指令(15條)
2)16位數(shù)據(jù)傳送指令(1條)
MOV DPTR,#date16
3)外部數(shù)據(jù)傳遞指令(4條)
MOVX <目的操作數(shù)>,<源操作數(shù)>
取數(shù)
送數(shù)
3)MOVC單片機(jī)與ROM之間的數(shù)據(jù)傳送
MOVC A,@A+DPTR
MOVC A,@A+PC
4)交換類指令(5條)
字節(jié)交換指令(3條)
XCH
低半字節(jié)交換指令(1條)低4位進(jìn)行交換
XCHD A ,@Ri 這里假設(shè)i=0
高半字節(jié)交換指令===高4位交換
SWAP A
交換他自己的高4位和低4位
5)堆棧操作指令(2條)
PUSH direct POP direct(壓入和彈出)復(fù)位后SP=07H
壓 保護(hù)現(xiàn)場(chǎng)
PUSH 33H
PUSH 34H
彈
POP 恢復(fù)現(xiàn)場(chǎng)
堆棧原則:后進(jìn)先出
2、 算術(shù)運(yùn)算類指令(24條)
ADD A ,
ADDC A, A+Rn+Cy
Cy:是一個(gè)進(jìn)位標(biāo)志
SUBB A,
——BCD碼 調(diào)整指令(1條)
DA A
含義:以二進(jìn)制的形式來描述十進(jìn)制數(shù)。
進(jìn)行ADD或ADDC加法運(yùn)算的后面
8421:BCD碼
乘法指令(條)
MUL AB
將A和B里的內(nèi)容相乘
A中存放結(jié)果的低8位
B中存放結(jié)果的高8位
例:MOV A, #02H
MOV B, #03H
MUL AB
A(06H) B(00H)
MOV A, #20(14H)
MOV B, #20
MUL AB
A(90) B(01)
除法指令(1條)
DIV AB
例MOV A, #25
MOV B, #03
DIV AB;
A(08H) B(01H)
A中存放商 B中存放余數(shù)
邏輯運(yùn)算指令(24條)
邏輯與指令(6條)
定義:和0相與都為0,和1相與原值不變
邏輯或指令(6條)
定義:與1相或都是1,與0相或原值不變
邏輯異或指令(6條)
定義:相同取0,和1相異或取反,和0異或保留原值
累加器A清0和取反指令(非運(yùn)算)
CLR A 清0
CPL A 取反
控制轉(zhuǎn)移指令(17條)
——循環(huán)移位指令
RL A 向左移 < < < < < < < 小循環(huán)
RR A 向右移 > > > > > > >
RLC A Cy < < < < < 大循環(huán)
RRC A Cy > > > > >
應(yīng)用:跑馬燈
例:MOV A, #01H 8個(gè)燈循環(huán)點(diǎn)亮
MOV P1, A
RL A
MOV P1, A
*——無條件轉(zhuǎn)移指令(4條)
無條件/有條件
1)長(zhǎng)轉(zhuǎn)移指令:LJMP AAAAH; AAAAH >PC
該指令可以轉(zhuǎn)移在64KB程序存儲(chǔ)區(qū)里
2)絕對(duì)轉(zhuǎn)移指令:AJMP addr11; addr11 >PC.10----PC.0
轉(zhuǎn)移范圍為2KB/頁地址(現(xiàn)在不常用)
3)相對(duì)轉(zhuǎn)移指令(短轉(zhuǎn)移指令):SJMP 03H
轉(zhuǎn)移范圍 -128—+127字節(jié)內(nèi)
補(bǔ)碼:正數(shù)的補(bǔ)碼就是其原碼本身,負(fù)數(shù)的補(bǔ)碼是將原碼取反再加1(符號(hào)位不變)
4)散轉(zhuǎn)指令:JMP @A+DPTR
將DPTR中的內(nèi)容作為基地址,通過修改A的內(nèi)容實(shí)現(xiàn)散轉(zhuǎn)
—條件轉(zhuǎn)移指令(8條)
1)累加器A判0指令(2條)
2)判別位標(biāo)志CY狀態(tài)指令(2條)
3)判別某位Bit狀態(tài)指令(3條)
4)減1非0轉(zhuǎn)移指令(2條)
5)比較轉(zhuǎn)移指令(4條)
條件轉(zhuǎn)移類指令范例(一)
將00H—0FH這16個(gè)數(shù)順序地置入片內(nèi)RAM 20H—2FH單元中 。
MOV R0, #20H
MOV R7, #0FH
CLR A
LOOP: MOV @R0, A
INC A
INC R0
DJNZ R7, LOOP
SJMP $
條件轉(zhuǎn)移類指令范例(二)
MOV R0, #20
MOV R7, #0FH ;這句話不用寫改為10H
CLR A
LOOP: MOV @R0, A
INC A
INC R0
CJNE A, #0FH, LOOP ;這里也要改成10H
SJMP $
——調(diào)用和返回指令(8條)
1) 絕對(duì)調(diào)用指令(1條)
2)長(zhǎng)調(diào)用指令(1條)
3)返回指令
這種程序常常叫作子程序。子程序最后要
位操作指令(17條)
1、 位傳送指令
2、 位置位和位清0指令
3、 位運(yùn)算指令
例:邏輯電路 L=D(E+F)+/G
MOV C, E
ORL C, F
ANL C, D
ORL C, /G
MOV 20H, C
常用偽指令(17)
Powered by 單片機(jī)教程網(wǎng)