汇编语言程序:
DATA_SEG SEGMENT DATA ;定义一个DATA段
STACK SEGMENT IDATA ;定义一个堆栈段
BIT_SEG SEGMENT BIT ;定义一个位段
bKey BIT P1.0;
IdleConst EQU 50
RSEG STACK
DS 10H ;16个字节的堆栈
RSEG DATA_SEG ;开始DATA_SEG段
buffer: DS 6 ;6个字节的显示缓冲区
ms50: DS 1 ;50ms计数
ms250: DS 1 ;250ms计数
sec: DS 1 ;秒
min: DS 1 ;分
hour: DS 1 ;时
ms50_1: DS 1 ;存放多少个50ms,用于记录按键时间
SetPos: DS 1 ;设置位置
SetPos1: DS 1 ;需要屏蔽的数码管
RSEG BIT_SEG
bIdle: DBIT 1 ;省电模式
bTwinkle: DBIT 1 ;当前设置位置闪烁
CSEG AT 0 ;相当于小汇编的ORG
LJMP MAIN
CSEG AT 000BH ;定时器T0中断处理入口地址
LJMP INT_Timer0
CSEG AT 001BH ;定时器T1中断处理入口地址
LJMP INT_Timer1
CSEG AT 0100H
MAIN: MOV SP,#STACK-1 ;堆栈
CLR bIdle
CLR bTwinkle
MOV ms50,A ;清零50ms
MOV ms250,A
MOV hour,#12 ;设定初值: 12:59:50
MOV min,#59
MOV sec,#50
MOV TH0,#3CH ;定时中断计数器初值
MOV TL0,#B0H ;定时50ms
MOV TMOD,#11H ;定时器0,1:方式一
MOV IE,#8AH ;中断初始化,EA=1,ET0=1, ET1 = 1
SETB TR0 ;开定时器T0
MOV SetPos,#0FFH ;
MAIN1: ACALL AdjustBuffer ;调整显示缓冲区
MAIN2: ACALL Key ;调用键扫描
ACALL Display
JNB F0,MAIN2
CLR F0
SJMP MAIN1 ;需要刷新显示时间
;中断服务程序
INT_Timer0: MOV TL0,#B5H
MOV TH0,#60
PUSH 01H
MOV R1,#ms50
INC @R1 ;50ms单元加1
CJNE @R1,#5,ExitInt
MOV @R1,#0 ;恢复初值
INC R1
MOV A,SetPos
CJNE A,#0FFH,INT_Timer0_1
SJMP INT_Timer0_2
INT_Timer0_1: CPL bTwinkle
SJMP ExitInt1
INT_Timer0_2: INC @R1
CJNE @R1,#4,ExitInt
MOV @R1,#0 ;恢复初值
INC R1
INC @R1 ;秒加1
CJNE @R1,#60,ExitInt1
MOV @R1,#0
INC R1
INC @R1 ;分加1
CJNE @R1,#60,ExitInt1
MOV @R1,#0
INC R1
INC @R1 ;时加1
CJNE @R1,#24,ExitInt1
MOV @R1,#0
ExitInt1: SETB F0
ExitInt: POP 01H
RETI;
中断服务程序
INT_Timer1: MOV TL0,#176+5
MOV TH0,#60
INC ms50_1
RETI
HexToBCD: MOV B,#10
DIV AB
MOV @R0,B
INC R0
MOV @R0,A
INC R0
RET
AdjustBuffer: MOV R0,#buffer
MOV A,sec
ACALL HexToBCD
MOV A,min
ACALL HexToBCD
MOV A,hour
ACALL HexToBCD
RET
;显示
Display: JNB bIdle,Display3
RET ;省电模式
Display3: PUSH B
PUSH ACC
PUSH DPL
PUSH DPH
PUSH 00H
MOV R0,#buffer
MOV B,#0FEH
MOV DPTR,#SEG_TAB
Display1: MOV A,@R0
MOVC A,@A+DPTR ;取段码
MOV P0,A
MOV A,B
JNB bTwinkle,Display4
ORL A,SetPos1
Display4: MOV P2,A ;选种数码管
CALL Delay1ms
MOV A,B
RL A
JNB ACC.6,Display2
MOV B,A
INC R0
SJMP Display1
Display2: POP 00H
POP DPH
POP DPL
POP ACC
POP B
RET
SEG_TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H ;段码
DB 080H,90H,88H,83H,0C6H,0A1H,86H,8EH
DB 0FFH,0BFH ;延时1ms
Delay1ms: PUSH ACC
MOV A,#230
DJNZ ACC,$
MOV A,#230
DJNZ ACC,$
POP ACC
RET ; 设置功能
SetFunTab: AJMP NoSet ;不需要调整
AJMP SetHour ;调整小时
AJMP SetMin ;调整分钟
AJMP SetSec ;调整秒钟
NoSet: CLR bTwinkle
RET ;不在设置状态
SetHour: INC hour
MOV A,hour
CJNE A,#24,SetHour1
MOV hour,#0
SetHour1: SJMP SetFun1
SetMin: INC min
MOV A,min
CJNE A,#60,SetMin1
MOV min,#0
SetMin1: SJMP SetFun1
SetSec: INC sec
MOV A,sec
CJNE A,#60,SetFun1
MOV sec,#0
SetFun1: SETB F0
RET;调整闪烁位置
SetPosTab: AJMP NoSetPos
AJMP SetHourPos
AJMP SetMinPos
AJMP SetSecPos
NoSetPos: MOV SetPos1,#0
RET
SetHourPos: MOV SetPos1,#30H
RET
SetMinPos: MOV SetPos1,#0CH
RET
SetSecPos: MOV SetPos1,#03H
RET
Key: ACALL Display
JNB bKey,Key4
JNB TR1,Key3
CLR TR1
SETB bKey
MOV A,ms50_1
CJNE A,#10,$+3
JNC Key1
;调整时间
SetFun: MOV A,SetPos
INC A
RL A
MOV DPTR,#SetFunTab
JMP @A+DPTR
Key1: CJNE A,#IdleConst,$+3
JNC Key2
;进入设置状态
SetPosFun: INC SetPos
MOV A,SetPos
CJNE A,#3,SetPosFun1
MOV SetPos,#0FFH ;退出设置状态
SetPosFun1: MOV A,SetPos
INC A
RL A
MOV DPTR,#SetPosTab
JMP @A+DPTR
Key2: SETB bIdle ;进入省电模式
MOV P2,#0FFH
Key3: RET
Key4: JNB TR1,Key5
MOV A,ms50_1
CJNE A,#IdleConst,$+3
JNC Key2
RET
Key5: ACALL Display
ACALL Display
ACALL Display
ACALL Display
JNB bKey,Key6
SJMP Key3
Key6: CLR bIdle
MOV TH1,#60
MOV TL1,#176
SETB TR1
MOV ms50_1,#0
RET
END
文章评论(0条评论)
登录后参与讨论