STRT EQU P0.4 ; 定义 (等价代换) 第一列
SEC EQU P0.5 ;矩阵键盘接口处
MIN EQU P0.6
HOUR EQU P0.7 //第4列
CL EQU P2.6 ;蜂鸣器
ORG 0000H
SJMP MAIN
ORG 000BH ;TO溢出时的 定时器 T0中断程序入口地址
AJMP T0INT0 ;TO溢,跳到T0INT0
ORG 0050H
MAIN: CLR P0.0 ;键盘的第一行有效
MOV P2,#0FFH ; 初值 11111111 给所有的位选端置零
MOV R4,#20
;计20次 后面中断进位
MOV TMOD,#01H ; TO为模式1 //向TMOD寄存器写入立即数01h。
MOV TH0,#03CH //表示对定时器T0赋初值低八位
MOV TL0,#0B0H
SETB TR0 ; 开启TO 定时/计数器0开始运行 TR0是单片机会响应定时/计数器0的启动位 与下面不同 这个是开启 下面这个是允许
SETB ET0 ;T0中断允许控制位位 开定时器中断0
SETB EA ;开中断 开总中断
MOV 30H,#00H ; 清零30H-32H地址单元:
MOV 31H,#00H
MOV 32H,#00H ;时分秒的储存单元
KS: LCALL DISP ;作用:无任何按键,动态显示
JB SEC, KM ;检查 秒键 按否?当sec等于1就去执行KM,否则往下执行
KSS: LCALL DISP
LCALL DALY2 ;显示
JNB SEC,KSS ;$当前地址,产生中断
AJMP SINC ;松 秒键 (秒+1)
KM: LCALL DISP
JB MIN,KH ;分调整按键(按,不管)
KMM:LCALL DISP
LCALL DALY2
JNB MIN,KMM
AJMP MINC ;(分+1)
KH: LCALL DISP
JB HOUR,K1 ;时调整按键 (按,不跳)
KHH:LCALL DISP
LCALL DALY2
JNB HOUR,KHH
AJMP HINC ;(时+1)
SINC: LCALL DISP //秒
LCALL CLO
LCALL DISP
INC 30H ;秒调整 30H单元的数据+1
MOV A,30H
CJNE A,#60,SINC0 ;A=60时,不管 , 否则跳
MOV 30H,#0 ;A=60 30H单元的数据清零 60/10=6.0 (6与0) 59/10=(5与9)
SINC0:AJMP KS //A的值跟60不同就回去再扫
MINC: LCALL DISP //分
LCALL CLO
LCALL DISP
INC 31H ;31H单元的数据+1
MOV A,31H
CJNE A,#60,MINC0
MOV 31H,#0
MINC0: AJMP KM ;返回"主跳"
HINC: LCALL DISP //时
LCALL CLO
LCALL DISP
INC 32H
MOV A,32H
CJNE A,#24,HINC0
MOV 32H,#0
HINC0:AJMP KH
k1: LCALL DISP
JB STRT,KS ;检查开始键
K11:LCALL DISP
LCALL DALY2
JNB STRT,K11 //当strt等于0时就跳k11
AJMP START
START:LCALL DISP
LCALL CLO
LCALL DISP
CPL TR0 ;////入口开始.将TR0位给取反。以来实现一个暂停
AJMP K1
DISP: MOV A,30H //单元中的数据/10,分离个位与十位 将地址为30H的寄存器内的数据送入A,结果A=由该寄存器内所存的实际数值决定。
MOV B,#10
DIV AB ; ;A除B,商存入A,余存入B
MOV 40H,B ;余数(秒个位数)
MOV 41H,A ;商(秒十位数)
MOV A,31H //分
MOV B,#10
DIV AB // ;A除B,商存入A,余存入B
MOV 42H,B ;余数(分个位数)
MOV 43H,A ;商(分十位数)
MOV A,32H //时
MOV B,#10
DIV AB
MOV 44H,B ;余数(时个位数)
MOV 45H,A ;商(时十位数)
////////时间在数码管显示//////////
MOV A,40H ;秒个位
ACALL SEG7
MOV P1,A
CLR P2.5
ACALL DLY
SETB P2.5
MOV A,41H ;秒十位
ACALL SEG7
MOV P1,A
CLR P2.4
ACALL DLY
SETB P2.4
MOV A,42H ;分个位
ACALL SEG7
MOV P1,A
CLR P2.3
ACALL DLY
SETB P2.3
MOV A,43H ;分十位
ACALL SEG7
MOV P1,A
CLR P2.2
ACALL DLY
SETB P2.2
MOV A,44H ;时个位
ACALL SEG7
MOV P1,A
CLR P2.1
ACALL DLY
SETB P2.1
MOV A,45H ;时十位
ACALL SEG7
MOV P1,A
CLR P2.0
ACALL DLY
SETB P2.0
RET
T0INT0:PUSH ACC
PUSH PSW
CLR TR0 ;暂停定时器T0
MOV A,#0B5H ; ; 10110101
ADD A,TL0 ; 低八位初值修正
MOV TH0,#03CH ; 00111100 ;定时中断子程序。重装定时常数
MOV TL0,A ; 重装初值(低8位修正值)
SETB TR0 ;开启定时器T0
DJNZ R4,T0INTR ; ;R4减1,不为0短跳转TOINTR
MOV R4,#20
INC 30H ;1S,秒存储单元内数+1
MOV A,30H
CJNE A,#60,T0INTR ;未满60S,跳出中断。
MOV 30H,#0 ;满60S,秒单元清零
INC 31H ;分+1
MOV A,31H
CJNE A,#60,T0INTR ;未满60分,跳出中断。
MOV 31H,#0 ;满60分,分单元清零
INC 32H ;时+1
MOV A,32H
CJNE A,#24,T0INTR ;未满24,跳出中断。
MOV 32H,#0 ;满24时,时单元清零
T0INTR: POP PSW
POP ACC
RETI
CLO: CLR CL ;P2.6蜂鸣器 CL0是蜂鸣器子程序
LCALL DALY1
SETB CL
RET
DALY1: ;误差 0us
MOV R6,#0D7H //0.215毫秒
DALY2: ;误差 0us
MOV R6,#01H // 消抖
DL0:
MOV R5,#2FH
DJNZ R5,$
DJNZ R6,DL0
RET
DLY: MOV R7,#2
D1: MOV R6,#40
DJNZ R6,$
DJNZ R7,D1
RET
DL3:
MOV R5,#2DH
DJNZ R5,$
DJNZ R6,DL3
NOP
NOP
RET
SEG7: INC A ; A加1 结果存在A
MOVC A,@A+PC //查表取值送入A
RETI ; 中断返回
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H //0-9的表格
END
这是矩阵键盘加数码管显示 |