
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
LJMP MAIN
ORG 0030H
MAIN:
MOV A,#0FEH
MOV R2,#10
LOOP:
MOV P0,A
LCALL DELAY
MOV P0,#0FFH
LCALL DELAY
DJNZ R2,LOOP
MOV R2,#10
RL A
SJMP LOOP
DELAY:
MOV R3,#200
DLY:
MOV R4,#250
DJNZ R4,$
DJNZ R3,DLY
RET
END
简单啊。
大致说来就是
你先开启个定时器,根据你选用的晶振,计算出你要用定时器定时的基准时间,
就假设是10毫秒吧。
然后给定时器的THx,TLx写入初值,开启中断,进行定时。
然后就等待中断。
由于是10毫秒中断一次,因此我们设置几个“软件计数器”
比如每此中断,软甲计数器+1,
例如“软件计数器1”在中断程序中计数100次,则是10ms100=1s
而“软件计数器2”在1的基础上继续计数100次,则是1S100=100S
而“软件计数器3”在2的基础上继续计数36次,则是100S36=3600S=1小时。
楼主的程序有两个明显错误:
(1)第3行指令 MOV BH,00 使首行指令MOV BX,0100 作废,
使 BX = 0000,导致后面的指令MOV AL,[BX]读入AL的不是成绩数据。
(2)在DEGUG 环境输入程序,数值不加后缀H,默认为16进数,
例如楼主程序中的 CMP AL,60,其中60默认为16进制数,即96D,
导致统计结果错误。
我修改的程序及运行结果如以下截图所示,供参考:
你理解从程序上面执行下来到达 loop s后又去执行标号s处,这没错。然后就无限循环死,这就错了!汇编语言的循环指令LOOP是有条件的,这个隐含 *** 作和条件就是每循环一次,CX=CX-1,如果CX=0,循环就结束了。在这个程序中,循环3次结束。
mov cx,10
A:
loop A
;此时会执行A中的内容(CX)次,即10次~
;再同理
mov cx,10
B:
loop B
如果你要循环嵌套的话,需要用 "cmp" "jg" "jl"等
如果是
LOOP
等之类的循环是没有办法设置断点的
如果你有源程序,可以在循环体内增加判断的条件,然后在这个地方设置断点,待调试正确后再将这个新增加的判断去掉,或者增减
ecx
的数值
如果调试别人生成的可执行文件,那就没有办法了
以上就是关于单片机用汇编写两个数码管显示0到99循环的程序全部的内容,包括:单片机用汇编写两个数码管显示0到99循环的程序、用汇编语言编制循环闪烁灯程序、怎么用51单片机定时1个小时 好像是循环,具体汇编程序是怎样的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)