|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
;系统初始化程序****************************************************
ORG 0000H
AJMP MAIN ;转到系统初始化程序
ORG 000BH
AJMP PITO ;转到定时器0中断服务程序
ORG 0100H
MAIN: MOV SP, #60H ;确立堆栈区
MOV TMOD, #01H ;设定定时器0为工作方式1
MOV TL0, #0DCH ;装计数器初值
MOV TH0, #0BH
CLR 21H.0
CLR TR0H ;TR0置“0”,定时关闭
SETB EAH ;EA置“1”,中断总允许
SETB ET0H ;ET0置“1”,定时器0中断
允许
MOV 30H, #10H ;循环次数
MOV 7EH, #0AH ;P.点显示初始化
MOV R0, #79H
MOV R1, #05H
PP: MOV @R0, #0BH
INC R0
DJNZ R1, PP
MOV R0, #31H ;时、分、秒值存储单元清零
MOV R1, #06H
Q00: MOV @R0, #00H
INC R0
DJNZ R1, Q00
;监控程序**********************************************************
LOOP: LCALL DIR ;调显示子程序
LCALL KEY ;调键扫描子程序
LOOP1: JB 20H.0, KEYA ;A键是否按下,是跳转到A键功能程序
JB 20H.1, KEYB ;B键是否按下,是跳转到B键功能程序
JB 20H.2, KEYC ;C键是否按下,是跳转到C键功能程序
JB 20H.3, KEYD ;D键是否按下,是跳转到D键功能程序
LCALL DIR
LJMP LOOP ;跳转到监控程序
;A键功能子程序****************************************************
KEYA: CPL TR0H ;开启/关闭定时器
SETB 21H.0
AJMP LOOP ;返回
;B键功能子程序****************************************************
KEYB: JB TR0H, KEYBO ;定时器是否运行,是跳转
JNB 21H.0, KEYBOO
MOV R0, #36H ;时值存储单元地址送R0
LCALL DAAD1 ;调加1子程序
MOV A, R3 ;时值加1后的值送累加器A
XRL A, #24H
JNZ KEYBO ;时值是否到24时,否返回
LCALL CLR0 ;时值存储单元清零
KEYBO: MOV 7DH, 35H
MOV 7EH, 36H
KEYBOO: LJMP LOOP ;返回监控程序
;C键功能子程序****************************************************
KEYC: JB 8CH, KEYCO ;定时器是否运行,否跳转
JNB 21H.0, KEYCOO
MOV R0, #34H ;分值存储单元地址送R0
LCALL DAAD1 ;调加1子程序
MOV A, R3 ;分值加1后的值送累加器A
XRL A, #60H
JNZ KEYCO ;分值是否到60分,否返回
LCALL CLR0 ;分值存储单元清零
KEYCO: MOV 7CH, 34H
MOV 7BH, 33H
KEYCOO: LJMP LOOP ;返回监控程序
;D键功能子程序****************************************************
KEYD: JB 8CH, KEYDO ;定时器是否运行,否跳转
JNB 21H.0, KEYDOO
MOV R0, #32H ;秒值存储单元地址送R0
LCALL DAAD1 ;调加1子程序
MOV A, R3 ;秒值加1后的值送R0
XRL A, #60H
JNZ KEYDO ;秒值是否到60秒,否返回
LCALL CLR0 ;秒值存储单元清0
KEYDO: MOV 79H, 31H
MOV 7AH, 32H
KEYDOO: LJMP LOOP ;返回监控程序
;中断服务程序******************************************************
PITO: PUSH PSW ;中断服务程序,现场保护
PUSH A
SETB RS0 ;选第三组通用寄存器
SETB RS1
MOV TL0, #0DCH ;计数器重新加载
MOV TH0, #0BH
MOV A, 30H ;循环次数减1
DEC A
MOV 30H, A
JNZ RETO ;不满16次,转RET0返回
MOV 30H, #10H ;满16次开始计时操作
MOV R0, #32H ;秒显示单元地址
ACALL DAAD1 ;秒加1
MOV A, R3 ;加1后秒值在R3中
XRL A, #60H ;判是否到60秒
JNZ RETO ;不到转RET0返回
ACALL CLR0 ;到60秒显示单元清0
MOV R0, #34H ;分显示单元地址
ACALL DAAD1 ;分加1
MOV A, R3 ;加1后分值在R3中
XRL A, #60H ;判是否到60分
JNZ RETO ;不到转RET0返回
ACALL CLR0 ;到60分显示单元清0
MOV R0, #36H ;时显示单元地址
ACALL DAAD1 ;时加1
MOV A, R3 ;加1后时值在R3中
XRL A, #24H ;判是否到24时
JNZ RETO ;不到转RET0返回
ACALL CLR0 ;到24时显示单元清0
RETO: CLR RS0 ;返回第0组通用寄存器
CLR RS1
POP A ;现场恢复
POP PSW
MOV 79H, 31H ;时、分、秒值放缓冲区
MOV 7AH, 32H
MOV 7BH, 33H
MOV 7CH, 34H
MOV 7DH, 35H
MOV 7EH, 36H
RETI ;中断返回
;加1子程序*******************************************************
DAAD1: MOV A, @R0 ;加1子程序,十位送A
DEC R0
SWAP A ;十位数占高4位
ORL A, @R0 ;个位数占低4位
ADD A, #01H ;加1
DA A ;十进制调整
MOV R3, A ;全值暂存R3中
ANL A, #0FH ;屏蔽十位数,取出个位数
MOV @R0, A ;个位值送显示缓冲单元
MOV A, R3
INC R0
ANL A, #0F0H ;屏蔽个位数取出十位数
SWAP A ;使十位数占低四位
MOV @R0, A ;十位数送缓冲单元
RET ;返回
CLR0: CLR A ;清缓冲单元子程序
MOV @R0, A ;十位缓冲单元清“0”
DEC R0
MOV @R0, A ;个位数缓冲单元清“0”
RET ;返回
;键盘扫描子程序***************************************************
KEY: LCALL KEYCHULI ;调键值处理子程序
JZ EXIT ;没有键按下转到返回
LCALL DIR
LCALL DIR ;调显示去抖动
LCALL KEYCHULI ;调键值处理子程序
JZ EXIT ;没有键按下转到返回
MOV B, 20H ;保存键值
KEYSF: LCALL KEYCHULI ;调键值处理子程序
JZ KEY1 ;键释放,转到恢复键值
LCALL DIR ;调显示子程序延时
AJMP KEYSF ;等到键释放
KEY1: MOV 20H, B ;键值送20H单元保存
EXIT: RET ;返回
KEYCHULI: PUSH PSW ;保护现场
CLR RS1 ;改变寄存器组号
SETB RS0
MOV P1, #0FFH ;先向P1口写1
MOV A, P1 ;P1口值送累加器A
CPL A ;A值取反
ANL A, #0FH ;保存P1口的低4位
MOV 20H, A ;A值送20H保存
CLR RS1 ;改变寄存器组号
CLR RS0
POP PSW ;恢复现场
RET
;显示子程序********************************************************
DIR: PUSH PSW ;恢复现场
SETB RS1 ;改变寄存器组号
CLR RS0
MOV R0, #79H ;建立显示缓冲区首地址
MOV R3, #0FBH ;设置位控码
LD0: MOV P2, R3 ;送位控码
MOV A, @R0 ;缓冲区值送累加器A
DISP1: ADD A, #1BH
MOVC A, @A+PC ;取段控码并送A中
DISP2: MOV P0, A ;送段控码
MOV R2, #09H ;设置延时循环次数
ACALL DEY ;延时点亮
INC R0 ;缓冲区地址加1
MOV A, R3 ;位控码送A
JNB ACC.1, HERE ;是否到最高位,是转到返回
JB ACC.5, LD2
RL A
RL A ;不到向显示器高位移位
LD2:RL A
MOV R3, A ;位控值保存到R4中
AJMP LD0 ;继续扫描
HERE: CLR RS0 ;改变寄存器组号
CLR RS1
POP PSW ;恢复现场
RET ;返回
DBB: DB 0C0H
DB 0F9H
DB 0A4H
DB 0B0H
DB 99H
DB 92H
DB 82H
DB 0F8H
DB 80H
DB 90H
DB 0CH
DB 0FFH
;延时子程序********************************************************
DEY: PUSH 12H
DEY0: PUSH 12H
DEY1: PUSH 12H
DEY2: DJNZ R2, DEY2
POP 12H
DJNZ R2, DEY1
POP 12H
DJNZ R2, DEY0
POP 12H
DJNZ R2, DEY
RET
END
联系qq1527895421
|
|