5.sdi

来自「我的大学单片机课程案例和ppt」· SDI 代码 · 共 83 行

SDI
83
字号
,,,        ORG     0H
0000,02 00 30,,        LJMP    START
,,,        ORG     30H
0030,75 80 FF,START,START:  MOV     P0,#0FFH        ;P0口置1
0033,75 A0 00,,        MOV     P2,#0H          ;P2口清0
0036,75 30 00,,        MOV     30H,#0          ;初始显示00
0039,75 31 00,,        MOV     31H,#0          ;
003C,90 00 CB,,        MOV     DPTR,#TABLE     ;将数据表TABLE的首地址赋给DPTR
003F,,SCANK,SCANK:
003F,7C 02,,        MOV     R4,#2           ;数码管数目赋给R4
0041,79 30,,        MOV     R1,#30H         ;R1装显示内容的地址
0043,7A 40,,        MOV     R2,#01000000B   ;R2装位选信号
0045,,DISLOOP,DISLOOP:
0045,75 90 FF,,        MOV     P1,#0FFH
0048,C2 92,,        CLR     P1.2    ;P1.2清0,扫描第1行
004A,E5 90,,        MOV     A,P1    ;读键盘至A
004C,54 03,,        ANL     A,#00000011B
004E,64 03,,        XRL     A,#00000011B;判断A的低二位是否为1
0050,60 24,,        JZ      SCANL2  ;如果低二位为1,则无按键,转第二行扫描
0052,12 00 B9,,        LCALL   DELAY10MS;延时10ms(去抖延时)
0055,E5 90,,        MOV     A,P1    ;读键盘至A
0057,54 03,,        ANL     A,#00000011B
0059,64 03,,        XRL     A,#00000011B;判断A的低二位是否为1
005B,60 19,,        JZ      SCANL2  ;如果低二位为1,则无按键,转第二行扫描
005D,E5 90,,        MOV     A,P1    ;读键盘至A
005F,54 03,,        ANL     A,#00000011B;保留低二位的结果
0061,B4 02 09,,        CJNE    A,#00000010B,NOK0;不是K0键,转NOK0
0064,75 30 02,,        MOV     30H,#2  ;是K0键将30H地址赋值为2
0067,75 31 03,,        MOV     31H,#3  ;将31H地址赋值为3
006A,02 00 A4,,        LJMP    DISPLAY ;转显示子程序
006D,75 30 08,NOK0,NOK0:   MOV     30H,#8  ;不是K0键则是K1。将30H地址赋值为8
0070,75 31 09,,        MOV     31H,#9  ;将31H地址赋值为9
0073,02 00 A4,,        LJMP    DISPLAY ;转显示子程序
0076,75 90 FF,,SCANL2 :MOV     P1,#0FFH
0079,C2 93,,        CLR     P1.3    ;P1.3清0,扫描第2行
007B,E5 90,,        MOV     A,P1    ;读键盘至A
007D,54 03,,        ANL     A,#00000011B
007F,64 03,,        XRL     A,#00000011B;判断A的低二位是否为1
0081,60 21,,        JZ      DISPLAY ;如果低二位为1,则无按键,转DISPLAY
0083,12 00 B9,,        LCALL   DELAY10MS;延时10ms(去抖延时)
0086,E5 90,,        MOV     A,P1    ;读键盘至A
0088,54 03,,        ANL     A,#00000011B
008A,64 03,,        XRL     A,#00000011B;判断A的低二位是否为1
008C,60 16,,        JZ      DISPLAY ;如果低二位为1,则无按键,转DISPLAY
008E,E5 90,,        MOV     A,P1    ;读键盘至A
0090,54 03,,        ANL     A,#00000011B;保留低二位的结果
0092,B4 02 09,,        CJNE    A,#00000010B,NOK2;不是K2键,转NOK2
0095,75 30 06,,        MOV     30H,#6  ;是K2键将30H地址赋值为6
0098,75 31 08,,        MOV     31H,#8  ; 将31H地址赋值为8
009B,02 00 A4,,        LJMP    DISPLAY ;转显示子程序
009E,75 30 07,NOK2,NOK2:   MOV     30H,#7  ;不是K2,则一定是K3。将30H地址赋值为7
00A1,75 31 07,,        MOV     31H,#7  ;将31H地址赋值为7
,,,
00A4,E7,DISPLAY,DISPLAY:MOV     A,@R1   ;R1中的数据作为地址,取数据给A
00A5,93,,        MOVC    A,@A+DPTR;将(A+DPTR)地址中的值赋给A
00A6,8A A0,,        MOV     P2,R2   ;选择第一个数码管
00A8,F5 80,,        MOV     P0,A    ;送到P0口数码管显示
00AA,12 00 C2,,        LCALL   DELAY   ;显示延时
00AD,EA,,        MOV     A,R2    ;位选信号左移
00AE,23,,        RL      A       ;
00AF,FA,,        MOV     R2,A    ;
00B0,09,,        INC     R1      ;下一个显示的内容的地址
00B1,DC 03,,        DJNZ    R4,DT   ;显示完转DT
00B3,02 00 3F,,        LJMP    SCANK   ;重新开始扫描
00B6,02 00 45,DT,DT:     LJMP    DISLOOP
00B9,,DELAY10MS,DELAY10MS:
00B9,7E 14,,        MOV     R6,#20
00BB,7F C8,D1,D1:     MOV     R7,#200
00BD,DF FE,D2,D2:     DJNZ    R7,D2
00BF,DE FA,,        DJNZ    R6,D1
00C1,22,,        RET
00C2,,DELAY,DELAY:
00C2,7E 64,,        MOV     R6,#100
00C4,7F 64,D3,D3:     MOV     R7,#100
00C6,DF FE,D4,D4:     DJNZ    R7,D4
00C8,DE FA,,        DJNZ    R6,D3
00CA,22,,        RET
00CB,C0 F9 A4 B0,TABLE,TABLE:  DB      0C0H,0F9H,0A4H,0B0H             ;0,1,2,3
00CF,99 92 82 F8,,        DB      99H,92H,82H,0F8H,80H,90H        ;4,5,6,7,8,9
000E,,,        END
,,,
,,,

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?