有这样一个问题:按键计数,按一下键,显示数字加一。
两个按键控制分别控制两组数码管,每个按键控制一个两位数码管,显示十进制数,0到99。
题目给定的电路图中,共有四个共阴数码管,用8255的PA来驱动段,位,则使用了单片机P1口,按键使用了P2口。
如下所示:
;8255控制字格式如下:
;+-----+-----+-----+-----+-----+-----+-----+-----+
;|1|PA_FUNC|PA_IO|PC7_4|PB_F|PB_IO|PC3_0|
;+-----+-----+-----+-----+-----+-----+-----+-----+
;|1|0|0|0|1|0|0|1|
;+-----+-----+-----+-----+-----+-----+-----+-----+
;
呵呵,百度这排版格式,把控制字显示的乱七八糟!复制到记事本再看吧。
仿照题目的要求,用汇编语言编写了如下的程序:
ORG0000H
START:
MOVR1,#03H;控制寄存器地址
MOVA,#89H;控制字
MOVX@R1,A;PAPB输出,PC输入
MOVSP,#70H
MOV30H,#01;初始显示8031
MOV31H,#255-8
MOV32H,#03
MOV33H,#255-4
MOV34H,#00
MOV35H,#255-2
MOV36H,#08
MOV37H,#255-1
MOVR4,#0;初值0
MOVR5,#0
MOVR1,#02H;PC
;----------------------------------初始化结束
M_LOOP:
CALLDISP
MOVXA,@R1
JNBACC.0,K1_1
JNBACC.1,K2_1
JMPM_LOOP
;---------------------
K1_1:
CALLDISP
MOVXA,@R1
JNBACC.0,K1_2
JMPM_LOOP
K1_2:
CALLDISP
MOVXA,@R1
JNBACC.0,K1_2
INCR4
CJNER4,#100,K1_3
MOVR4,#0
K1_3:
MOVA,R4
MOVB,#10
DIVAB
MOV34H,B
MOV36H,A
JMPM_LOOP
;---------------------
K2_1:
CALLDISP
MOVXA,@R1
JNBACC.1,K2_2
JMPM_LOOP
K2_2:
CALLDISP
MOVXA,@R1
JNBACC.1,K2_2
INCR5
CJNER5,#100,K2_3
MOVR5,#0
K2_3:
MOVA,R5
MOVB,#10
DIVAB
MOV30H,B
MOV32H,A
JMPM_LOOP;主程序循环
;----------------------------------主程序到此为止
DISP:;显示子程序
PUSHPSW
PUSHACC
SETBRS0
MOVR0,#30H;显示缓冲区首址
MOVR1,#00H;PA
MOVR2,#4
D_LOOP:
MOVA,@R0
ADDA,#(SEG_TAB-$-3)
MOVCA,@A+PC
MOVX@R1,A;写入PA
INCR0
INCR1;PB
MOVA,@R0
MOVX@R1,A;写入PB
DJNZR7,$
DJNZR7,$
MOVA,#255;消隐
MOVX@R1,A;写入PB
INCR0
DECR1
DJNZR2,D_LOOP
POPACC
POPPSW
RET
;---------------------
SEG_TAB:
DB3FH,06H,5BH,4FH,66H
DB6DH,7DH,07H,7FH,6FH
;----------------------------------
END
程序启动后,首先显示出来8031,如上面的插图所示。
以后,分别按动两个按键,即可看到两组数码管分别显示出来加一、加一的现象。