新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機匯編語言(四)

        51單片機匯編語言(四)

        作者: 時間:2016-11-24 來源:網絡 收藏
        8.5功能說明:

        使用4×4矩陣式鍵盤,共有16個按鍵,通過掃描方法控制顯示器輸出0~F十六進制數。

        本文引用地址:http://www.104case.com/article/201611/321012.htm

        程序:JP02.ASM

        01:ORG 00H ;

        02: START: MOV R4,#00H ;

        03: L1: MOV R3,#0F7H ;掃描初值(P3.3=0)

        04: MOV R1,#00H ;取碼指針 設置初值

        05: L2: MOV A,R3 ;開始掃描

        06: MOV P3,A ;將掃描值輸出至P3

        07: MOV A,P3 ;讀入P3值,判斷有無按下 送出行掃描初

        08: MOV R4,A ;存入R4,以判斷是否放開 值(P3.3=0)

        09: SETB C ;C=1

        10: MOV R5,#04H ;掃描P3.4~P3.7

        11: L3: RLC A ;將按鍵值左移一位

        12: JNC KEY ; 有鍵按下C=0,跳至KEY

        13: INC R1 ;C=1沒鍵按下,指針值加1

        14: DJNZ R5,L3 ;4列掃描完畢了? 左移檢測列

        15: MOV A,R3 ;掃描值載入

        16: SETB C ;C=1

        17: RRC A ;掃描下一行

        18: MOV R3,A ;存回掃描寄存器

        19: JC L2 ;C=1,程序轉到L2處

        20: JMP L1 ;C=0則4行已掃描完畢 右移掃描行

        21: KEY: ACALL DELAY ;調延時子程序 消除抖動

        22: D1: MOV A,P3 ;讀入P3值

        23: XRL A,R4 ;與上次讀入值作比較

        24: JZ D1 ;A=0,表示按鍵未放

        25: MOV A,R1 ;按鍵已放開,指針載入A 按鍵釋放從

        26: ACALL DISP ;調用顯示子程序 TABLE取碼

        27: JMP L1 ; 重復掃描

        28: DISP: MOV DPTR,#TABLE ;數據指針指到TABLE

        29: MOVC A,@A+ DPTR ;至TABLE取碼

        30: MOV P0,A ; 輸出

        31: RET ; 子程序返回 顯示子程序

        32: DELAY: MOV R7, #60 ;

        33: MOV R6, #248 ;

        34: DLY1: DJNZ R6, $ ;

        35: DJNZ R7, DLY1 ; 消除抖動

        36: RET ; 延時子程序

        37: TABLE: DB 0C0H, 0F9H, 0A4H,0B0H ;

        39: DB 99H, 92H, 82H, 0F8H ;

        40: DB 80H, 90H, 88H, 83H ;

        41: DB 0C6H, 0A1H, 86H, 8EH ; 編碼表

        42: END ; 程序結束

        中斷

        9.1功能說明:

        單片機P1端口的8個LED作左移右移,不斷循環。當按外部中斷INT0開關K1時,循環停止,轉而使8個LED閃爍4次。之后,又恢復燈的左右移循環。

        程序:ZD01.ASM

        01: ORG 00H ; 起始地址

        02: JMP START ;跳到主程序START

        03: ORG 03H ;INT0中斷起始地址 規定起

        04: JMP EXT0 ;跳到中斷子程序 始地址

        05: START:MOV IE, #10000001B ;INT0中斷開通

        06: MOV IP, #00000001B ;INT0中斷優先

        07: MOV TCON, #00000000B ;INT0為電平觸發

        08: MOV SP, #70H ;設定堆棧指針 中斷設定

        09: LOOP:MOV R0, #8 ; 設置左移位數

        10: MOV A , #0FEH ; 設置左移初值

        11: LOOP1:MOV P1, A ; 輸出至P1

        12: ACALL DELAY ; 調延時子程序

        13: RL A ; 左移一位

        14: DJNZ R0, LOOP1 ; 判斷移動位數 左移

        15: MOV R0, #8 ; 設置右移位數

        16: LOOP2:RR A ; 右移一位

        17: MOV P1, A ; 輸出至P1

        18: LCALL DELAY ; 調延時子程序

        19: DJNZ R0, LOOP2 ; 判斷移動位數

        20: JMP LOOP ; 重設顯示值 右移 左右移

        21: EXT0: PUSH ACC ;將A 值壓入堆棧

        22: PUSH PSW ;將 PSW值壓入堆棧

        23: SETB RS0 ;設定工作寄存器組1 保護

        24: CLR RS1 現場

        25: MOV R0, #4 ; 設置閃爍次數

        26: LOOP3:MOV A, #00H ; A存有P1口欲顯值

        27: MOV P1, A ; P1端口燈亮

        28: LCALL DELAY ; 調延時1秒子程序

        29: CPL A ;將A的值反相

        30: DJNZ R0, LOOP3 ; 判斷閃爍次數 閃爍

        31: POP PSW ;從堆棧取回PSW值 恢復

        32: POP ACC ;從堆棧取回值 A值 現場 中斷

        33: RETI ;返回主程序 子程序

        9.4功能說明:

        開始時P1端口8個LED燈在閃爍。當按外部中斷INT0開關K1時,使一個燈左右移3次。當按外部中斷INT1開關 K2時,使二個燈左右移4次。之后, 8個LED燈恢復閃爍。

        程序:ZD02.ASM

        01: ORG 00H ; 主程序起始地址

        02: JMP START ; 跳到主程序START

        03: ORG 03H ; INT0中斷子程序起始地址

        04: JMP EXT0 ; 跳至中斷子程序EXT0

        05: ORG 13H ; INT1中斷子程序起始地址 地址

        06: JMP EXT1 ; 跳至中斷子程序EXT1 設置

        07: START:MOV IE, #10000101B ; 中斷開通

        08: MOV IP, #00000100B ; INT1優先中斷

        09: MOV TCON, #00000000B ; INT0 、INT1為電平觸發 中斷

        10: MOV SP, #70H ; 設定堆棧在(70 H) 設置

        11: MOV A, #00H ; 設初始值

        12: LOOP: MOV P1,A ; 使P1閃爍

        13: LCALL DELAY ; 調延時子程序

        14: CPL A ; 將A的值反相

        15: JMP LOOP ; 重復循環 閃爍

        16: EXT0: PUSH ACC ; 將A 值壓入堆棧

        17: PUSH PSW ; 將 PSW值壓入堆棧

        18: SETB RS0 ; 保護

        19: CLR RS1 ; 設置寄存器組1 現場

        20: MOV R3,#03 ; 左右移3次

        21: LOOP1:MOV R0, #08 ; 設置左移位數

        22: MOV A ,#0FEH ; 設置左移初值

        23: LOOP2:MOV P1, A ; 輸出至P1

        24: ACALL DELAY ; 調延時子程序

        25: RL A ; 左移一位

        26: DJNZ R0, LOOP2 ; 判斷移動位數

        27: MOV R0,#07 ; 設置右移位數

        28: LOOP3:RR A ; 右移一位

        29: MOV P1, A ; 輸出至P1

        30: LCALL DELAY ; 調延時子程序

        31: DJNZ R0, LOOP3 ; 右移7 位? 左右

        32: DJNZ R3,LOOP1 ; 左右移3次?

        33: POP PSW ; 從堆棧取回PSW值 恢復 EXT0

        34: POP ACC ; 從堆棧取回值 A值 現場 中斷子

        35: RETI ; 返回主程序 程序

        36: EXT1: PUSH ACC ; 將A值壓入堆棧

        37: PUSH PSW ; 將 PSW值壓入堆棧

        38: SETB RS1 ; 設工作組2 ,RS1=1 保護

        39: CLR RS0 ; RS0=0 現場

        40: MOV R3,#04 ;左右移4次

        41: LOOP4:MOV R0, #06 ; 設置左移位數

        42: MOV A ,#0FCH ; 設置左移初值

        43: LOOP5:MOV P1, A ; 輸出至P1

        44: ACALL DELAY ; 調延時子程序

        45: RL A ; 左移一位

        46: DJNZ R0, LOOP5 ; 判斷移動位數

        47: MOV R0,#06 ; 設置右移位數

        48: LOOP6:RR A ; 右移一位

        49: MOV P1, A ; 輸出至P1

        50: LCALL DELAY ; 調延時子程序

        51: DJNZ R0, LOOP6 ; 判斷 左右

        52: DJNZ R3,LOOP4 ; 左右移4次?

        53: POP PSW ; 從堆棧取回PSW值 恢復 EXT1

        54: POP ACC ; 從堆棧取回值 A值 現場 中斷子

        55: RETI ; 返回主程序 程序

        56: DELAY:MOV R5, #20 ; 延時0.2秒子程序

        57: DLY1: MOV R6, #20 ;

        58: DLY2: MOV R7, #248 ;

        59: DJNZ R7, $ ;

        60: DJNZ R6, DLY2 ;

        61: DJNZ R5, DLY ; 延時子

        62: RET ; 程序

        63: END ; 程序結束



        關鍵詞: 51單片機匯編語

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 衡阳市| 江永县| 丰都县| 崇州市| 汕尾市| 晋城| 凭祥市| 綦江县| 江津市| 洮南市| 通河县| 余江县| 双柏县| 富源县| 武隆县| 神木县| 天全县| 怀化市| 绵竹市| 南召县| 资兴市| 东海县| 环江| 班戈县| 常山县| 翁牛特旗| 弥勒县| 肇源县| 娱乐| 义乌市| 拉萨市| 延庆县| 新田县| 思南县| 武清区| 通州区| 二连浩特市| 清丰县| 青川县| 韶关市| 平乐县|