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

作者&投稿:布紫 (若有异议请与网页底部的电邮联系)
单片机求助,用汇编语言写一个双位数码管0到99循环显示的程序。仿真用的共阳极数码管。如图。~

这个是动态显示的…虽然段的端口都一样,但位不一样,经过软件控制就可以达到动态显示的效果了

;利用中断的99秒计时器 ,动态扫描两位数码管
;P0口接J3,数据端口
;P2.2接 J2 B端子,表示段码锁存
;P2.3接 J2 A端子,标志位码锁存
LATCH1 BIT P2.2
LATCH2 BIT P2.3
ORG 00H
JMP START
ORG 0BH
JMP TIM0
START:MOV R3,#00 ;中断循环次数
MOV R4,#0 ;时间初值
MOV DPTR,#TABLE
MOV SP,#40H
MOV TMOD,#01H ;定时器工作方式
MOV TH0,#HIGH(65536-3800)
MOV TL0,#LOW(65536-3800) ;初值4MS
SETB TR0
MOV IE,#82H ;开中断
TIM0:
MOV TH0,#HIGH(65536-3800)
MOV TL0,#LOW(65536-3800)
INC R3
CJNE R3,#250,X1 ;1S
MOV R3,#0

MOV A,R4 ;十进制转换
MOV B,#10
DIV AB
MOV 20H,B ; 个位
MOV 21H,A ; 十位
INC R4
CJNE R4,#100,LEDSCAN ;到100则清零
MOV R4,#0
LEDSCAN: CALL SCAN ;调用数码管扫描
X1: PUSH ACC
PUSH PSW
CALL SCAN
POP PSW
POP ACC
RETI
SCAN:
MOV A,21H
MOVC A,@A+DPTR
MOV P0,A
SETB LATCH1
CLR LATCH1
MOV P0,#11111110B ;扫描子程序
SETB LATCH2
CLR LATCH2
CALL DELAY1
MOV A,20H
MOVC A,@A+DPTR
MOV P0,A
SETB LATCH1
CLR LATCH1
MOV P0,#11111101B ;0代表选通该位数码管
SETB LATCH2
CLR LATCH2
CALL DELAY1
RET
DELAY:MOV R5,#50 ;典型延时程序
D1: MOV R6,#40
D2: MOV R7,#248
CALL SCAN
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
DELAY1:MOV R6,#4 ;扫描延时
D3: MOV R7,#248
DJNZ R7,$
DJNZ R6,D3
RET
TABLE:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;共阴字码表
END
是用动态扫描的方法显示的,用了2个锁存器,8个数码管的。
附上电路图

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值的循环范围。



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个 数码管没别的东西,就干脆做个静态的咯。怎么也闪烁不了的

从网上见过一个:
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 ; 程序 结束

两位共阳数码管的单片机共阴数码管的单片机用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

参考:

http://hi.baidu.com/do_sermon/item/629fcd582fac7317db16356f


单片机程序菜鸟问题
最后那一句就是取出最高位的进位的,也即最高位第七位。再教你一个小知识,两个数相加,结果最多只比原来数字多一位,并且多出的这位数字不会超过1,比如9+9,最多只是18,即十位是1,不会是2到9的,在比如说99+99=198,嘿嘿。懂了吧 虽然我不用汇编写程序,但是看懂还是很容易的 ...

帮忙完成下一些汇编+微机接口技术的题目
部分答案:一:1-C 2-D 3-D 4-C 5-C 6-D 7-B 8-D 9-B 10-D 12-A 二:1-1,0,0 2-CALL,RET,RETI 3-段地址,偏移地址,64KB 4-0,0 5-02E2H,253E2H 6-AND, AND AL,0F0H 7-NEAR,FAR 8-256,00000-003FFH ...

关于单片机用什么语言写代码最好.用汇编还是用C还是用C++的好呢.学得...
千万不要用汇编写(首先我是这样忠告,但也不排除核心代码和部分代码是要用汇编的)。至于用那种语言,要看你的编译器了,还是建议用c语言,毕竟支持c的是最多的,可移植性也是不错的(不同芯片不一样)。现在的单片机已经越来越高档化了,内存,速度都很快了,不必要用汇编去浪费时间(单片机用汇编...

汇编的八皇后问题
cmp si,9 ;到第9个就是说打完了.jnz print mov dl,' ' ;输出两个空格,为好看.int 21h int 21h loop again pop si endm .data ;改来改去,何必那么小气呢?用9个多方便,就一个字节,不必这么小气!queen db 9 dup(0)used db 9 dup(0)Nresult dw 0 ;结果的个数.prompt db "The ...

汇编语言 微机原理与接口技术
17.指令ADD [BX+DI],CX 源操作数的寻址方式是__寄存器寻址__,目的操作数的寻址方式是__基址变址寻址_。18.已知下列指令执行前,CS=2000H,IP=1000H, SI=2000H,写出下列无条件指令执行后CS和IP值。(1)EBF4 JMP SHORT L1 CS=2000H ,IP=。(2)E3 JMP SI CS=2000H ,IP=2000H ...

用两片74HC573锁存器控制4位共阴数码管动态显示的汇编程序 要汇编语 ...
CONV: ;数码管显示数据转换子程序 CJNE R5,#02H,BEI MOV A,24H AJMP JING BEI:MOV A,23H JING:MOV B,#64H DIV AB MOV DPTR,#TABLE MOVC A,@A+DPTR MOV DISPBUF+2,A MOV A,B MOV B,#0AH DIV AB MOVC A,@A+DPTR MOV DISPBUF+1,A MOV A,B MOVC A,@A+DPTR MOV DISPBUF,A...

单片机中"MOV A,#0FEH;将立即数1111 1110传送到A中 代码:74H,FEH"其 ...
楼主还是要仔细看下教材就会明白了,由助记符等组成的伪指令,经过编译软件编译后生成机器码,机器码由操作码+操作数组成,那个74就是操作码,至于其他的指令生成的机器码又是什么数据,可以百度一下相关资料,如果还要追问他为什么是74而不是64或其他,那么也请百度一下吧,毕竟不用的时间太久了就只能...

用汇编语言实现从键盘读一行信息,并存入用户定义的缓冲区buffer。如从...
int 21h ;用dos的10号功能调用实现输入一个字符串并存到内存缓冲区 mov ax,4c00h int 21hcode ends end begin 汇编连接生成exe文件后,用debug加载运行。运行结束后,用d命令查看数据段,buffer开始的单元,第一个字节是定义的缓冲区的大小,第二个字节存放的是程序运行时输入的字符个数,从第三个字节开始才是输入...

关于单片机的十六进制数的分解
MOV A,#8BH MOV B,#10H DIV AB MOV 40H,A MOV 41H,B 这样,40H中存的就是#8BH的8部分 41H中存的就是#8BH的B部分..也就是,40H中为00001000 41H中为00001011

pic单片机怎么用户汇编语言实现位取反?
COMF F,d ;这条语句中“F”是寄存器的名称,当“d=1”时,结果存入“F”,当“d=0”时,结果存入“W”。这个“W”书面解释是工作寄存器。可理解为过渡寄存器或临时寄存器,做中转数据用。2、在汇编语言中要实现位取反,可通过位状态检测判断来对位进行“置1”或“清零”,详见以下程序。...

莎车县19195074468: AT89S51单片机怎么用汇编语言让数码管从0到9显示 -
茆震百日: START:MOV R5,#00H ;次数计数单元R5,后面的程序应该看得懂了,都是教科书式的 MAIN: MOV A,R5 MOV DPTR,#TAB MOV A,@A+DPTR LCALL DISPLAY CJNE,R5,#10,START ;次数到,从头再来 LJMP MAIN DISPLAY: ;数码管显示...

莎车县19195074468: 51单片机汇编语言1位数码管显示0,1,2,……到9再从9,8,7……到0,反复显示. -
茆震百日: 反复循环是一个作法,0到9循环结束后再做9到0的循环,0到9时用INC加法,9到0用DEC减法就行了,分开做两个循环,先加后减,两个循环结束,再回到0到9实现大循环就好了.很容易的呀,既然会0到9的循环,自己都能做出来,那其它的也能做出来吗,自己独立完成是最好的煅炼了,不能什么事都靠别人,那样是不会提高进步的.

莎车县19195074468: 单片机求助,用汇编语言写一个双位数码管0到99循环 -
茆震百日: 一个数码管显示0005~01秒,再换另一个显示,他俩轮流这么显示着(再多几个也可以),这种交替人眼看不出来的单片机求助,用汇编语言写一个双位数码管0到99循环

莎车县19195074468: 求单片机控制两个数码管显示0 - 9程序 -
茆震百日: /*模块低电平有效、外部中断0、1为低电平出发*/#include "reg52.h" void delay( char i) { unsigned char t; while(i--) { for(t=0;t<108;t++); } } void INT0_ROUTING() interrupt 0//外部中断0子程序 { P0=0xfe;//LED0点亮 while((P3|0xfb)==0xff);//等待外部...

莎车县19195074468: 求:8字数码管动态显示0到99的汇编程序 -
茆震百日: 写那么长干嘛,p1口接数码管扫描.p0口接8段字符显示,已测试正常. ORG 0000H STAER: MOV DPTR,#K1MOV 41H,#00HMOV 42H,#00HMOV R2,#0FFH A2: ACALL A1;调用显示子程序DJNZ R2,A2MOV R2,#0FFHINC 41HMOV ...

莎车县19195074468: 51单片机,如何编写显示数码管00到99,可用电脑键盘(串行口)暂停,继续的程序(用汇编语言) -
茆震百日: MOV 31H,#00H MOV 32H,#00H MOV 33H,#01H MOV 34H,#06H MOV 35H,#03H MOV 36H,#02H ACALL D0 JMP $-2D0: MOV R0,#31H MOV R2,#11111110B MOV DPTR,#TABD1: ORL P1,#00111111B MOV A,@R0 MOVC A,@A+DPTR ...

莎车县19195074468: 用完整的汇编语言编写使数码管循环显示0,1,2,3,4,5,6,7,8,9的程序 -
茆震百日:程序如下: /********************************** 用P0口输出到数码管显示0-9 编写:jzy23 交流:paulucy@126.com *********************************/ #include<reg52.h> #define uint unsigned int #define uchar unsigned char /*********************** 共阴...

莎车县19195074468: 求用51单片机接两个数码管,0 - 99动态显示程序(用C语言) -
茆震百日: #include #define uchar unsigned char #define uint unsigned int uchar DSY_CODE[]= { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f }; void delay(uint x) { uchar i; while(x--)for(i=0;i<120;i++); } void main() { uchar i; P0 = 0x00; P2 = 0x00; while(1)...

莎车县19195074468: 用单片机控制2位数码管,不用锁存器能显示动态扫描码?比如说从0到99.如果能程序怎么写? -
茆震百日: char code duanxuan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} char i,j,x; int y; yanshi(char shu) {while(shu--)for(x=0;x<110;x++); } void main() {y=30000;while(y--){for(i=0;i<9;i++){p21=1;//如果你用的数码管是共阳极的话.就置1...

莎车县19195074468: 汇编利用定时中断使静态数码管显示0 - 9数字 -
茆震百日: ; ORG 0000H LJMP MAIN;上电,转向主程序 ORG 000BH LJMP CTC0;转向定时器中断程序 MAIN: MOV TMOD, #01H MOV TL0, #0E0H MOV TH0,...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网