单片机的用汇编语言编程

这是图,要求:1、用2位LED数码显示,显示时间为00~99秒,每秒自动加1;2、设计“开始按键”、“暂停按键”和“复位”键。

;0~99S正倒计时。STRT EQU P1.0P_S EQU P1.1CLRR EQU 1.3
ORG 00HAJMP MAINORG 0BHAJMP T0INT ORG 30HMAIN: MOV SP,#60HMOV DPTR,#TABMOV TMOD,#01H ;T0定时方式1SETB EASETB ET0MOV TH0,#3CH ;50ms定时常数MOV TL0,#0B0HMOV R0,#20 ;20x50mS=1S MAIN1:ACALL ALARM ;调用报警子程序k1: ;按键检测子程序开始键LCALL DISP JB STRT,K2ACALL DISPJNB STRT,$-2AJMP START
k2: ;暂停键JB P_S,K3LCALL DISPJNB P_S,$-3AJMP PAUSE
K3: ;清零键 JB CLRR,K4LCALL DISPJNB CLRR,$-3 AJMP CLEARAJMP SLINC
START: SETB TR0CLR 7DH ;开始后此标志清0 ,跳过显示子程序的设定部分MOV R3,#3 ;蜂鸣3SAJMP K1 PAUSE: CLR TR0AJMP K2
CLEAR: CLR TR0MOV R4,#0AJMP K3ALARM:JB 7FH,ALARM0 ;7FH为时间到标志,RAM内存2FH的D7位AJMP ALARMRT ;时间未到,跳出报警ALARM0:CPL P1.0ACALL DISP ;利用显示子程序延时约2ms求反,产生250H的方波。AJMP ALARMALARMRT:RET
T0INT: MOV TH0,#03CH; ;定时中断子程序。重装定时常数MOV TL0,#0B0H;DJNZ R0,T0INTR ;50msX20=1S,未满20次,跳出中断子程序MOV R0,#20JNB 7FH,T0INT00 ;时间未到转T0INT00DJNZ R3,T0INTR ;未到3 S 跳出中断子程序CLR 7FH ;3 S时间到,清计时时间到标志CLR TR0 ;关定时器AJMP T0INTR ;跳出中断T0INT00:JNB 7EH,T0INT0 ;7EH为倒计时标志,1为倒计时DEC R4 ;=1,R4-1CJNE R4,#0,T0INTR CLR 7EH SETB 7FH ;时间到标志AJMP T0INTRT0INT0:INC R4CJNE R4,#99,T0INTRSETB 7FH ;时间到标志T0INTR:RETI
DISP: JNB 7DH,DISP1MOV 20H,22H ;22H存设定个位MOV 21H,23H ;23H存设定十位MOV A,23H MOV B,#10MUL ABADD A,22HMOV R4,ADISP1:MOV A,R4MOV B,#10DIV AB ;当前值除以10MOV 20H,A ;得出的商送给十位MOV 21H,B ;得出的余数送给个位 MOV A,20H ;十位显示MOVC A,@A+DPTRMOV P0,ASETB P2.1LCALL DELAYCLR P2.1 MOV A,21H ;个位显示MOVC A,@A+DPTRMOV P2,ASETB P2.0LCALL DELAYCLR P2.0RET
DELAY: ;误差 0usMOV R6,#10DL0:MOV R5,#50DJNZ R5,$DJNZ R6,DL0RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H ;共阳极0-9显示代码DB 92H,82H,0F8H,80H,90H END
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-12-20
程序就不具体写了,就写实现方法吧
主程序初始化好定时器T0,根据晶振频率算好一个值,然后进入主循环,循环内要做的时就是检测按键,可以多次检测去抖动,根据按键开定时器和关定时器T0(SETB TR0,CLR TR0),复位就是把X写0即可,同时完成将一个寄存器X的值复制到寄存器Y,然后将Y的内容换算为十进制的两个数,然后查表得到对应显示的端码送去P0和P2口。
T0中断服务程序,每次进中断后设定一个寄存器Z的值加1,达到设定的数字后回0,作用就是这个值乘T0定时的时间为1秒,如果寄存器回0的话,就把寄存器X加1,并判断到了99就回0。
如此程序的效果就是你要求的样子了
第2个回答  2013-12-20
K1 EQU P1.0
K2 EQU P1.1
K3 EQU P1.2
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
MOV TMOD,#11H
MOV TH0,#HIGH(65536-50000)
MOV TL0,#LOW(65536-50000)
MOV TH1,#HIGH(65536-5000)
MOV TL1,#LOW(65536-5000)
SETB ET0
SETB ET1
SETB TR1
SETB EA
MOV R2,#0
MOV R3,#0
LOOP:
JB K1,LOOP1
JNB K1,$
SETB TR0
SJMP LOOP
LOOP1:
JB K2,LOOP2
JNB K2,$
CLR TR0
SJMP LOOP
LOOP2:
JB K3,LOOP
JNB K2,$
LJMP MAIN
T0ISR:
CLR TR0
MOV TH0,#HIGH(65536-50000)
MOV TL0,#LOW(65536-50000)
SETB TR0
INC R2
CJNE R2,#20,T0E
MOV R2,#0
INC R3
CJNE R3,#100,T0E
MOV R3,#0
T0E:
RETI
T1ISR:
CLR TR1
MOV TH1,#HIGH(65536-5000)
MOV TL1,#LOW(65536-5000)
SETB TR1
MOV A,R3
MOV B,#10
DIV AB
MOV DPTR,#LEDTAB1
CPL 00H
JB 00H,T11
MOVC A,@A+DPTR
MOV P0,A
RETI
T11:
XCH A,B
MOVC A,@A+DPTR
MOV P2,A
RETI
;--------------------LEDTAB1: DB 0C0H ;"0" 00H DB 0F9H ;"1" 01H DB 0A4H ;"2" 02H DB 0B0H ;"3" 03H DB 99H ;"4" 04H DB 92H ;"5" 05H DB 82H ;"6" 06H DB 0F8H ;"7" 07H DB 80H ;"8" 08H DB 90H ;"9" 09H
END本回答被网友采纳