请教51汇编之LED数码管动态显示方法

本人刚学51单片机,现遇到一个问题,如下
现编个一个99.9秒计时控制器,第一次按开关SP1,启动计时器同时灯1亮,第二次按,停止计时器同时灯2亮,第三次按,计时器清零同时灯3亮!
汇编程序如下,现在想改为动态扫描数码管的方法,请高手赐教,完成后,追加500分。要求,P0口接动态共阳数码管的段选,P2.0~P2.2接个位十倍百位的位选。最好用PROTEUS仿真能通过。这厢有礼了!请高手赐教完整程序!或者知道本人 QQ 550809798 注明单片机指导!
TCNTA EQU 30H
TCNTB EQU 31H
GW EQU 32H
KEYCNT EQU 33H
SW EQU 34H
BW EQU 35H
SP1 BIT P3.5
ORG 00H
LJMP STAR
ORG 0BH
LJMP INT_T0
STAR: MOV P0,#0CH
MOV P1,#40H
MOV P2,#4EH
LCALL DELAY2S
START:
MOV KEYCNT,#00H
MOV GW,#00H
MOV A,GW
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
MOV SW,#00H
MOV A,SW
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P1,A
MOV BW,#00H
MOV A,BW
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P2,A
MOV TMOD,#02H
SETB ET0
SETB EA
WT: JB SP1,WT
LCALL DELY10MS
JB SP1,WT
INC KEYCNT
MOV A,KEYCNT
CJNE A,#01H,KN1
SETB TR0
MOV TH0,#06H
MOV TL0,#06H
MOV TCNTA,#00H
MOV TCNTB,#00H
CLR P3.1
SETB P3.2
SETB P3.3
LJMP DKN
KN1: CJNE A,#02H,KN2
CLR P3.2
SETB P3.1
SETB P3.3
CLR TR0
LJMP DKN
KN2: CJNE A,#03H,DKN
CLR P3.3
SETB P3.2
SETB P3.1
MOV GW,#00H
MOV A,GW
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
MOV SW,#00H
MOV A,SW
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P1,A
MOV BW,#00H
MOV A,BW
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P2,A
MOV KEYCNT,#00H
DKN: JNB SP1,$
LJMP WT
DELY10MS:
MOV R6,#40
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
DELAY2S:MOV R5,#20
D2: MOV R6,#200
D3: MOV R7,#248
DJNZ R7,$
DJNZ R6,D3
DJNZ R5,D2
RET
INT_T0:
INC TCNTA
MOV A,TCNTA
CJNE A,#100,NEXT
MOV TCNTA,#00H
INC TCNTB
MOV A,TCNTB
CJNE A,#4,NEXT
MOV TCNTB,#00H
INC GW
MOV A,GW
CJNE A,#10,DONE
MOV GW,#00H
INC SW
MOV A,SW
CJNE A,#10,DONE
MOV GW,#00H
MOV SW,#00H
INC BW
MOV A,BW
CJNE A,#10,DONE
MOV GW,#00H
MOV SW,#00H
MOV BW,#00H
DONE: MOV A,GW
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
MOV A,SW
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P1,A
MOV A,BW
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P2,A
NEXT: RETI
TABLE: DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H
END

这个程序因为要精确计时,所以最好使用中断程序来完成。
大家编程的思维方式和格式不一样,加上我也没有太多时间来帮你写代码,所以我只是将具体程序的流程说给你,希望对你有帮助。
(加一句,这个程序完全没有必要设置3个按键,因为3个按键在任意时刻只有3个可以被响应,所以合并成1个最好)

;下面的代码直接粘贴到编译其中,然后按照注释添加代码

;##################################################
;添加基本的复位程序

;定义寄存器

;定义秒整数寄存器:miao1=0

;定义秒小数寄存器:miao2=0

;定义复位状态位:zhuangtai1=1

;定义运行状态位:zhuangtai2=0

;定义停止状态位:zhuangtai3=0

;定义显示状态位:xianshi1=1(个位)

;定义显示状态位:xianshi2=0(十位)

;定义显示状态位:xianshi3=0(百位)

;点亮发光管3,熄灭发光管1,2

;将定时器0溢出时间设定为0.01秒

;开启定时器0
;########################
;进入循环判断主程序
;(循环判断主程序开始处

;如果当前是复位状态(zhuangtai1=1),那么循环判断按键1,等待启动(按键1按下后经过延时去抖确定,然后zhuangtai1=0,zhuangtai2=1,zhuangtai3=0,点亮发光管1,熄灭3,返回循环判断主程序开始处)
;如果当前是运行状态(zhuangtai2=1),那么循环判断按键2,等待停止(按键2按下后经过延时去抖确定、然后zhuangtai1=0,zhuangtai2=0,zhuangtai3=1,点亮发光管2,熄灭1,返回循环判断主程序开始处)
;如果当前是停止状态(zhuangtai3=1),那么循环判断按键3,等待复位(按键3按下后经过延时去抖确定、然后zhuangtai1=1,zhuangtai2=0,zhuangtai3=0,点亮发光管3,熄灭2,miao1=0,miao2=0,返回循环判断主程序开始处)

;)循环判断主程序结束

;##################################################
;中断程序
;########################
;中断程序第一步:计算当前时间
;(计算当前时间程序开始处

;如果当前是运行状态(zhuangtai2=1),那么miao2=miao2+1,
;如果miao2=100,那么miao2=0,miao1=miao1+1,

;)计算当前时间程序结束

;########################
;中断程序第二步:刷新显示数码管

;(刷新显示数码管程序开始处

;如果xianshi1=1,那么(显示个位数码管(miao2/10),xianshi1=0,xianshi2=1,跳至刷新显示数码管程序结束处)

;如果xianshi2=1,那么(显示十位数码管(miao1%10),xianshi2=0,xianshi3=1,跳至刷新显示数码管程序结束处)

;如果xianshi3=1,那么(显示百位数码管(miao1/10),xianshi3=0,xianshi1=1,跳至刷新显示数码管程序结束处)

;)刷新显示数码管程序结束
温馨提示:内容为网友见解,仅供参考
第1个回答  2008-10-14
我想看看啊。本回答被提问者采纳

LED数码管动态显示2017的51单片机汇编语言
共阳极接法。abcdefg 为 P0 口,位选端为 P2 口。八个数码管同时显示 01234567。电路与程序,如下所示:

单片机 汇编 LED数码管动态显示
所谓的动态显示就是:led灯按设定的循序不停的一个一个(一个数用一块八段管)数的输出显示,由于led灯的闪烁速度很快,而人的眼睛最多只能识别0.2秒间隙以上的变化。那么在人看来,不停闪烁的led管就像是静态显示一样。图中,段控制和位控制分时复用P0口,选用两个锁存器573来分开段控制和位控制...

如何在51单片机矩阵键盘里按一个键可实现数码管动态显示而不是一...
include<reg51.h>#define uchar unsigned char;uchar distab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; \/\/0到fvoid delay(unsigned int a){unsigned int i,j;for(i=0;i<a;i++)for(j=0;j<120;j++);}uchar kbsca...

51单片机怎么让数码管显示学号?用汇编语言
数码管显示方式为动态扫描方式,当P0口送第一个数0的码型到锁存器时,P2送位选地址01H,即Y0=0,只有第一个数码管亮,显示0,其他数码管不显示。当P0口送第二个数1的码型到锁存器时,P2送位选地址02H,即Y1=0,只有第二个数码管亮,显示1,其他数码管不显示。即每次只有一个数码管点亮,8个...

高分:51单片机汇编程序,数码管跳动问题
给你贴一个我写的显示程序(在定时中断中调用,这个程序显示两组数据,500ms换一次):\/ 函数名称: void Display()功能描述: 将缓冲区中可显示字符输出到LED \/ define PIN_SDINP0_0 define PIN_STP0_1 define PIN_SHP0_2 define LOC_D10x08 void Display(void){ unsigned char i,ch,loc;if...

51单片机用键盘输入并用动态数码管显示
ADD A,#01H ;(要显示的数)MOV B,#0AH DIV AB SETB S1 SETB S2 CLR S3 SETB S4 ACALL DISP LCALL DELAY1 MOV A,B SETB S1 SETB S2 SETB S3 CLR S4 ACALL DISP LCALL DELAY1 MOV A,#0 SETB S1 SETB S2 SETB S3 SETB S4 ACALL DISP LCALL DELAY1 DJNZ R1,LOOP AJMP MAIN ...

单片机,使用汇编语言使led数码管每隔1秒轮流显示数字0000-9999,这个怎么...
这是四位数的秒计数器,用四位一体共阴数码管显示,P0口输出段码,P2口输出位码。用定时器定时器50ms,采用中断方式,中断20次为1秒,显示数字加1。

51单片机怎么用汇编语言让8个数码管不停的 显示0-9(最好要接74HC595...
要数码管不停显示,只能用动态显示,但是要看是单片机接数码管是哪个端口,还有是直接接在数码管上还是中间有寄存器,不知74HC595是接在哪的

单片机 用51单片机显示一个数码管轮流显示9到0再从0到9每隔一秒出现一 ...
MOV P0,#0FFH LOP:LOOP0:MOV 20H,#9 MOV R0,#10 LOOP1:MOV A,20H; 9-0 MOVC A,@A+DPTR MOV P0,A DEC 20H CALL DELL;YANSHI DJNZ R0,LOOP1 MOV 20H,#0;0-9 MOV R0,#10 LOOP2:MOV A,20H; 0-9 MOVC A,@A+DPTR MOV P0,A INC 20H CALL DELL;YANSHI DJNZ R0,LOOP2 AJMP...

基于51单片机利用八个数码管花样显示如下
其实很简单,你把1--8对应的共阴极或共阳极的编码寻在一个数组里(C语言)或者表里(汇编语言查表法),在P0口和P2口接上8个7段数码管,P2口做位选,P0口做段选,每次从表中查询你要显示的数据的编码写到P0口,再把你要在哪一个数码管上显示写到P2口(比如位选为低电平有效,向P2口写入0xFE...

相似回答