[問題] 我想用C51模擬串列式輸出
我想用C51系列單晶片模擬資料串列式輸出,買了一本書來看,並且大致上有了流程的草稿
,不過因為不是很確定某些細節能否依照自己的想法處理,書上也沒有提供太多資料可參
考,所以想請大家幫我看看是否可行?
想要做到的功能:
先從PORT1(PORT1.0~PORT1.7)讀入8-BIT的數值,接著經過運算處理,再從PORT2.1從8-BIT
數值的最低位元依序丟出。
我的想法是:
先讀入8-BIT的數值,接著把此數值與0000 0001做AND,以保留最後一個BIT,接著把這個
BIT從PORT2.1丟出,然後對從PORT1讀入的數值做右旋,並且重複AND及丟出的動作。
這是我的想像流程:
假設讀入數值是 01010101
AND 00000001
得到 00000001(1-BIT的數值:1)
丟到PORT2.1 00000001(PORT2.1輸出1)
右旋讀入數值 10101010
AND 00000001
得到 00000000(1-BIT的數值:0)
丟到PORT2.1 00000000(PORT2.1輸出0)
.
.
.
重複8次相同動作就可以把8-BIT的數值轉換成1-BIT數值依序輸出了。
讀入數值並且存入暫存器中書上有很詳盡的說明,所以我就省略了,假設讀入的8-BIT數值
我存放在暫存器R1,我的推測的寫法是:
MOV R0,#8 ;R0為右旋8次用的計數暫存器
MOV A,R1 ;R1是從PORT1讀入的數值
LOOP: MOV R2,A ;將目前右旋結束後的值(8-BIT)保留於R2
ANL A,#00000001 ;把A中的值與00000001做AND並丟回A
CALL CHECK ;進入CHECK副程式
MOV A,R2 ;將剛剛右旋結束的值(8-BIT)讀回A
RR A ;右旋A中的值
DJNZ R0,LOOP ;計數暫存器R0的值-1如果不是0(還沒轉8次)回到LOOP
.
.
.
CHECK: JZ LOW ;如果暫存器A為0跳至LOW
JNZ HIGH ;如果暫存器A不為0(是1)跳至HIGH
HIGH: SEBT P2.1 ;讓PORT2.1為1
LOW: CLR P2.1 ;讓PORT2.1為0
RET ;回到主程式
但是有個地方我有點疑問,就是書上有介紹把8-BIT的數值丟入PORT2可以讓8個LED依照數
值發光或不發光,但是像我這樣把1-BIT的數值指定丟到PORT2中的2.1會被接受嗎?另外
對晶片而言0000 0001或是0000 0000這兩種資料,究竟是8-BIT還是1-BIT呢?
-
文有點長,謝謝你耐心的看完,仔細想想還真諷刺,以前專科上實習課總認為一輩子不會
用到這東西所以用得過且過的心態在上課,沒想到事隔多年忽然需要用到,不但掏錢買了
本書,還只花了一週就把一學期的實習內容給硬看完,人生真是難以預料XD
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.230.83.74
→
12/08 06:44, , 1F
12/08 06:44, 1F
→
12/08 06:45, , 2F
12/08 06:45, 2F
→
12/08 08:35, , 3F
12/08 08:35, 3F
→
12/08 08:37, , 4F
12/08 08:37, 4F
推
12/08 11:11, , 5F
12/08 11:11, 5F
→
12/08 11:12, , 6F
12/08 11:12, 6F
→
12/08 11:12, , 7F
12/08 11:12, 7F
→
12/08 12:37, , 8F
12/08 12:37, 8F
→
12/08 12:37, , 9F
12/08 12:37, 9F
→
12/08 12:38, , 10F
12/08 12:38, 10F
推
12/08 12:39, , 11F
12/08 12:39, 11F
→
12/08 12:38, , 12F
12/08 12:38, 12F
推
12/08 12:41, , 13F
12/08 12:41, 13F
※ 編輯: icetofux 來自: 203.67.181.135 (12/08 17:09)
→
12/08 17:09, , 14F
12/08 17:09, 14F
→
12/08 17:10, , 15F
12/08 17:10, 15F
→
12/08 17:11, , 16F
12/08 17:11, 16F
推
12/08 21:47, , 17F
12/08 21:47, 17F
討論串 (同標題文章)