求懂单片机的大佬给分析一下按键显示和实际不同步问题
没事在家自学单片机,视频里老师讲了定时器调节频率输出,我自己试着加上数码管显示按键挡位,最高总共可以显示254个挡位,调到最高再减上十几档,再加到最高时就会多出几个档,可以显示出255、256、257..... ,按键减减再加加,这个显示的最高值的数值就会一直加,可是程序明明只是设置了254个挡位。求大佬帮忙看看怎么回事?谢谢大家了!救救这孩子吧,可怜的孩子看了一天了,没看明白怎么回事,身边也没有人可以问问指点一下!同时提前祝大家新年快乐!{:1_893:}ORG 00H
AJMP ZHU
ORG 0BH
AJMP JISUAN
ORG 50H
;---------------------------
ZHU:MOV P0,0FFH;数码管显示
MOV P2,00H;数码管扫描
MOV R4,#05H
MOV R5,#03H
MOV R6,#02H
SETB P3.0
SETB P3.1
MOV SP,#100D
MOV TMOD,#00000001B
MOV TL0,#LOW(65536-20000)
MOV TH0,#HIGH(65536-20000)
SETB EA
SETB ET0
MOV R2,#20D
MOV R1,#20D;频率调节变量
SETB TR0
;-------按键扫描--------------------
ZHUAN:LCALL XIANSHI
JNB P3.0,JIA
JNB P3.1,JIAN
AJMP ZHUAN
;-------按键防抖---------------------
JIA:LCALL XIANSHI;延时
JNB P3.0,JIAZ
AJMP ZHUAN
JIAN:LCALL XIANSHI;延时
JNB P3.1,JIANZ
AJMP ZHUAN
;-----按键加----------------------
JIAZ:CJNE R1,#01D,JJ
AJMP DD
JJ:DEC R1
INC R4
CJNE R4,#10D,DD
MOV R4,#0D
J5:INC R5
CJNE R5,#10D,DD
MOV R5,#0D
J6:INC R6
;-----
DD:JNB P3.0,DD
LCALL XIANSHI;延时
JNB P3.0,DD
AJMP ZHUAN
;------按键减-------------------
JIANZ:CJNE R1,#255D,SS
AJMP DD1
SS:INC R1
DEC R4
CJNE R4,#255D,DD1
MOV R4,#10D
DEC R5
CJNE R5,#255D,DD1
MOV R5,#10D
DEC R6
;-----
DD1:JNB P3.1,DD1
LCALL XIANSHI;延时
JNB P3.1,DD1
AJMP ZHUAN
;------显示-------------------------
XIANSHI:MOV R0,#00H
MOV P2,R0
INC R0
MOV DPTR,#SHUJUBIAO
MOV A,R6
MOVC A,@A+DPTR
MOV P0,A
LCALL YAN
MOV P2,R0
INC R0
MOV DPTR,#SHUJUBIAO
MOV A,R5
MOVC A,@A+DPTR
MOV P0,A
LCALL YAN
MOV P2,R0
MOV DPTR,#SHUJUBIAO
MOV A,R4
MOVC A,@A+DPTR
MOV P0,A
LCALL YAN
RET
;-----中断程序--------------------
JISUAN:PUSH ACC
MOV TL0,#LOW(65536-20000)
MOV TH0,#HIGH(65536-20000)
DJNZ R2,FAN
MOV A,R1
MOV R2,A
CPL P1.0
FAN:POP ACC
RETI
;------延时-------------------
YAN:MOV R3,#255D
DJNZ R3,$
RET
SHUJUBIAO:DB 3FH,6H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH
END 把教材扔了, 新手不适合学汇编 c还看得懂一点,汇编就完全看不懂了 用C语言吧,汇编太难了 虽然我看不懂汇编,但是可以写个超过254复位到254的代码。
你可以试试出现这个现象后,挡位能不能回到0,我不知道你的显示部分怎么写的,是读取当前挡位变量显示还是根据按键次数显示 大概看了一下,好像是 数码管分别按照R6/R5/R4显示3位数字,程序里对R6/R5/R4分别检查值255。
应该是用一个寄存器分别按百位、十位、个位显示,程序里只需要检查这一个寄存器值范围。
如果用3个寄存器显示3位数字,那应该3个寄存器每个分别对应百位、十位、个位,而不是每个寄存器范围值都是到255。
不如把c代码也贴出来 怀念啊,这汇编 别学汇编了,对工作没啥帮助,C,c++,Python都挺好 信仰☆默殇 发表于 2023-1-16 09:58
虽然我看不懂汇编,但是可以写个超过254复位到254的代码。
你可以试试出现这个现象后,挡位能不能回到0, ...
谢谢了!按键控制挡位,显示是跟着挡位变的,挡位变了显示跟着挡位变量变的,用挡位给显示做的限位。应该是同步的,现在不同步了,感觉好像按键以后只有显示在变,挡位偶尔丢步了,所以按加时会多出数值。
页:
[1]
2