5. 主程序(包含键盘扫描模块)流程图
键盘扫描部分是主程序中的子程序FINDKEY,是无条件循环的,其中KEYNUM保存上一次的按键值,取00~03H,代表K0~K3,初始值KEYNUM为04H。键盘按键只有K0~K3有效,键盘上其他按键无效。流程图如下图6:
开始时钟配置,中断配置,各个模块参数的初始化C=1?响一声喇叭CPU、T0、T1和T2开中断启动T0,T1和T2调用子程序FINDKEY
进入FINDKEYMOV P2,#0EH是延迟10毫秒P2.0=0?否否是P2.0=0?延迟10毫秒P2.1=0?是否否MOV A,#00HP2.1=0?P2.2=0?延迟10毫秒是否是A=KEYNUM?MOV A,#00HP2.3=0?延迟10毫秒否P2.2=0?是否否是是KEYNUM<--0A=KEYNUM?P2.3=0?否MOV A,#00H否是SETB OVER是SETB TF0KEYNUM<--1MOV A,#00HA=KEYNUM?否SETB OVER是SETB TF0A=KEYNUM?KEYNUM<--3否KEYNUM<--2SETB OVERSETB OVERSETB TF0SETB TF0返回
图 6 主程序流程图
11
五、源程序 (含文件头说明、资源使用说明、语句行注释)
;------------------------------------ ;A的值取00H~03H代表模式0~模式3
;模式0~模式2控制LED闪烁,模式3为电子计时器 ;使用了K0~K3四个矩阵键盘上的按键 ;------------------------------------
$include (C8051F310.inc) LED BIT P0.0 BEEP BIT P3.1 KINT BIT P0.1
OVER BIT 20H.0 ;自动模式终结标志
BIT0 EQU 30H;储存内容代表数码管0位显示的字符 BIT1 EQU 31H;储存内容代表数码管1位显示的字符 BIT2 EQU 32H;储存内容代表数码管2位显示的字符 BIT3 EQU 33H;储存内容代表数码管3位显示的字符 DOT EQU 21H;控制显示小数点 DOT0 BIT 21H.0;0位小数点 DOT1 BIT 21H.1;1位小数点 DOT2 BIT 21H.2;2位小数点 DOT3 BIT 21H.3;3位小数点
SEC1 EQU 34H;个位秒,数码管第0位显示之 SEC2 EQU 35H;十位秒,数码管第1位显示之 MIN1 EQU 36H;个位分,数码管第2位显示之 MIN2 EQU 37H;十位分,数码管第3位显示之 FLAG EQU 38H;值代表扫描四位数码管的哪一位 KEYNUM EQU 39H;用来保存按下的按键值 ORG 0000H LJMP MAIN
ORG 0003H ;外部中断0入口地址 LJMP INT0
ORG 000BH ;T0中断服务入口地址 LJMP INT_T0 ORG 001BH ;T1中断服务入口地址
LJMP INT_T1 ORG 002BH ;T2中断服务入口地址
LJMP INT_T2
12
ORG 0200H
MAIN: ACALL Init_Device ;必要的配置及参数的初始化 MOV P1,#00H ;关闭显示 CLR A CLR C
JC SLIENCE ;C作为是否进入过外部中断0的判断,为1表示进入过中断0 LCALL DELAY0_5;DELAY 0.5S SETB BEEP
;响喇叭
LCALL DELAY0_5 ;延迟
SLIENCE:CLR BEEP ;关喇叭,用外部中断切换模式不响喇叭 CLR LED SETB EA
;CPU开中断
SETB ET2 ;T2开中断 SETB ET1 ;T1开中断 SETB ET0 ;T0开中断 SETB TR0 ;启动T0 SETB TR1 ;启动T1 SETB TR2
;启动T2
MOV DPTR,#TAB0
HERE:ACALL FINDKEY;扫描键盘 SJMP HERE
;*********模式选择模块************************************ INT_T0: RL A JMP @A+DPTR TAB0:AJMP CASE5_0HZ ;三种不同闪烁频率,一个电子计时器
AJMP CASE1_0HZ AJMP CASE0_5HZ AJMP CASE_TIME
CASE5_0HZ:MOV TH0,#0E7H;T0装入初值,0.1S中断一次 MOV TL0,#014H CPL LED
;定时取反,,LED以5hz闪烁
MOV BIT0,#00H ;给数码管显示模块的入口参数赋值,显示0-5.0 MOV BIT1,#05H MOV BIT2,#0AH MOV BIT3,#00H
13
MOV DOT,#02H ;显示数码管1位的小数点 RR A
;A恢复为原来的值
RETI
CASE1_0HZ:MOV TH0,#83H ;T0装入初值,0.5S中断一次 MOV TL0,#63H CPL LED
;定时取反,LED以1HZ闪烁
MOV BIT0,#00H ;给数码管显示模块的入口参数赋值,显示1-1.0 MOV BIT1,#01H MOV BIT2,#0AH MOV BIT3,#01H MOV DOT,#02H RR A RETI
CASE0_5HZ:MOV TH0,#06H ;T0装入初值,1S中断一次 MOV TL0,#0C6H CPL LED
;定时取反,LED以0.5HZ闪烁
MOV BIT0,#05H ;给数码管显示模块的入口参数赋值,显示2-0.5 MOV BIT1,#00H MOV BIT2,#0AH MOV BIT3,#02H MOV DOT,#02H RR A RETI
CASE_TIME:SETB LED ;关闭led
MOV TH0,#0E7H ;T0装入初值,0.1S CPL MOV TL0,#014H
MOV BIT0,SEC1 ;给数码管显示模块的入口参数赋值,显示运行时间 MOV BIT1,SEC2 MOV BIT2,MIN1 MOV BIT3,MIN2
MOV DOT,#04H ;显示数码管第2位的小数点,作为分钟与秒的分隔符号 RR A RETI
;********计时模块***************************************** INT_T1:MOV TH1,#03H ;T1装入初值1SCPL,0.5HZ MOV TL1,#0BEH
;实现电子计时器进制要求
14
DJNZ R4,INCSEC1 ;个位秒每秒自加,每10次归零循环 MOV SEC1,#00H MOV R4,#0AH
DJNZ R5,INCSEC2 ;十位秒每十秒自加,每6次归零循环 MOV SEC2,#00H MOV R5,#06H
DJNZ R6,INCMIN1 ;个位分钟60秒自加,每10次归零循环 MOV MIN1,#00H MOV R6,#0AH
DJNZ R7,INCMIN2 ;十位分钟10分钟自加,每6次归零循环 MOV MIN2,#00H MOV R7,#06H JMP DIV20S
INCSEC1:INC SEC1 ;数码管第0位显示的数字加1 JMP DIV20S
INCSEC2:INC SEC2 ;数码管第1位显示的数字加1 JMP DIV20S
INCMIN1:INC MIN1 ;数码管第2位显示的数字加1 JMP DIV20S
INCMIN2:INC MIN2 ;数码管第3位显示的数字加1 DIV20S:DJNZ R0,RET_DIV20S;20s MOV R0,#14H
;R0分频,产生20s计时
JB OVER,RET_DIV20S ;OVER为1时,不根据时间自动切换模式 CJNE A,#02H,NOBEEP
SETB BEEP ;响喇叭 LCALL DELAY0_5 ;延迟
CLR BEEP ;关闭喇叭
NOBEEP:CJNE A,#03H,NEEDINC ;自动切换模式下,A小于03h时需要自加完成20s切换模式的功能 SETB OVER ;A为03时不再按时间自动切换模式 SETB TF0 ;立刻刷新数码管显示的计时数 JMP RET_DIV20S NEEDINC:INC A ;A作为模式标志参量,自加切换模式
RET_DIV20S:RETI
;********外部中断模块***************************************** INT0: INC A ANL A,#03H ;A在00h~03h间循环变化 SETB OVER
;关闭自动切换
15