尝试许久,仿真就是没反应,不知哪里有错?
小弟通常用C,汇编不会编,不会编汇编,不知用C语言怎么编下列程序?
看不清可另下电路附件
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP CLOCK
ORG 0030H
MAIN: MOV SP,#50H ;设置堆栈区
MOV DPTR,#PORT ; 8155初始化
MOV A,#03H
MOVX @DPTR,A
CLR F1 ;清0闹钟标志位
CLR F0 ;允许计时显示
MOV AHOUR,#0FFH ;闹钟值寄存区初值
MOV AMIN,#0FFH
MOV ASEC,#0FFH
MOV R7,#10H ;显示缓冲区、计时缓冲区清0
MOV R0,#DISP0
CLR A
LOOP: MOV @R0, A
INC R0
DJNZ R7,LOOP
MOV TMOD,#01H ;定时器T0初始化
MOV TL0, #0B0H
MOV TH0, #3CH
SETB TR0 ; 启动定时器0
SETB EA ; 开中断
SETB ET0
BEGIN: ACALL ALARM ;调用定时器比较
ACALL KEYSCAN ;调用键盘扫描
CJNE A,#0AH,NEXT1;是C/R键否?
CLR TR0 ;暂停计时
MOV R1, #HOUR ;地址指针指向计时缓冲区首地址
AJMP MOD
NEXT1: CJNE A,#0BH ,BEGIN;是ALM键否?
JB F1,NEXT2 ;闹钟正在闹响否?
MOV R1,#AHOUR ;地址指针指向闹钟值寄存区首地址
MOD: SETB F0 ;禁止显示计时时间
ACALL MODIFY ;调用时间设置/闹钟定时程序
SETB TR0 ; 重新开始计时
CLR F0 ; 恢复显示计时时间
AJMP BEGIN
NEXT2: SETB P1.0 ;闹钟正在闹响,停闹
CLR F1 ;清0闹钟标志
AJMP BEGIN
/*定时器T0中断服务子程序*/
CLOCK: PUSH PSW
PUSH ACC ;保护现场
MOV TL0,#0B7H
MOV TH0,33CH ;重装初值,时间校正
INC MSEC
MOV A,MSEC
CJNE A,#0AH,DONE
MOV MSEC,#00H
MOV A,SEC
ADD A,#01H
DA A ;二-十进制转换
MOV SEC,A
CJNE A,#60H,DONE
MOV SEC,#00H
MOV A,MIN
ADD A,#01H
DA A
MOV MIN,A
CJNE A,#60H,DONE
MOV MIN,#00H
MOV A,HOUR
ADD A,#01H
DA A
MOV HOUR,A
CJNE A,#24H,DONE
MOV HOUR,#00H
DONE: POP ACC
POP PSW
RETI
/*键盘设置子程序*/
KEYIN: PUSH PSW ;保护现场
PUSH ACC
SETB RS1
MOV R0,#DISP0 ;R0指向显示缓冲区首地址
MOV R7,#06H ;设置键盘输入次数
L1: CLR RS1
ACALL KEYSCAN ;调用键盘扫描程序取按下键号
SETB RS1
CJNE A,#0AH,L2 ;键入数合法性检测(是否大于9)
L2: JNC L1 ; 大于9,重新输入
MOV @R0,A ;键号送显示缓冲区
INC R0
DJNZ R7,L1 ;6位时间输入完否?未完继续
CLR RS1 ;恢复现场
POP ACC
POP PSW
RET
/*定时比较模块*/
ALARM: MOV A,ASEC
CJNE A,SEC,BACK ; 秒钟单元相同则继续比较,否则返回
MOV A,AMIN
CJNE A,MIN,BACK ;分钟单元相同则继续比较,否则返回
MOV A,AHOUR
CJNE A,HOUR,BACK ;小时单元相同定时时间到
CLR P1.0 ;启动闹钟鸣叫
SETB F1 ;置位闹钟标志
BACK: RET
|