伊莉討論區

標題: 8051程式碼 求解析 [打印本頁]

作者: wingordon    時間: 2015-5-12 07:27 PM     標題: 8051程式碼 求解析

將8個指撥開關設定值對應輸出至P0的7段顯示器
      SW0 ON --> 顯示數字 0
      SW1 ON --> 顯示數字 1
      ...
      SW7 ON --> 顯示數字 7      
      其它按鍵狀況則7段顯示器全滅.
      程式中需建立七段顯示器的字型表
      實習板: SimLab-8051_指撥開關_8個LED實習板 + SimLab-8051_1個七段式LED(共陽)實習板               

                MOV        P0,#0FFH
                MOV        P2,#11111111B
START:             
                MOV        DPTR,#TABLE
                MOV        A,P1
                CPL        A
D0:                CJNE        A,#00000001B,D1
                MOV        R0,#0
                MOV        A,R0
                MOVC        A,@A+DPTR
                MOV        P2,A
                AJMP        START            
D1:                CJNE        A,#00000010B,D2         
                MOV        R0,#1
                MOV        A,R0
                MOVC        A,@A+DPTR
                MOV        P2,A
                AJMP        START        
D2:                CJNE        A,#00000100B,D3
                MOV        R0,#2
                MOV        A,R0
                MOVC        A,@A+DPTR
                MOV        P2,A
                AJMP        START
D3:                CJNE        A,#00001000B,D4
                MOV        R0,#3
                MOV        A,R0
                MOVC        A,@A+DPTR
                MOV        P2,A
                AJMP        START
D4:                CJNE        A,#00010000B,D5
                MOV        R0,#4
                MOV        A,R0
                MOVC        A,@A+DPTR
                MOV        P2,A
                AJMP        START
D5:                CJNE        A,#00100000B,D6
                MOV        R0,#5
                MOV        A,R0
                MOVC        A,@A+DPTR
                MOV        P2,A
                AJMP        START
D6:                CJNE        A,#01000000B,D7
                MOV        R0,#6
                MOV        A,R0
                MOVC        A,@A+DPTR
                MOV        P2,A
                AJMP        START
D7:                CJNE        A,#10000000B,D8
                MOV        R0,#7
                MOV        A,R0
                MOVC        A,@A+DPTR
                MOV        P2,A
                AJMP        START  
D8:                MOV        P0,#0
                MOV        P2,#11111111B     
                AJMP        START

TABLE:        DB        01000000B
                DB        01111001B
                DB        00100100B
                DB        00110000B
                DB        00011001B
                DB        00010010B
                DB        00000010B
                DB        01011000B
                DB        00000000B
                DB        00010000B
         
                END

可以麻煩幫我在程式後面寫上註解嗎?


作者: bowk    時間: 2015-6-20 06:56 PM

asm指令google可以查得到
D0:CJNE A,#00000001B,D1 掃portA狀態
狀態不是就跳下去D1
d1用同樣方法狀態不是就跳到d2
如果是就根據table亮
作者: iamlilo    時間: 2015-7-2 10:51 PM

本帖最後由 iamlilo 於 2015-7-2 10:52 PM 編輯

    MOV        P0,#0FFH                     "不知道
                MOV        P2,#11111111B "關閉七段顯示器(共陽)
START:              
                MOV        DPTR,#TABLE    "將指標指向table
                MOV        A,P1                 "將指撥開關(開啟為0,關閉為1)的資料丟入acc內
                CPL        A                       判定哪一個開啟,反向是因為指撥開關的特性,之後
D0:                CJNE        A,#00000001B,D1 "判別哪一個開啟,cjne是相同向下執行,不
                MOV        R0,#0                       "同跳躍到後面的位置,然後利用r6放是acc
                MOV        A,R0                          中,來控制指標的準確位置(之前是指向這
                MOVC        A,@A+DPTR              個資料庫,現在是讀取內部資料)然後跳回
                MOV        P2,A                          start
                AJMP        START            
D1:                CJNE        A,#00000010B,D2         
                MOV        R0,#1
                MOV        A,R0
                MOVC        A,@A+DPTR
                MOV        P2,A
                AJMP        START        
D2:                CJNE        A,#00000100B,D3
                MOV        R0,#2
                MOV        A,R0
                MOVC        A,@A+DPTR
                MOV        P2,A
                AJMP        START
D3:                CJNE        A,#00001000B,D4
                MOV        R0,#3
                MOV        A,R0
                MOVC        A,@A+DPTR
                MOV        P2,A
                AJMP        START
D4:                CJNE        A,#00010000B,D5
                MOV        R0,#4
                MOV        A,R0
                MOVC        A,@A+DPTR
                MOV        P2,A
                AJMP        START
D5:                CJNE        A,#00100000B,D6
                MOV        R0,#5
                MOV        A,R0
                MOVC        A,@A+DPTR
                MOV        P2,A
                AJMP        START
D6:                CJNE        A,#01000000B,D7
                MOV        R0,#6
                MOV        A,R0
                MOVC        A,@A+DPTR
                MOV        P2,A
                AJMP        START
D7:                CJNE        A,#10000000B,D8
                MOV        R0,#7
                MOV        A,R0
                MOVC        A,@A+DPTR
                MOV        P2,A
                AJMP        START  
D8:                MOV        P0,#0
                MOV        P2,#11111111B     
                AJMP        START

TABLE:        DB        01000000B
                DB        01111001B
                DB        00100100B
                DB        00110000B
                DB        00011001B
                DB        00010010B
                DB        00000010B
                DB        01011000B
                DB        00000000B
                DB        00010000B
         
                END
是說這些地方可以自己推吧??
作者: wingordon    時間: 2015-7-3 01:30 AM

謝謝回復喔!

以上程式碼已經都全部了解意思嚕

謝謝幫忙^^~
作者: army1010    時間: 2015-8-6 01:24 AM

稍為幫你優化一下,這個該不會是暑假作業吧?

                MOV        P0,#0FFH
                MOV        P2,#11111111B
START:              
                MOV        DPTR,#TABLE
                MOV        A,P1
                CPL        A
                INC          R0                CJE        A,#00000001B,D8
                INC          R0
                CJE        A,#00000010B,D8
                INC          R0
                CJE        A,#00000100B,D8
                INC          R0
                CJE        A,#00001000B,D8
                INC          R0
                CJE        A,#00010000B,D8
                INC          R0
                CJE        A,#00100000B,D8
                INC          R0
                CJE        A,#01000000B,D8
                INC          R0
                CJE        A,#10000000B,D8
                MOV        R0,#0
D8:          MOV        A,R0
                MOVC        A,@A+DPTR
                MOV        P2,A
                AJMP        START

TABLE:      DB        11111111B
                DB        01000000B
                DB        01111001B
                DB        00100100B
                DB        00110000B
                DB        00011001B
                DB        00010010B
                DB        00000010B
                DB        01011000B
         
                END






歡迎光臨 伊莉討論區 (http://a401.file-static.com/) Powered by Discuz!