永发信息网

汇编语言编程,一个按键,一个2位数码管,实现按键计数显示在数码管上。

答案:2  悬赏:20  手机版
解决时间 2021-11-20 01:35
  • 提问者网友:送舟行
  • 2021-11-19 08:21
汇编语言编程,一个按键,一个2位数码管,实现按键计数显示在数码管上。
最佳答案
  • 五星知识达人网友:酒醒三更
  • 2021-11-19 08:57
//晶振12M
KEY  BIT  P3.2   ;按键接P3.2
LED_bits BIT P3.1;个位显示控制端
LED_ten  BIT  P3.0;十位显示控制端
DATA_bits   DATA    30H;个位
DATA_ten    DATA    31H;十位
ORG   00H
LJMP  MAIN
ORG  30H
MAIN: ;主程序
SETB LED_bits
SETB LED_ten
SETB KEY 
MOV DATA_bits,#0
MOV DATA_ten,#0 
LOOP:
ACALL DISPLAY;显示
ACALL KEY_COUNT;键控
LJMP LOOP
KEY_COUNT:;键控计数
JB KEY, KEY_END
ACALL DELAY10MS
JNB  KEY,$
ACALL COUNT
KEY_END:
RET
COUNT:  ;计数
INC DATA_bits
MOV A,DATA_bits
CJNE A,#10,COUNT_END 
MOV DATA_bits,#0
INC DATA_ten
MOV A,DATA_ten
CJNE A,#10,COUNT_END 
MOV DATA_ten,#0
COUNT_END:
RET
DISPLAY: ;显示
MOV A,DATA_bits
MOV DPTR,#LEDSHOW
MOVC A,@A+DPTR
MOV P2,A
CLR LED_bits
ACALL DELAY1MS
SETB LED_bits
MOV A,DATA_ten
MOV DPTR,#LEDSHOW
MOVC A,@A+DPTR
MOV P2,A
CLR LED_ten
ACALL DELAY1MS
SETB LED_ten 
RET
DELAY10MS:   ;误差 0us
    MOV R7,#01H
DL1:
    MOV R6,#26H
DL0:
    MOV R5,#82H
    DJNZ R5,$
    DJNZ R6,DL0
    DJNZ R7,DL1
    RET
DELAY1MS:   ;误差 0us
    MOV R7,#01H
DL3:
    MOV R6,#8EH
DL2:
    MOV R5,#02H
    DJNZ R5,$
    DJNZ R6,DL2
    DJNZ R7,DL3
    RET
LEDSHOW:
        DB        03FH;0
        DB        006H;1
        DB        05BH;2
        DB        04FH;3
        DB        066H;4
        DB        06DH;5
        DB        07DH;6
        DB        007H;7
        DB        07FH;8
        DB        06FH;9
END

全部回答
  • 1楼网友:轻熟杀无赦
  • 2021-11-19 09:12
;假设硬件定义如下
KEY EQU P1.0 ;0=键按下
DAT EQU P0 ;数码管显示数据口
DAT_S1 EQU P1.1 ;个位0=选中
DAT_S2 EQU P1.2 ;十位0=选中
VAL EQU 30H ;计数值
KEYVAL EQU 31H ;按键状态

ORG 0000H
SJMP STA
ORG 000BH
SJMP T0_ISR
ORG 0030H
STA:
CLR EA
MOV TMOD,#01H
MOV TH0,#0ECH
MOV TL0,#78H ;5ms
SETB ET0
SETB TR0
MOV KEYVAL,#0 ;无键按下
MOV VAL,#0
CLR 00H ;1=键按下未抬起
LCALL DISPLAY
SJMP $

T0_ISR:
CLR TR0
MOV TH0,#0ECH
MOV TL0,#78H ;5ms
SETB TR0
JB KEY,T0_E ;无键按下转T0_E
INC KEYVAL
MOV A,KEYVAL
CJNE A,#3,T0_1 连续三次检测到按键,则按键有效
T0_1:
JC T0_RE ;
SETB 00H
JNB T0_RE ;判断按键是否抬起
T0_2:
CLR 00H
INC VAL
SJMP T0_RE
T0_E:
JB 00H,T0_2 ;有效键抬起
MOV KEYVAL,#0
T0_RE:
LCALL DISPLAY ;显示
RETI
;------------------------------------------
DISPLAY:
MOV A,VAL
LCALL H2BCD
MOV A,R2
ANL A,#0FH
CLR DAT_S1
SETB DAT_S2
MOV DAT,A
MOV A,R2
SWAP A
ANL A,#0FH
CLR DAT_S2
SETB DAT_S1
MOV DAT,A
RET
;------------------------------------------
;HEX->BCD
;IN:A=0~FFH
;OUT:R3R2=百十个位
;------------------------------------------
H2BCD:
MOV B,#100
DIV AB
MOV R3,A
MOV A,#10
XCH A,B
DIV AB
SWAP A
ADD A,B
MOV R2,A
RET
;------------------------------------------
LEDTAB:
DB 0C0H ;0
DB 0F9H ;1
DB 0A4H ;2
DB 0B0H ;3
DB 099H ;4
DB 092H ;5
DB 082H ;6
DB 0F8H ;7
DB 080H ;8
DB 090H ;9
DB 088H ;A
DB 083H ;B
DB 0C6H ;C
DB 0A1H ;D
DB 086H ;E
DB 08EH ;F
DB 000H ;' '
;------------------------------------------
END追问为什么,运行不出来结果啊,我的仿真图是这样的。追答按图改下硬件定义:
KEY EQU P3.2 ;0=键按下
DAT EQU P0 ;数码管显示数据口
DAT_S1 EQU P2.0 ;个位0=选中
DAT_S2 EQU P2.1 ;十位0=选中
VAL EQU 30H ;计数值
KEYVAL EQU 31H ;按键状态追问就是改过之后的运行的,也运行不出来要的效果追答JNB T0_RE ;判断按键是否抬起
这句有错了,少了一个KEY应该是
JNB KEY,T0_RE ;判断按键是否抬起追问也改了。。一样没效果
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯