我看不太懂你的代码
干脆我自己写一个了,以下就是我写的,这个程序仿真不一定行,但实际肯定是可以的,我已经在自己的板子上烧录运行过了,你可以参考一下
每个人写代码的习惯都是不一样的, 我不太习惯由编译器指定地址,有时候要用到连续的地址,我不知道由编译指定的地址是不是连续,所以,就自己指定了,久了就成了一种习惯了
/*0-2000计数程序
;单片机型号:STC8a4k32s2,使用片上24MHZ晶振
如果使用其它型号单片机,延时要调节一下
;COM1,COM2和OUT可以在EQU中修改
;仿真的时候自己做一些修改就可以了,这是一个已经在开发板上验证过的程序*/
;===========================================================================
COM0 EQU P2.0
COM1 EQU P2.1
COM2 EQU P2.2
COM3 EQU P2.3 ;数码管的4个位选端口
S1 BIT P1.5 ;按键
OUT EQU P0 ;PO用于显示
P2M0 EQU 096H ;
P2M1 EQU 095H ;控制P2端口输出模式的两个寄存器
;===========================================================================
LED_1 DATA 030H ;显示电压用的LED位的个位
LED_10 DATA 031H ;显示电压用的LED位的十位
LED_100 DATA 032H ;显示电压用的LED位的百位
LED_1000 DATA 033H ;显示电压用的LED位的千位
DIV_L DATA 034H ;除法高位用的缓存器
DIV_H DATA 035H ;除法低位用的缓存器
DATA_BUF_L DATA 036H ;数据暂存器的低位
DATA_BUF_H DATA 037H ;数据暂存器的高位
DATA_K_L DATA 038H ;数据2000的低位
DATA_K_H DATA 039H ;数据2000的高位
;===================================================
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN: MOV DATA_K_L,#00H
MOV DATA_K_H,#00H ;
MOV P2M1,#000H ;
MOV P2M0,#0FFH ;P2端口设定成强推挽输出
;========================================
LOOP_0: JB S1,LOOP_1 ;
CALL S1_DISP ;调用按键处理子程序
LOOP_1: CALL DISPLAY ;
JMP LOOP_0 ;
;==============================================================================================================
;按键处理子程序
S1_DISP: CALL DISPLAY ;调用显示一次,就当作是去抖动
JNB S1,S1_DISP ;这个可以不要,有的话就是当你按下按键不放的时候,显示不会灭灯,
;数字也不会一直的加上去,调试的时候不要这条指令,就可以快速的调到2000循环
;========================
CLR C ;
MOV A,DATA_K_L ;
ADD A,#001H ;低位加1
MOV DATA_K_L,A ;
MOV A,DATA_K_H ;
ADDC A,#000H ;高位带进位加0
MOV DATA_K_H,A ;
;========================
CLR C
MOV A,#LOW(2000) ;
SUBB A,DATA_K_L ;
MOV A,#HIGH(2000) ;
SUBB A,DATA_K_H ;
JNC S1_DISP_0 ;C进位标志位为0,就表示还没有加到2000
MOV DATA_K_L,#00H ;
MOV DATA_K_H,#00H ;
S1_DISP_0:
RET ;返回
;===========================================================================
;显示子程序
DISPLAY: MOV B,DATA_K_L
MOV A,DATA_K_H ;
CALL DATA_DISP ;2000的10进制数据拆分为4个倍数,并存放在四个地址中
;===================================================
MOV A,LED_1
CLR COM0 ;打开位选
CALL DISP_LED ;数码管通过查表显示
CALL DELAY1MS ;延时1mS
SETB COM0 ;关闭位选
;===================================================
MOV A,LED_10
CLR COM1 ;打开位选
CALL DISP_LED ;数码管通过查表显示
CALL DELAY1MS ;延时1mS
SETB COM1 ;关闭位选
;===================================================
MOV A,LED_100
CLR COM2 ;打开位选
CALL DISP_LED ;数码管通过查表显示
CALL DELAY1MS ;延时1mS
SETB COM2 ;关闭位选
;===================================================
MOV A,LED_1000
CLR COM3 ;打开位选
CALL DISP_LED ;数码管通过查表显示
CALL DELAY1MS ;延时1mS
SETB COM3 ;关闭位选
;===================================================
RET
;=================================================================================================
;数码管查表显示
DISP_LED: MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV OUT,A ;
/* CALL DELAY1MS ;延时1mS,如果延时放在这里扫描显示部分可以少一点,放在显示那是为了方便理解而已*/
RET
;==================================================================================================
;这个是1mS的延时程序,在STC下载器中可以用软件自动计算
;如果是仿真,可以相应的减少延时的时长
DELAY1MS: PUSH 30H
PUSH 31H
MOV 30H,#32
MOV 31H,#39
NEXT: DJNZ 31H,NEXT
DJNZ 30H,NEXT
POP 31H
POP 30H
RET
;===================================================================================================
;DATA_DISP==============数据拆分,把一个数拆分成四个数,用于显示======================
;把16进制的高低两个字节分别放到A和B,处理之后,个十百千会分别放到4个地址中,使用减法运算来达到除法的效果
;进入之前要先把高位数据存放到A,低位数据存放到B
DATA_DISP: MOV LED_1,#0
MOV LED_10,#0
MOV LED_100,#0
MOV LED_1000,#0 ;先把四个清除
MOV DATA_BUF_H,A ;
MOV DATA_BUF_L,B ;把数据传送到缓冲器中
MOV R0,#0E8H ;
MOV R1,#03H ;1000的16进制为03E8H
MOV R2,#100
MOV R3,#10
MOV R4,#0
SUB_1000: CLR C
MOV A,DATA_BUF_L
SUBB A,R0
MOV DIV_L,A;
MOV A,DATA_BUF_H;
SUBB A,R1
MOV DIV_H,A
JC SUB_100
MOV DATA_BUF_L,DIV_L
MOV DATA_BUF_H,DIV_H
INC LED_1000
JMP SUB_1000
SUB_100: CLR C
MOV A,DATA_BUF_L
SUBB A,R2
MOV DIV_L,A
MOV A,DATA_BUF_H;
SUBB A,R4
MOV DIV_H,A
JC SUB_10
MOV DATA_BUF_L,DIV_L
MOV DATA_BUF_H,DIV_H
INC LED_100
JMP SUB_100
SUB_10: MOV A,DATA_BUF_L
MOV B,R3
DIV AB
MOV LED_10,A
MOV LED_1,B
RET
;===================================================================================
TABLE: DB 11111100B,01100000B,11011010B,11110010B,01100110B,10110110B,10111110B,11100000B,11111110B,11110110B ;表:共阴数码管 0-9
END
|