微控制器彙編案例之統計正負數個數

2022-07-09 14:15:11 字數 3715 閱讀 4506

這是我微控制器實驗作業的原始碼,統計正負數個數。寫得不好,僅供參考。如有bug,歡迎指正。

;;;;本程式從鍵盤獲取輸入,並統計輸入的正整數和負整數的個數,結果存於40h、41h;

;;;;此處把0歸於正數。數值範圍 -128 - 127

org 00h

lcall getkey ;從鍵盤獲取資料,輸入的必須是十進位制整數,可帶負號,每個整數之間必須有其他字元

lcall static ;統計正負數個數

sjmp $

;; 統計正負數個數

static:

mov r1, #30h ;資料位址指標

mov 41h, #00h ;統計正數個數 由於統計用位址單元與資料區單元很近,資料區最多存放16個資料

mov 40h, #00h ;統計負數個數

mov 90h, r7

mov r2, 90h ;r2存放資料個數

whil: ;取下乙個數,判斷正負

mov a, @r1

jb acc.7, nege

inc 40h ;正數

sjmp incr

nege:

inc 41h ;負數

incr:

inc r1

djnz r2, whil

ret;;串列埠通訊模式1初始化

initmod1:

mov tmod, #20h ; 設定t1為模式2

mov tl1, #0e8h ; 裝入定時常數, 波特率1200bit/s

mov th1, #0e8h ; 自動重灌

mov scon, #50h ;設定序列通訊模式1 ,允許接收

setb tr1 ; 啟動t1

ret;;;獲取鍵盤輸入,資料暫存50h, 再轉換成數字存進30h

getkey:

lcall string ;輸出提示字串

lcall input ;獲取鍵盤輸入的字串

lcall deci

ret;提示字串:enter a group decimal integer:

msg: db 0x45,0x6e,0x74,0x65,0x72,0x20,0x61,0x20,0x67,0x72,0x6f,0x75,0x70,0x20,0x64,0x65,0x63,0x69,0x6d,0x61,0x6c,0x20,0x69,0x6e,0x74,0x65,0x67,0x65,0x72,0x3a,0x00

;;傳送字串

string:

lcall initmod1 ;串列埠通訊模式1初始化

mov dptr, #msg ;取傳送資料區首位址

show:

clr a

movc a, @a+dptr

jz finish ;檢查字元是否為結束標誌0h, a=0,則字元輸出完成

mov sbuf, a ;在uart視窗顯示字元

clr ti

jnb ti, $

inc dptr

sjmp show

finish:

clr tr1 ;關閉定時器t1

ret;;讀取鍵盤輸入字串並存入以50h為首位址的單元

input:

lcall initmod1 ;串列埠通訊模式1初始化

mov r0, #50h ;設接收資料的位址指標為r0

read: ;從uart視窗讀取資料並列印

clr ri

jnb ri, $

mov a, sbuf

cjne a, #0dh, continue ;檢查回車字元0dh, 不是回車繼續讀取

sjmp readover ;回車字元,結束讀取

continue: ;列印使用者輸入並儲存

mov sbuf, a ;列印接收到的資料

clr ti

jnb ti, $

cjne a, #08h, store ;檢查退格字元\b, 不是退格,則儲存資料

dec r0 ;是退格,資料指標回退

sjmp read

store:

mov @r0, a ;儲存資料

inc r0 ;後移資料指標

sjmp read ;迴圈讀取

readover: ;讀取結束,在字串後加上結束符0h

mov @r0, #00h

clr tr1 ;關閉定時器

ret;;將首位址為50h的單元中的字串轉化為十進位制數,存30h, 個數存r7

;;可轉化的字串格式:-12, 30, -45 每個數之間必須有其他字元隔開 -12@34 也行 表示-12和34

deci:

mov r3, #30h ;r3指向存放十六進製制數的位址

mov r1, #90h ;r1指向存放中間結果的位址

mov r2, #00h ;r2存放中間結果的位數

mov r0, #50h ;r0指向資料來源

mov r7, #00h ;r7存放最後結果個數

sjmp wh

while:

inc r0 ;有些分支直接跳轉過來,r0還沒加1,只好這樣做了。

wh:mov a, @r0

jnz trans ;

setb 0d1h ;a=0,為字串結束標誌, 標記結束

sjmp derive ; 並跳轉,合成最後乙個整數

trans:

clr c

subb a, #30h ;將字元轉化為數字

jc neg ;c=1,a<30h。不是數字, 跳轉去判斷是否為負號

cjne a, #0ah, c1 ;大於等於10,c=0

c1:jnc derive ;大於等於10, c=0,不是數字,數字結束轉去合成

mov @r1, a ;將轉化後的數字存進中間結果單元

inc r1 ;後移中間結果位置

inc r2 ;記錄中間結果位數

sjmp while

neg:

mov a, @r0

clr c

subb a, #2dh

jnz derive ;不是負號,轉去合成

setb f0 ;標記為負數

sjmp while

derive: ;將中間結果合成為最後結果

cjne r2, #00h, deri ;判斷r2是否為0

jnb 0d1h, while ;判斷是否結束 0d1h != 1 繼續迴圈

sjmp over ;0d1h = 1 結束

deri:

mov r1, #90h ;將r1重新指向開始位置

clr a

der:

mov b, #0ah

mul ab

add a, @r1

inc r1

djnz r2, der

jnb f0, stor ;是正數,跳轉,直接儲存

xrl a, #0ffh

inc a

clr f0

stor:

mov 90h, a ;先把結果存進90h, 再存進30h

mov a, r3 ;r3不能間址,只好借助其他暫存器

inc r3

inc r7

mov r1, a

mov @r1, 90h

mov r1, #90h

jnb 0d1h, while ;結束標誌位不為1,則繼續讀取字串

over:

retend

微控制器之認識微控制器

1 什麼是微控制器?微控制器就是一塊整合晶元,專業語言講微控制器就是在一塊矽片上整合了微處理器 儲存器以及各種輸入 輸出介面的晶元。2 什麼是51微控制器?51核心擴充套件出來的微控制器,即相容intel 8051指令系統的整合晶元。51微控制器的標識資訊及封裝型別,如stc 89c51 stc指晶...

tiri微控制器 51微控制器 微控制器組合語言學習

mcs 51微控制器的特殊功能暫存器 符號位址 功能介紹 bf0h b暫存器 acce0h 累加器psw d0h程式狀態字 th2 cdh定時器 計數器2 高8位 tl2 cch定時器 計數器2 低8位 rcap2h cbh外部輸入 p1.1 計數器 自動再裝入模式時初值暫存器高八位 rcap2l ...

微控制器彙編程式設計300例 微控制器基礎組合語言程式設計例項

微控制器組合語言程式設計 1 編寫程式,用位處理指令實現 p1.4 p1.0 p1.1 p1.2 p1.3 的邏輯功能。mov c,p1.1 anl c,p1.2 orl c,p1.0 orl c,p1.3 mov p1.3,c 2 編寫程式,若累加器a的內容分別滿足下列條件,則程式轉到lable儲...