前面介紹了Keil 軟件的使用,從中我們可以看到Keil 的強大功能,不過,對于初學者
來說,還有些不直觀,調試過程中看到的是一些數(shù)值,并沒有看到這些數(shù)值所引起的外圍電
路的變化,例如數(shù)碼管點亮、發(fā)光管發(fā)光等。為了讓初學者更好地入門,筆者利用Keil 提
供的AGSI 接口開發(fā)了兩塊仿真實驗板。
這兩塊仿真板將枯燥無味的數(shù)字用形象的圖形表達出來,可以使初學者在沒有硬件時就能感受到真實的學習環(huán)境,降低單片機的入門門檻。圖1 是鍵盤、LED 顯示實驗仿真板的圖,從圖中可以看出,該板比較簡單,有在P1 口接有8 個發(fā)光二管,在P3 口接有4 個按鈕,圖的右邊給出了原理圖。
圖2 是另一個較為復雜的實驗仿真板。在該板上有8 個數(shù)碼管,16 個按鍵(接成4*4 的矩陣式),另外還有P1 口接的8個發(fā)光管,兩個外部中斷按鈕,一個帶有計數(shù)器的脈沖發(fā)生器等資源,顯然,這塊板可以完成更多的實驗。
一、實驗仿真板的安裝
這兩塊仿真實驗板實際上是兩個dll 文件,名稱分別是ledkey.dll 和simboard.dll,安裝時只要根據(jù)需要將這兩個或某一個文件拷貝到keil 軟件的c51bin 文件夾中即可。
二、實驗仿真板的使用
要使用仿真板,必須對工程進行設置,設置的方法是點擊Project->Option for Target‘Target1’打開對話框,然后選中Debug 標簽頁,在Dialog :Parameter:后的編緝框中輸入-d 文件名。例如要用ledkey.dll(即第一塊仿真板)進行調試,就輸入-dledkey,如圖3所示,輸入完畢后點擊確定退出。編譯、連接完成后按CTRL+F5 進入調試,此時,點擊菜
單Peripherals,即會多出一項“鍵盤LED 仿真板(K)”,選中該項,即會出現(xiàn)如圖1 的界面,
鍵盤、LED 顯示實驗仿真板
圖2 單片機實驗仿真板
同樣,在設置時如果輸入-dsimboard 則能夠調出如
圖2 的界面。
第一塊仿真板的硬件電路很簡單,電路圖已在板上,第二塊板實現(xiàn)的功能稍復雜,其鍵盤和數(shù)碼
顯示管部份的電路原理圖如圖4 所示。下表給出了常用字形碼,讀者也可以根據(jù)圖中的接線自行寫出
其它如A、B、C、D、E、F 等的字形碼。 除了鍵盤和數(shù)碼管以外,P1 口同樣也接有8 個發(fā)光二極管,連接方式與圖1 相同;脈沖發(fā)生器是接入T0 即P3.4 引腳。
0c0h 0f9h 0a4h 0b0h 99h 92h 82h 0f8h 80h 90h 0FFH
0 1 2 3 4 5 6 7 8 9 消隱
三、實例調試
以下以一個稍復雜的程序為例,說明鍵盤、LED 顯示實驗仿真板的使用。該程序實現(xiàn)
的是可控流水燈,接P3.2 的鍵為開始鍵,按此鍵則燈開始流動(由上而下),接P3.3 的鍵
為停止鍵,按此鍵則停止流動,所有燈暗,接P3.4 的鍵為向上鍵,按此鍵則燈由上向下流
動,接P3.5 的鍵為向下鍵,按此鍵則燈由下向上流動。
例8:
UpDown BIT 00H ;上下行標志
StartEnd BIT 01H ;起動及停止標志
LAMPCODE EQU 21H ;存放流動的數(shù)據(jù)代碼
ORG 0000H
AJMP MAIN
ORG 30H
MAIN:
MOV SP,#5FH
MOV P1,#0FFH
CLR UpDown ;啟動時處于向上的狀態(tài)
h g f e
P0.7
P0.0
P0.5
P0.4
P0.7
P0.6
d c b a
P0.3
P0.2
P0.0
P0.1 P2.7
P2.0
P2.7
P2.6
P2.5
P2.4
P2.3
P2.2
P2.1
P2.0 驅
動
P3.0
P3.1
P3.2
P3.5
P3.3
P3.4
P3.6
P3.7
2 3
6 7
A B
E F
0 1
4 5
8 9
VCC C D 89C51
[!--empirenews.page--]
圖4 實驗仿真板2 數(shù)碼管和鍵盤部份的電路圖
圖3 實驗仿真板的設置
Keil 軟件實全教程(五)
CLR StartEnd ;啟動時處于停止狀態(tài)
MOV LAMPCODE,#01H ;單燈流動的代碼
LOOP: ACALL KEY ;調用鍵盤程序
JNB F0,LNEXT ;如果無鍵按下,則繼續(xù)
ACALL KEYPROC ;否則調用鍵盤處理程序
LNEXT: ACALL LAMP ;調用燈顯示程序
AJMP LOOP ;反復循環(huán),主程序到此結束
;延時程序,鍵盤處理中調用
DELAY: MOV R7,#100
D1: MOV R6,#100
DJNZ R6,$
DJNZ R7,D1
RET
KEYPROC:
MOV A,B ;從B 寄存器中獲取鍵值
JB ACC.2,KeyStart ;分析鍵的代碼,某位被按下,則該位為1
JB ACC.3,KeyOver
JB ACC.4,KeyUp
JB ACC.5,KeyDown
AJMP KEY_RET
KeyStart:
SETB StartEnd ;第一個鍵按下后的處理
AJMP KEY_RET
KeyOver:
CLR StartEnd ;第二個鍵按下后的處理
AJMP KEY_RET
KeyUp:
SETB UpDown ;第三個鍵按下后的處理
AJMP KEY_RET
KeyDown:
CLR UpDown ;第四個鍵按下后的處理
KEY_RET:
RET
KEY:
CLR F0 ;清F0,表示無鍵按下。
ORL P3,#00111100B ;將P3 口的接有鍵的四位置1
MOV A,P3 ;取P3 的值
ORL A,#11000011B ;將其余4 位置1
CPL A ;取反
JZ K_RET ;如果為0 則一定無鍵按下
CALL DELAY ;否則延時去鍵抖
ORL P3,#00111100B
MOV A,P3
ORL A,#11000011B
Keil 軟件實全教程(五)
CPL A
JZ K_RET
MOV B,A ;確實有鍵按下,將鍵值存入B 中
SETB F0 ;設置有鍵按下的標志
;以下的代碼是可以被注釋掉的,如果去掉注釋,就具有判斷鍵是否釋放的功能,否則
沒有
K_RET: ;ORL P3,#00111100B ;此處循環(huán)等待鍵的釋放
;MOV A,P3
;ORL A,#11000011B
;CPL A
;JZ K_RET1 ;讀取的數(shù)據(jù)取反后為0 說明鍵釋放了
;AJMP K_RET
;K_RET1:CALL DELAY ;消除后沿抖動
RET
D500MS: ;流水燈的延遲時間
MOV R7,#255
D51: MOV R6,#255
DJNZ R6,$
DJNZ R7,D51
RET
LAMP:
JB StartEnd,LampStart ;如果StartEnd=1,則啟動
MOV P1,#0FFH
AJMP LAMPRET ;否則關閉所有顯示,返回
LampStart:
JB UpDown,LAMPUP ;如果UpDown=1,則向上流動
MOV A,LAMPCODE
RL A ;實際就是左移位而已
MOV LAMPCODE,A
MOV P1,A
LCALL D500MS
LCALL D500MS
AJMP LAMPRET
LAMPUP:
MOV A,LAMPCODE
RR A ;向下流動實際就是右移
MOV LAMPCODE,A
MOV P1,A
LCALL D500MS
LAMPRET:
RET
END
將程序輸入并建立工程文件,設置工程文件,在Debug 標簽頁中加入“-dledkey”,匯
編、連接文件,按Ctrl+F5 開始調試,打開仿真板,使用F5 功能鍵全速運行,可以看到所
Keil 軟件實全教程(五)
有燈均不亮,點擊最上面的按鈕,立即會看到燈流動起來了,點擊第二個按鍵,燈將停止流
動,再次點擊第一個按鈕,使燈流動起來,點擊第三個按鈕,可以發(fā)現(xiàn)燈流動的方向變了,
點擊第四個按鈕,燈的流動方向又變回來了。如果沒有出現(xiàn)所描述的現(xiàn)象,可以使用單步、
過程單步等調試手段進行調試,在進行調試時實驗仿真板會隨時顯示出當前的情況,是不是
非常的直觀和方便呢?
下面的一個例子是關于第二塊實驗仿真板的,演示點亮8 位數(shù)碼管。例9:
ORG 0000h
JMP MAIN
ORG 30H
MAIN:
MOV SP,#5FH
MOV R1,#08H
MOV R0,#58H ;顯示緩沖區(qū)首地址
MOV A,#2
INIT:
MOV @R0,A ;初始化顯示緩沖區(qū)
INC A
INC R0
DJNZ R1,INIT ;將0-7 送顯示緩沖區(qū)
LOOP:
CALL DISPLAY
JMP LOOP
;主程序到此結束
DISPLAY:
MOV R0,#7FH ;列選擇
MOV R7,#08H ;共有8 個字符
MOV R1,#58H ;顯示緩沖區(qū)首地址
AGAIN:
MOV A,@R1
MOV DPTR,#DISPTABLE
MOVC A,@A+DPTR
MOV P0,A
MOV P2,R0
MOV A,R0
RR A
MOV R0,A
INC R1
DJNZ R7,AGAIN
RET
DISPTABLE: DB 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,0FFH ;字形碼表
END
這一程序內(nèi)部RAM 中58H 到5FH 被當成是顯示緩沖區(qū),主程序中用2-9 填充該顯示
區(qū),然后調用顯示程序顯示2-9。這里是用了最簡單的逐位顯示的方式編寫的顯示程序。
最后介紹一個小小技巧,將鼠標移入按鈕區(qū)域,按下左鍵,按鈕顯示被按下,不要放開
Keil 軟件實全教程(五)
鼠標左鍵,將光標移出按鈕區(qū)域,松開左鍵,可以看到,按鈕仍處于按下狀態(tài),利用這一功
能,在需要I/O 口長期處于低電平時,你就不必一直用手按著鼠標的左鍵啦。