单片机用汇编写两个数码管显示0到99循环的程序

如题

1、新建项目,做好准备。

2、数码管段选表。

3、延时函数。

4、uchar i; 变量i;wk = 1;打开位选,P0 = 0xf7;1111 0111第4位数码管显示,wk = 0;关闭位选。

5、while(1) //死循环效果{} 。

6、dk = 1; //打开段选,P0 = leddata[i];,dk = 0; //关闭段选,delay(100);//延时效果。

7、选择效果,限制i值的循环范围。

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-05-18
ORG 0000H
AJMP MAIN

ORG 30H
MAIN: MOV R1,#0
XUNH:
LCALL DISP
LCALL DELAY
INC R1
CJNE R1,#100,XUNH
AJMP MAIN
;显示P1口十位P2口个位,这样做就怎么也不会闪烁了把
DISP: MOV DPTR,#TAB ;共阴
MOV A,R1
MOV B,#10
MUL AB
MOV A
MOVC A,@A+DPTR
MOV P1,A
MOV A,B
MOVC A,@A+DPTR
MOV P2,A
RET
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
;延时1s,要精确延时可以稍微调一下数值
DELAY:MOV R2,#25
DEL1: MOV R3,#100
DEL2: MOV R4,#200
DEL3: DJNZ R4,$
DJNZ R3,DEL2
DJNZ R2,DEL1
RET
END
;做动态显示也可以,人眼是看不出闪烁的。那样会省点口线,嘿嘿反正你只有2个 数码管没别的东西,就干脆做个静态的咯。怎么也闪烁不了的本回答被网友采纳
第2个回答  2013-04-13
从网上见过一个:
ORG 0000H ; 上电 与 复位 向量
LJMP MAIN ; 转移指令 转至 MAIN 处
ORG 0040H ; 定义 MAIN 程序 起始地址
MAIN: MOV SP,#5FH ; 设置 堆栈 起始地址
MOV DPTR,#TABLE ; 数据指针 = TABLE(为显示码 数据表地址)
MOV R0,#0 ; R0 = 0
MOV R1,#0 ; R1 = 0
MOV R2,#200 ; R2 = 200
B1: LCALL S2 ; 调用 子程序 S2
LCALL S1 ; 调用 子程序 S1
DJNZ R2,B1 ; R2 不等于 0 则转至 B1
INC R0 ; R0 = R0 + 1
CJNE R0,#10,B1 ; R0 不等于 10 则转至 B1
MOV R0,#0 ; R0 = 0
INC R1 ; R1 = R1 + 1
CJNE R1,#10,B1 ; R1 不等于 10 则转至 B1
LJMP MAIN ; 转至 MAIN 处
S1: MOV A,R0 ; A = R0 显示一位的子程序
MOVC A,@A+DPTR ; A = (@A+DPTR) 读取显示段码
MOV P1,#02H ; 写 显示 位 选
MOV P0,A ; 写 显示 段码
LCALL DELAY ; 调用 延时 子程序
RET ; 子程序 返回
S2: MOV A,R1 ; A = R1 显示另一位的子程序
MOVC A,@A+DPTR ; A = (@A+DPTR) 读取显示段码
MOV P1,#01H ; 写 显示 位 选
MOV P0,A ; 写 显示 段码
LCALL DELAY ; 调用 延时 子程序
RET ; 子程序 返回
DELAY: MOV R5,#15 ; 设置 R5 = 15 延时 子程序
D1: MOV R6,#15 ; R6 = 15
D2: DJNZ R6,$ ; R6 不等于 0 继续执行 本条 指令
DJNZ R5,D1 ; R5 不等于 10 则转至 D1
RET ; 子程序 返回
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ; 共阴显示段码表
END ; 程序 结束
第3个回答  2013-04-13
两位共阳数码管的单片机共阴数码管的单片机用AT89C51实验板的两位数码管显示00~99依次循环的汇编语言程序 a_bit equ 20h ;数码管个位数存放内存位置
b_bit equ 21h ;数码管十位数存放内存位置
temp equ 22h ;计数器数值存放内存位置star: mov temp,#0 ;初始化计数器,从0开始
stlop: acall display;调用显示子程序
inc temp;对计数器加1
mov a,temp
cjne a,#100,next ;判断计数器是否满100?
mov temp,#0;满100就清零重新开始
next: ljmp stlop;不满就循环执行;显示子程序
display: mov a,temp ;将temp中的十六进制数转换成10进制
mov b,#10 ;10进制/10=10进制
div ab
mov b_bit,a ;十位在a
mov a_bit,b ;个位在bmov dptr,#numtab ;指定查表启始地址
mov r0,#4
dpl1: mov r1,#250 ;
dplop: mov a,a_bit ;取个位数
MOVC A,@A+DPTR ;查个位数的7段代码
mov p0,a ;送出个位的7段代码
clr p2.7 ;开个位显示
acall d1ms ;显示162微秒
setb p2.7;关闭个位显示,防止鬼影
mov a,b_bit ;取十位数
MOVC A,@A+DPTR ;查十位数的7段代码
mov p0,a ;送出十位的7段代码
clr p2.6 ;开十位显示
acall d1ms ;显示162微秒
setb p2.6;关闭十位显示,防止鬼影
djnz r1,dplop ;循环执行250次
djnz r0,dpl1 ;循环执行250X4=1000次
ret

;2+2X80=162微秒,延时按12MHZ计算
D1MS: MOV R7,#80
DJNZ R7,$
RET;实验板上的7段数码管0~9数字的共阴显示代码
numtab: DB 0CFH,03H,5DH,5BH,93H,0DAH,0DEH,43H,0DFH,0DBHend;如果是共阳数码管的显示代码
numtab: DB 30H,0FCH,0A2H,0A4H,06CH,25H,21H,0BCH,20H,24H
相似回答