按键计数器
下面介绍一种通过MSP430F149单片机使用IARMSP430软件编程,使用汇编语言编程,记录K1,K2,K3按键点击次数,并通过LCD1602液晶屏显示出来的程序。开始点击K1键10次,直到LCD显示AD COUNT:0,计数器开始记录K1键按下去的次数,K1接在P1.0 K2接在P1.1, K3接在P1.2 , K4接在P1.3,K5接在P1.4 ,K6接在P1.5 , K7接在P1.6, K8接在P1.7.
点击K1键,多少次,点击K5键LCD就会显示K1键按下去的次数,和最后一次按键的时间
开始点击K2键10次,直到LCD显示AD COUNT:0,计数器开始记录K1键按下去的次数,
点击K2键,多少次,点击K6键LCD就会显示K1键按下去的次数,和最后一次按键的时间
开始点击K3键10次,直到LCD显示AD COUNT:0,计数器开始记录K1键按下去的次数,
点击K3键,多少次,点击K7键LCD就会显示K1键按下去的次数,和最后一次按键的时间
点击K8键LCD显示当前时间
点击 K4键计数器复位
程序如下
; K1=P1.4 K2=P1.5 K3=P1.6 K4=P1.7
;* 1602LCD显示秒表 *
;* K3 — 控制按键 *
;* 第一次按下时,开始计时,第二次按下时,暂停计时。 *
;* 第三次按下时,累计计时,第四次按下时,暂停计时。 *
;* K4 — 清零按键: *
;* 在任何状态下,按一下K4,均可清零。 *
;* *
// 开始点击K1键10次,直到LCD显示AD COUNT:0,计数器开始记录K1键按下去的次数,
//点击K1键,多少次,点击K5键LCD就会显示K1键按下去的次数,和最后一次按键的时间
// 开始点击K2键10次,直到LCD显示AD COUNT:0,计数器开始记录K1键按下去的次数,
//点击K2键,多少次,点击K6键LCD就会显示K1键按下去的次数,和最后一次按键的时间
// 开始点击K3键10次,直到LCD显示AD COUNT:0,计数器开始记录K1键按下去的次数,
//点击K3键,多少次,点击K7键LCD就会显示K1键按下去的次数,和最后一次按键的时间
//点击K8键LCD显示当前时间
//点击 K4键计数器复位
;---------------------------------------
;晶振 11.0592M
;定时器0,方式1
;计时中断程序每隔10ms中断一次
;---------------------------------------
// $INCLUDE(anjian.ASM)
// EXTRN CODE (ANJIAN)
//PUBLIC ANJIAN
TLOW EQU 0CH ;定时器初值
THIGH EQU 0DCH
// TLOW EQU 02H ;定时器初值
//THIGH EQU 009H
NIAN1 EQU 26H
NIAN EQU 27H
YUE EQU 28H
RI1 EQU 29H
HOUR EQU 30H
MIN EQU 31H
SEC EQU 32H
SEC0 EQU 33H ;10ms计数值
KEY_S EQU 34H ;为键当前的端口状况
KEY_V EQU 35H ;为键上次的端口状况
X EQU 36H ;LCD 地址变量
KEY_C EQU 37H ;键计数单元
KEY_SA EQU 38H ;为键当前的端口状况
KEY_VA EQU 39H ;为键上次的端口状况
KEY_CA EQU 40H ;键计数单元
KEY_SB EQU 41H ;为键当前的端口状况
KEY_VB EQU 42H ;为键上次的端口状况
KEY_CB EQU 43H ;键计数单元
KEY_SC EQU 44H ;为键当前的端口状况
KEY_VC EQU 45H ;为键上次的端口状况
KEY_CC EQU 46H ;键计数单元
KEY_SD EQU 47H ;为键当前的端口状况
KEY_VD EQU 48H ;为键上次的端口状况
KEY_CD EQU 49H ;键计数单元
KEY_SE EQU 50H ;为键当前的端口状况
KEY_VE EQU 51H ;为键上次的端口状况
KEY_CE EQU 52H ;键计数单元
KEY_SF EQU 53H ;为键当前的端口状况
KEY_VF EQU 54H ;为键上次的端口状况
KEY_CF EQU 55H ;键计数单元
DATA1 EQU 56H ;为键当前的端口状况
DATA2 EQU 57H ;为键上次的端口状况
DATA3 EQU 58H ; ;键计数单元
DATA4 EQU 59H ;为键当前的端口状况
K1 EQU P3.0
K2 EQU P3.1
K3 EQU P3.2
K4 EQU P3.3
K5 EQU P3.4
K6 EQU P3.5
K7 EQU P3.6
K8 EQU P3.7
// BEEP EQU P3.7
// RS EQU P2.0 ;LCD控制端口定义
// RW EQU P2.1
// EN EQU P2.2
BEEP EQU P2.3
RS EQU P1.0 ;LCD控制端口定义
RW EQU P1.1
EN EQU P2.5
;----------------------------------------------------
ORG 0000H
JMP START
ORG 0BH
JMP T0_INT
;----------------------------------------------------
START: MOV SP,#60H
CLR EN
CALL SET_LCD
CALL INIT ;初始化变量
// MOV KEY_V,#01H
MOV KEY_V,#07H
MOV KEY_VA,#08H
MOV KEY_VB,#09H
// MOV KEY_VC,#02H
CALL INIT_TIMER ;初始化定时器
SETB TR0 ;启动中断
// CALL MENU
MAIN: //MOV SP,#60H
// CLR EN
CALL SET_LCD
// CALL INIT ;初始化变量
// MOV KEY_V,#01H
// MOV KEY_VC,#02H
// CALL INIT_TIMER ;初始化定时器
//SETB TR0 ;启动中断
LOOP: // CALL CONV ;时间计数处理
CALL LOOP1
CALL LOOP2
CALL LOOP3
CALL LOOP4
CALL LOOP5
// CALL LOOP40
CALL SKEY ;判是否有键按下
JZ LOOPA ;无键按下转LOOP
// CALL CONV
CALL SKEY
JZ LOOP
MOV KEY_V,KEY_S ;交换数据
CALL P_KEY
JMP LOOP
LOOPA: //CALL CONV ;时间计数处理
CALL LOOP1
//CALL SKEY ;判是否有键按下
CALL SKEY1 ;判是否有键按下
// CALL SKEY2 ;判是否有键按下
JZ LOOPB ;无键按下转LOOP
// CALL CONV
//CALL SKEY
CALL SKEY1
// CALL SKEY2
JZ LOOPA
MOV KEY_VA,KEY_SA ;交换数据
CALL P_KEYA
JMP LOOPA
LOOPB: // CALL CONV ;时间计数处理
CALL LOOP1
//CALL SKEY ;判是否有键按下
//CALL SKEY1 ;判是否有键按下
CALL SKEY2 ;判是否有键按下
JZ LOOP ;无键按下转LOOP
// CALL CONV
//CALL SKEY
//CALL SKEY1
CALL SKEY2
JZ LOOPB
MOV KEY_VB,KEY_SB ;交换数据
CALL P_KEYB
JMP LOOPB
;-----------------------------------------------------
LOOP1: JB K4,LOOP6 ;判清零键是否按下
// CALL BZ
//JMP START
JMP MAIN
// CALL SET_LCD
LOOP2: JB K5,LOOP6 ;判清零键是否按下
// MOV A,KEY_VC
// JB ACC.0,P_KEY3
// INC KEY_CC
// CJNE A,#01H,P_KEY
// MOV DPTR,#MADJ ;显示执行信息
//CALL P_KEY
MOV A,KEY_C ;K3键是否第一次按下?
CALL P_KEY
// CJNE A,#01H,P_KEY1
//CJNE A,#01H,P_KEY1
CJNE A,#05H,KEY_C
MOV DPTR,#MADJ5 ;显示执行信息
//CALL CONV
// CALL DE
// DELAY:
MOV A,#1 ;
CALL LCD_PRINT
// JMP START
LOOP3: JB K6,LOOP6 ;判清零键是否按下
// MOV A,KEY_VC
// JB ACC.0,P_KEY3
// INC KEY_CC
// CJNE A,#01H,P_KEY
// MOV DPTR,#MADJ ;显示执行信息
//CALL P_KEY
//IF (DATA1 =1)
MOV A,KEY_CA ;K3键是否第一次按下?
CALL P_KEYA
// CALL DELAY1
// CJNE A,#01H,P_KEY1
// CJNE A,#01H,P_KEYA1
//CJNE A,#01H,KEY_C
//CJNE A,#01H, KEY_C
// CJNE A,#01H,KEY_VA
// CJNE A,#01H,KEY_SA
CJNE A,#05H,KEY_CA
MOV DPTR,#MADJA5 ;显示执行信息
// CALL DE
// DELAY:
MOV A,#1 ;
CALL LCD_PRINT
// ENDIF
// RET
// JMP START
LOOP4: JB K7,LOOP6 ;判清零键是否按下
// MOV A,KEY_VC
// JB ACC.0,P_KEY3
// INC KEY_CC
// CJNE A,#01H,P_KEY
// MOV DPTR,#MADJ ;显示执行信息
//CALL P_KEY
//IF (DATA2 =1)
MOV A,KEY_CB ;K3键是否第一次按下?
CALL P_KEYB
// CJNE A,#01H,P_KEYB
// MOV DATA1,KEY_CB
//CJNE A,#01H, DATA1
// CJNE A,#01H,KEY_VB
// CJNE A,#01H,KEY_SB
CJNE A,#05H,KEY_CB
//CALL DELAY1
MOV DPTR,#MADJB5 ;显示执行信息
//CJNE A,#01H,KEY_V
// CJNE A,#02H, DATA1
//CJNE A,#01H,KEY_C
// MOV DPTR,#MADJB ;显示执行信息
// CALL DE
// DELAY:
MOV A,#1 ;
CALL LCD_PRINT
// ENDIF
// RET
// JMP START
// LOOP40:
// JB K7,LOOP5 ;判清零键是否按下
// MOV A,KEY_VC
// JB ACC.0,P_KEY3
// INC KEY_CC
// CJNE A,#01H,P_KEY
// MOV DPTR,#MADJ ;显示执行信息
//CALL P_KEY
// MOV A,KEY_CB ;K3键是否第一次按下?
// CALL P_KEYB
// CJNE A,#01H,P_KEYB
// MOV DATA1,KEY_CB
//CJNE A,#01H, DATA1
// CJNE A,#02H,KEY_C
// CJNE A,#02H, DATA1
//CJNE A,#01H,KEY_C
// MOV DPTR,#MADJB1 ;显示执行信息
// CALL DE
// DELAY:
// MOV A,#1 ;
// CALL LCD_PRINT
// JMP START
LOOP5: JB K8,LOOP6 ;判清零键是否按下
CALL CONV
LOOP6: RET
;-----------------------------------------------------
P_KEY: ;
MOV A,KEY_V
JB ACC.0,P_KEY3
INC KEY_C
MOV A,KEY_C ;K3键是否第一次按下?
CJNE A,#0001H,P_KEY1
MOV DPTR,#MADJ0 ;显示执行信息
MOV A,#1 ;
CALL LCD_PRINT
CALL CONV
//SETB TR0 ;启动中断
RET
P_KEY1: ;K3键是否第二次按下?
MOV A,KEY_C
CJNE A,#0002H,P_KEY2
MOV DPTR,#MADJ0 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//CLR TR0 ;停止中断
RET
P_KEY2: ;K3键是否第三次按下?
MOV A,KEY_C
CJNE A,#0003H,P_KEY3
MOV DPTR,#MADJ0 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//SETB TR0 ;启动中断
RET
P_KEY3: ;K3键是否第四次按下?
MOV A,KEY_C
CJNE A,#0004H,P_KEY4
MOV DPTR,#MADJ0 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
// CLR TR0 ;启动中断
P_KEY4: ;K3键是否第二次按下?
MOV A,KEY_C
CJNE A,#0005H,P_KEY5
MOV DPTR,#MADJ0 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//CLR TR0 ;停止中断
RET
P_KEY5: ;K3键是否第三次按下?
MOV A,KEY_C
CJNE A,#0006H,P_KEY6
MOV DPTR,#MADJ0 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//SETB TR0 ;启动中断
RET
P_KEY6: ;K3键是否第四次按下?
MOV A,KEY_C
CJNE A,#0007H,P_KEY7
MOV DPTR,#MADJ ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
// CLR TR0 ;启动中断
P_KEY7: ;K3键是否第二次按下?
MOV A,KEY_C
CJNE A,#0008H,P_KEY8
MOV DPTR,#MADJ0 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//CLR TR0 ;停止中断
RET
P_KEY8: ;K3键是否第三次按下?
MOV A,KEY_C
CJNE A,#0009H,P_KEY9
MOV DPTR,#MADJ1 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//SETB TR0 ;启动中断
RET
P_KEY9: ;K3键是否第四次按下?
MOV A,KEY_C
CJNE A,#000AH,P_KEY10
MOV DPTR,#MADJ2 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
// CLR TR0 ;启动中断
P_KEY10: ;K3键是否第二次按下?
MOV A,KEY_C
CJNE A,#0BH,P_KEY11
MOV DPTR,#MADJ3 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//CLR TR0 ;停止中断
RET
P_KEY11: ;K3键是否第三次按下?
MOV A,KEY_C
CJNE A,#000CH,P_KEY12
MOV DPTR,#MADJ4 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//SETB TR0 ;启动中断
RET
P_KEY12: ;K3键是否第四次按下?
MOV A,KEY_C
CJNE A,#000DH,P_KEY13
MOV DPTR,#MADJ5 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
// CLR TR0 ;启动中断
P_KEY13: ;K3键是否第二次按下?
MOV A,KEY_C
CJNE A,#000EH,P_KEY14
MOV DPTR,#MADJ6 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//CLR TR0 ;停止中断
RET
P_KEY14: ;K3键是否第三次按下?
MOV A,KEY_C
CJNE A,#000FH,P_KEY15
MOV DPTR,#MADJ7 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//SETB TR0 ;启动中断
RET
P_KEY15: ;K3键是否第四次按下?
MOV A,KEY_C
CJNE A,#0010H,P_KEY16
MOV DPTR,#MADJ8 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
// CLR TR0 ;启动中断
P_KEY16: ;K3键是否第二次按下?
MOV A,KEY_C
CJNE A,#0011H,P_KEY17
MOV DPTR,#MADJ9 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//CLR TR0 ;停止中断
RET
P_KEY17: ;K3键是否第三次按下?
MOV A,KEY_C
CJNE A,#0012H,P_KEY18
MOV DPTR,#MADJ10 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//SETB TR0 ;启动中断
RET
P_KEY18: ;K3键是否第四次按下?
MOV A,KEY_C
CJNE A,#0013H,P_KEY19
MOV DPTR,#MADJ11 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
// CLR TR0 ;启动中断
P_KEY19: ;K3键是否第二次按下?
MOV A,KEY_C
CJNE A,#0014H,P_KEY20
MOV DPTR,#MADJ12 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//CLR TR0 ;停止中断
RET
P_KEY20: ;K3键是否第三次按下?
MOV A,KEY_C
CJNE A,#0015H,P_KEY21
MOV DPTR,#MADJ13 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//SETB TR0 ;启动中断
RET
P_KEY21: ;K3键是否第四次按下?
MOV A,KEY_C
CJNE A,#0016H,P_KEY22
MOV DPTR,#MADJ14 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
// CLR TR0 ;启动中断
P_KEY22: ;K3键是否第二次按下?
MOV A,KEY_C
CJNE A,#0017H,P_KEY23
MOV DPTR,#MADJ15 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//CLR TR0 ;停止中断
RET
P_KEY23: ;K3键是否第三次按下?
MOV A,KEY_C
CJNE A,#0018H,P_KEY24
MOV DPTR,#MADJ16 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//SETB TR0 ;启动中断
RET
P_KEY24: ;K3键是否第四次按下?
MOV A,KEY_C
CJNE A,#0019H,P_KEY25
MOV DPTR,#MADJ17 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
// CLR TR0 ;启动中断
P_KEY25: RET
P_KEYA: ;
MOV A,KEY_VA
JB ACC.0,P_KEYA3
INC KEY_CA
MOV A,KEY_CA ;K3键是否第一次按下?
CJNE A,#0001H,P_KEYA1
MOV DPTR,#MADJA0 ;显示执行信息
MOV A,#1 ;
CALL LCD_PRINT
CALL CONV
//SETB TR0 ;启动中断
// MOV DATA1,#1
RET
P_KEYA1: ;K3键是否第二次按下?
MOV A,KEY_CA
CJNE A,#0002H,P_KEYA2
MOV DPTR,#MADJA0 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//CLR TR0 ;停止中断
RET
P_KEYA2: ;K3键是否第三次按下?
MOV A,KEY_CA
CJNE A,#0003H,P_KEYA3
MOV DPTR,#MADJA0 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//SETB TR0 ;启动中断
RET
P_KEYA3: ;K3键是否第四次按下?
MOV A,KEY_CA
CJNE A,#04H,P_KEYA4
MOV DPTR,#MADJA0 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
// CLR TR0 ;启动中断
P_KEYA4: ;K3键是否第二次按下?
MOV A,KEY_CA
CJNE A,#05H,P_KEYA5
MOV DPTR,#MADJA0 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//CLR TR0 ;停止中断
RET
P_KEYA5: ;K3键是否第三次按下?
MOV A,KEY_CA
CJNE A,#0006H,P_KEYA6
MOV DPTR,#MADJA0 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//SETB TR0 ;启动中断
RET
P_KEYA6: ;K3键是否第四次按下?
MOV A,KEY_CA
CJNE A,#07H,P_KEYA7
MOV DPTR,#MADJA0 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
// CLR TR0 ;启动中断
P_KEYA7: ;K3键是否第二次按下?
MOV A,KEY_CA
CJNE A,#08H,P_KEYA8
MOV DPTR,#MADJA ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//CLR TR0 ;停止中断
RET
P_KEYA8: ;K3键是否第三次按下?
MOV A,KEY_CA
CJNE A,#0009H,P_KEYA9
MOV DPTR,#MADJA0 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//SETB TR0 ;启动中断
RET
P_KEYA9: ;K3键是否第四次按下?
MOV A,KEY_CA
CJNE A,#000AH,P_KEYA10
MOV DPTR,#MADJA1 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
// CLR TR0 ;启动中断
P_KEYA10: ;K3键是否第二次按下?
MOV A,KEY_CA
CJNE A,#000BH,P_KEYA11
MOV DPTR,#MADJA2 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//CLR TR0 ;停止中断
RET
P_KEYA11: ;K3键是否第三次按下?
MOV A,KEY_CA
CJNE A,#000CH,P_KEYA12
MOV DPTR,#MADJA3 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//SETB TR0 ;启动中断
RET
P_KEYA12: ;K3键是否第四次按下?
MOV A,KEY_CA
CJNE A,#000DH,P_KEYA13
MOV DPTR,#MADJA4 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
// CLR TR0 ;启动中断
P_KEYA13: ;K3键是否第二次按下?
MOV A,KEY_CA
CJNE A,#000EH,P_KEYA14
MOV DPTR,#MADJA5 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//CLR TR0 ;停止中断
RET
P_KEYA14: ;K3键是否第三次按下?
MOV A,KEY_CA
CJNE A,#000FH,P_KEYA15
MOV DPTR,#MADJA6 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//SETB TR0 ;启动中断
RET
P_KEYA15: ;K3键是否第四次按下?
MOV A,KEY_CA
CJNE A,#0010H,P_KEYA16
MOV DPTR,#MADJA7 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
// CLR TR0 ;启动中断
P_KEYA16: ;K3键是否第二次按下?
MOV A,KEY_CA
CJNE A,#0011H,P_KEYA17
MOV DPTR,#MADJA8 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//CLR TR0 ;停止中断
RET
P_KEYA17: ;K3键是否第三次按下?
MOV A,KEY_CA
CJNE A,#0012H,P_KEYA18
MOV DPTR,#MADJA9 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//SETB TR0 ;启动中断
RET
P_KEYA18: ;K3键是否第四次按下?
MOV A,KEY_CA
CJNE A,#0013H,P_KEYA19
MOV DPTR,#MADJA10 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
// CLR TR0 ;启动中断
P_KEYA19: ;K3键是否第二次按下?
MOV A,KEY_CA
CJNE A,#0014H,P_KEYA20
MOV DPTR,#MADJA11 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//CLR TR0 ;停止中断
RET
P_KEYA20: ;K3键是否第三次按下?
MOV A,KEY_CA
CJNE A,#0015H,P_KEYA21
MOV DPTR,#MADJA12 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//SETB TR0 ;启动中断
RET
P_KEYA21: ;K3键是否第四次按下?
MOV A,KEY_CA
CJNE A,#0016H,P_KEYA22
MOV DPTR,#MADJA13 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
// CLR TR0 ;启动中断
P_KEYA22: ;K3键是否第二次按下?
MOV A,KEY_CA
CJNE A,#0017H,P_KEYA23
MOV DPTR,#MADJA14 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//CLR TR0 ;停止中断
RET
P_KEYA23: ;K3键是否第三次按下?
MOV A,KEY_CA
CJNE A,#0018H,P_KEYA24
MOV DPTR,#MADJA15 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//SETB TR0 ;启动中断
RET
P_KEYA24: ;K3键是否第四次按下?
MOV A,KEY_CA
CJNE A,#0019H,P_KEYA25
MOV DPTR,#MADJA16 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
// CLR TR0 ;启动中断
P_KEYA25: RET
P_KEYB: ;
MOV A,KEY_VB
JB ACC.0,P_KEYB3
INC KEY_CB
MOV A,KEY_CB ;K3键是否第一次按下?
CJNE A,#0001H,P_KEYB1
MOV DPTR,#MADJB0 ;显示执行信息
MOV A,#1 ;
CALL LCD_PRINT
CALL CONV
//SETB TR0 ;启动中断
// MOV DATA2,#1
RET
P_KEYB1: ;K3键是否第二次按下?
MOV A,KEY_CB
CJNE A,#0002H,P_KEYB2
MOV DPTR,#MADJB0 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//CLR TR0 ;停止中断
RET
P_KEYB2: ;K3键是否第三次按下?
MOV A,KEY_CB
CJNE A,#0003H,P_KEYB3
MOV DPTR,#MADJB0 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//SETB TR0 ;启动中断
RET
P_KEYB3: ;K3键是否第四次按下?
MOV A,KEY_CB
CJNE A,#0004H,P_KEYB4
MOV DPTR,#MADJB0 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
// CLR TR0 ;启动中断
P_KEYB4: ;K3键是否第四次按下?
MOV A,KEY_CB
CJNE A,#0005H,P_KEYB5
MOV DPTR,#MADJB0 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
// CLR TR0 ;启动中断
P_KEYB5: ;K3键是否第二次按下?
MOV A,KEY_CB
CJNE A,#0006H,P_KEYB6
MOV DPTR,#MADJB0 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//CLR TR0 ;停止中断
RET
P_KEYB6: ;K3键是否第三次按下?
MOV A,KEY_CB
CJNE A,#0007H,P_KEYB7
MOV DPTR,#MADJB ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//SETB TR0 ;启动中断
RET
P_KEYB7: ;K3键是否第四次按下?
MOV A,KEY_CB
CJNE A,#0008H,P_KEYB8
MOV DPTR,#MADJB0 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
// CLR TR0 ;启动中断
P_KEYB8: ;K3键是否第四次按下?
MOV A,KEY_CB
CJNE A,#0009H,P_KEYB9
MOV DPTR,#MADJB1 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
// CLR TR0 ;启动中断
P_KEYB9: ;K3键是否第二次按下?
MOV A,KEY_CB
CJNE A,#000AH,P_KEYB10
MOV DPTR,#MADJB2 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//CLR TR0 ;停止中断
RET
P_KEYB10: ;K3键是否第三次按下?
MOV A,KEY_CB
CJNE A,#000BH,P_KEYB11
MOV DPTR,#MADJB3 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//SETB TR0 ;启动中断
RET
P_KEYB11: ;K3键是否第四次按下?
MOV A,KEY_CB
CJNE A,#000CH,P_KEYB12
MOV DPTR,#MADJB4 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
// CLR TR0 ;启动中断
P_KEYB12: ;K3键是否第四次按下?
MOV A,KEY_CB
CJNE A,#000DH,P_KEYB13
MOV DPTR,#MADJB5 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
// CLR TR0 ;启动中断
P_KEYB13: ;K3键是否第二次按下?
MOV A,KEY_CB
CJNE A,#000EH,P_KEYB14
MOV DPTR,#MADJB6 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//CLR TR0 ;停止中断
RET
P_KEYB14: ;K3键是否第三次按下?
MOV A,KEY_CB
CJNE A,#000FH,P_KEYB15
MOV DPTR,#MADJB7 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//SETB TR0 ;启动中断
RET
P_KEYB15: ;K3键是否第四次按下?
MOV A,KEY_CB
CJNE A,#0010H,P_KEYB16
MOV DPTR,#MADJB8 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
// CLR TR0 ;启动中断
P_KEYB16: ;K3键是否第四次按下?
MOV A,KEY_CB
CJNE A,#0011H,P_KEYB17
MOV DPTR,#MADJB9 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
// CLR TR0 ;启动中断
P_KEYB17: ;K3键是否第二次按下?
MOV A,KEY_CB
CJNE A,#0012H,P_KEYB18
MOV DPTR,#MADJB10 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//CLR TR0 ;停止中断
RET
P_KEYB18: ;K3键是否第三次按下?
MOV A,KEY_CB
CJNE A,#0013H,P_KEYB19
MOV DPTR,#MADJB11 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//SETB TR0 ;启动中断
RET
P_KEYB19: ;K3键是否第四次按下?
MOV A,KEY_CB
CJNE A,#0014H,P_KEYB20
MOV DPTR,#MADJB12 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
// CLR TR0 ;启动中断
P_KEYB20: ;K3键是否第四次按下?
MOV A,KEY_CB
CJNE A,#0015H,P_KEYB21
MOV DPTR,#MADJB13 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
// CLR TR0 ;启动中断
P_KEYB21: ;K3键是否第二次按下?
MOV A,KEY_CB
CJNE A,#0016H,P_KEYB22
MOV DPTR,#MADJB14 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//CLR TR0 ;停止中断
RET
P_KEYB22: ;K3键是否第三次按下?
MOV A,KEY_CB
CJNE A,#0017H,P_KEYB23
MOV DPTR,#MADJB15 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//SETB TR0 ;启动中断
RET
P_KEYB23: ;K3键是否第四次按下?
MOV A,KEY_CB
CJNE A,#0018H,P_KEYB24
MOV DPTR,#MADJB16 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
// CLR TR0 ;启动中断
P_KEYB24: ;K3键是否第四次按下?
MOV A,KEY_CB
CJNE A,#0019H,P_KEYB25
MOV DPTR,#MADJB17 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
// CLR TR0 ;启动中断
P_KEYB25: ;K3键是否第二次按下?
MOV A,KEY_CB
CJNE A,#001AH,P_KEYB26
MOV DPTR,#MADJB18 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//CLR TR0 ;停止中断
RET
P_KEYB26: ;K3键是否第三次按下?
MOV A,KEY_CB
CJNE A,#001BH,P_KEYB27
MOV DPTR,#MADJB19 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//SETB TR0 ;启动中断
RET
P_KEYB27: ;K3键是否第四次按下?
MOV A,KEY_CB
CJNE A,#001CH,P_KEYB28
MOV DPTR,#MADJB20 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
// CLR TR0 ;启动中断
P_KEYB28: ;K3键是否第四次按下?
MOV A,KEY_CB
CJNE A,#001DH,P_KEYB29
MOV DPTR,#MADJB21 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
// CLR TR0 ;启动中断
P_KEYB29: ;K3键是否第二次按下?
MOV A,KEY_CB
CJNE A,#001EH,P_KEYB30
MOV DPTR,#MADJB22 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//CLR TR0 ;停止中断
RET
P_KEYB30: ;K3键是否第三次按下?
MOV A,KEY_CB
CJNE A,#001FH,P_KEYB31
MOV DPTR,#MADJB23 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
//SETB TR0 ;启动中断
RET
P_KEYB31: ;K3键是否第四次按下?
MOV A,KEY_CB
CJNE A,#0020H,P_KEYB32
MOV DPTR,#MADJB24 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
// CLR TR0 ;启动中断
P_KEYB32: ;K3键是否第四次按下?
MOV A,KEY_CB
CJNE A,#0021H,P_KEYB33
MOV DPTR,#MADJB25 ;显示执行信息
MOV A,#1
CALL LCD_PRINT
CALL CONV
// CLR TR0 ;启动中断
P_KEYB33: RET
;-------------------------------------------------------
SKEY:
CLR A ;判是否有键按下子程序
MOV KEY_S,A
MOV C,K1
RLC A
ORL KEY_S,A
MOV A,KEY_S
XRL A,KEY_V ;有键按下,A 中内容不为零
RET
SKEY1:
CLR A ;判是否有键按下子程序
MOV KEY_SA,A
MOV C,K2
RLC A
ORL KEY_SA,A
MOV A,KEY_SA
XRL A,KEY_VA ;有键按下,A 中内容不为零
RET
SKEY2:
CLR A ;判是否有键按下子程序
MOV KEY_SB,A
MOV C,K3
RLC A
ORL KEY_SB,A
MOV A,KEY_SB
XRL A,KEY_VB ;有键按下,A 中内容不为零
RET
;--------------------------------------------------------
LMESS1: DB " ANJIAN JISHUQI ",0 ;LCD 第一行显示消息
LMESS2: DB "TIME ",0 ;LCD 第二行显示消息
;--------------------------------------------------------
INIT: CLR A
// MOV KEY_C,A ;初始化控制变量
MOV SEC0,A
// MOV SEC,A
// MOV MIN,A
// MOV HOUR,A
MOV SEC,#01H //设置初始时间
MOV MIN,#10H
MOV HOUR, #0BH
MOV RI1,#14H //设置初始时间
MOV YUE,#06H
MOV NIAN, #14H
MOV NIAN1,#14H
MOV KEY_S,A
MOV KEY_V,A
SETB BEEP
CLR TR0
RET
;------------------------------------------------------------
INIT_TIMER: ;初始化定时器接口
MOV TMOD,#01H ;设置定时器0 工作模式为模式1
MOV IE, #82H ;启用定时器0 中断产生
MOV TL0,#TLOW
MOV TH0,#THIGH
RET
;-------------------------------------------------------------
T0_INT:
PUSH ACC ;定时器0计时中断程序
MOV TL0,#TLOW
MOV TH0,#THIGH
INC SEC0
MOV A,SEC0 ;10ms 计数值加1
//CJNE A,#100,TT
CJNE A,#100,TT
MOV SEC0,#0
INC SEC ;秒加1
MOV A,SEC
CJNE A,#60,TT
INC MIN ;分加1
MOV SEC,#0
MOV A,MIN
CJNE A,#60,TT
INC HOUR ;时加1
MOV MIN,#0
MOV A,HOUR
CJNE A,#24,TT
INC RI1 ;时加1
MOV HOUR,#0
MOV A,RI1
CJNE A,#31,TT
INC YUE ;时加1
MOV RI1,#1
MOV A,YUE
CJNE A,#13,TT
INC NIAN ;时加1
MOV YUE,#1
MOV A,NIAN
CJNE A,#10,TT
INC NIAN1 ;时加1
MOV NIAN,#0
MOV A,NIAN1
CJNE A,#10,TT
MOV SEC0,#0
MOV SEC,#0 ;秒、分、时单元清0
MOV MIN,#0
MOV HOUR,#0
MOV RI1,#0
MOV YUE,#0
MOV NIAN,#0
MOV NIAN1,#0
TT: POP ACC
RETI
;-------------------------------------------------------
; 在第二行显示数字
;-------------------------------------------------------
SHOW_DIG2: ;在 LCD 的第二行显示数字
MOV B,#10 ;设置被除数
DIV AB ;结果A存商数,B存余数
ADD A,#30H ;A为十位数,转换为字符
PUSH B ;B放入堆栈暂存
MOV B,X ;设置 LCD 显示的位置
CALL LCDP2 ;由 LCD 显示出来
POP B ;
MOV A,B ;B为个位数
ADD A,#30H ;转换为字符
INC X ;LCD 显示位置加1
MOV B,X ;设置 LCD 显示的位置
CALL LCDP2 ;由 LCD 显示出来
RET
;-------------------------------------------
;转换为 ASCII 码并显示
;-------------------------------------------
CONV:
MOV A,NIAN1 ;加载小时数据
MOV X,#0 ;设置位置
CALL SHOW_DIG2 ;显示数据
//INC X ;
// MOV A,#'/' ;
MOV B,X ;
CALL LCDP2 ;
MOV A,NIAN ;加载小时数据
INC X ;设置位置
CALL SHOW_DIG2 ;显示数据
INC X ;
MOV A,#'/' ;
MOV B,X ;
CALL LCDP2 ;
MOV A,YUE ;加载小时数据
INC X ;设置位置
CALL SHOW_DIG2 ;显示数据
INC X ;
MOV A,#'/' ;
MOV B,X ;
CALL LCDP2 ;
MOV A,RI1 ;加载小时数据
INC X ;设置位置
CALL SHOW_DIG2 ;显示数据
INC X ;
MOV A,#'-' ;
MOV B,X ;
CALL LCDP2 ;
MOV A,HOUR ;加载小时数据
// MOV X,#5 ;设置位置
INC X ;设置位置
CALL SHOW_DIG2 ;显示数据
INC X ;
MOV A,#':' ;
MOV B,X ;
CALL LCDP2 ;
MOV A,MIN ;加载分钟数据
INC X ;设置位置
CALL SHOW_DIG2 ;显示数据
INC X ;
MOV A,#':' ;
MOV B,X ;
CALL LCDP2 ;
MOV A,SEC ;加载秒数数据
INC X ;设置位置
CALL SHOW_DIG2 ;显示数据
INC X ;
MOV A,#':' ;
MOV B,X ;
CALL LCDP2 ;
MOV A,SEC0 ;加载秒数数据
INC X ;设置位置
CALL SHOW_DIG2
RET
;---------------------------------------------------------
; LCD CONTROL
;---------------------------------------------------------
SET_LCD: ;对 LCD 做初始化设置及测试
CLR EN
CALL INIT_LCD ;初始化 LCD
MOV R5,#10
CALL DELAY
MOV DPTR,#LMESS1 ;指针指到显示消息1
MOV A,#1 ;显示在第一行
CALL LCD_PRINT
// MOV DPTR,#LMESS2 ;指针指到显示消息2
// MOV A,#2 ;显示在第二行
// CALL LCD_PRINT
RET
;----------------------------------------------------------
INIT_LCD1: ;LCD 控制指令初始化
MOV A,#38H ;双列显示,字形5*7点阵
CALL WCOM ;
call delay1
MOV A,#0CH ;开显示,显示光标,光标不闪烁
CALL WCOM ;
call delay1
MOV A,#01H ;清除 LCD 显示屏
CALL WCOM ;
call delay1
RET
;----------------------------------------------------------
ENABLE: ;写指令
CLR RS ;RS=L,RW=L,E=高脉冲
CLR RW ;D0-D7=指令码
SETB EN
ACALL DELAY1
CLR EN
RET
;----------------------------------------------------------
LCD_PRINT: ;在LCD的第一行或第二行显示字符
CJNE A,#1,LINE2 ;判断是否为第一行
LINE1: MOV A,#80H ;设置 LCD 的第一行地址
CALL WCOM ;写入命令
CALL CLR_LINE ;清除该行字符数据
MOV A,#80H ;设置 LCD 的第一行地址
CALL WCOM ;写入命令
JMP FILL
LINE2: MOV A,#0C0H ;设置 LCD 的第二行地址
CALL WCOM ;写入命令
CALL CLR_LINE ;清除该行字符数据
MOV A,#0C0H ;设置 LCD 的第二行地址
CALL WCOM
FILL: CLR A ;填入字符
MOVC A,@A+DPTR ;由消息区取出字符
CJNE A,#0,LC1 ;判断是否为结束码
RET
LC1: CALL WDATA ;写入数据
INC DPTR ;指针加1
JMP FILL ;继续填入字符
RET
;-------------------------------------------------------
CLR_LINE: ;清除该行 LCD 的字符
MOV R0,#24
CL1: MOV A,#’ ’
CALL WDATA
DJNZ R0,CL1
RET
;-------------------------------------------------------
DE: MOV R7,#250 ;延时500微秒
DJNZ R7,$
RET
;-------------------------------------------------------
EN1:
CLR RW
SETB EN ;短脉冲产生启用信号
CALL DE
CLR EN
CALL DE
RET
;------------------------------------------------------
INIT_LCD: ;8位I/O控制 LCD 接口初始化
MOV P0,#38H ;双列显示,字形5*7点阵
call enable
call delay1
MOV P0,#38H ;双列显示,字形5*7点阵
call enable
call delay1
MOV P0,#38H ;双列显示,字形5*7点阵
call enable
call delay1
CALL INIT_LCD1
RET
;-----------------------------------------------------
WCOM: ;以8位控制方式将命令写至LCD
MOV P0,A ;写入命令
call enable
RET
;-----------------------------------------------------
WDATA: ;以8位控制方式将数据写至LCD
MOV P0,A ;写入数据
SETB RS ;设置写入数据
CALL EN1
RET
;-----------------------------------------------------
;第二行显示字符
;-----------------------------------------------------
LCDP2: ;在LCD的第二行显示字符
PUSH ACC ;
MOV A,B ;设置显示地址
ADD A,#0C0H ;设置LCD的第二行地址
CALL WCOM ;写入命令
POP ACC ;由堆栈取出A
CALL WDATA ;写入数据
RET
;----------------------------------------------------
DELAY: ;延时10MS
MOV R6,#50
D1: MOV R7,#100
DJNZ R7,$
DJNZ R6,D1
DJNZ R5,DELAY
RET
;-----------------------------------------------------
DELAY1: ;延时5MS
MOV R6,#25
D2: MOV R7,#100
DJNZ R7,$
DJNZ R6,D2
RET
;-----------------------------------------------------
BZ: ;蜂鸣器
MOV R6,#100
B1: CALL DEX
CPL BEEP
DJNZ R6,B1
MOV R5,#10
CALL DELAY
RET
DEX: MOV R7,#180
DE1: NOP
DJNZ R7,DE1
RET
;-------------------------------------------------
MMENU: DB " AD COUNT: 0 ",0
MADJ: DB " AD COUNT: 0 ",0
MADJ0: DB " AD COUNT: 1 ",0
MADJ1: DB " AD COUNT: 2 ",0
MADJ2: DB " AD COUNT: 3 ",0
MADJ3: DB " AD COUNT: 4 ",0
MADJ4: DB " AD COUNT: 5 ",0
MADJ5: DB " AD COUNT: 6 ",0
MADJ6: DB " AD COUNT: 7 ",0
MADJ7: DB " AD COUNT: 8 ",0
MADJ8: DB " AD COUNT: 9 ",0
MADJ9: DB " AD COUNT: 10 ",0
MADJ10: DB " AD COUNT: 11 ",0
MADJ11: DB " AD COUNT: 12 ",0
MADJ12: DB " AD COUNT: 13 ",0
MADJ13: DB " AD COUNT: 14 ",0
MADJ14: DB " AD COUNT: 15 ",0
MADJ15: DB " AD COUNT: 16 ",0
MADJ16: DB " AD COUNT: 17 ",0
MADJ17: DB " AD COUNT: 18 ",0
MADJ18: DB " AD COUNT: 19 ",0
MADJ19: DB " AD COUNT: 20 ",0
MADJ20: DB " AD COUNT: 21 ",0
MADJ21: DB " AD COUNT: 22 ",0
MADJ22: DB " AD COUNT: 23 ",0
MADJ23: DB " AD COUNT: 24 ",0
MADJ24: DB " AD COUNT: 25 ",0
MADJ25: DB " AD COUNT: 26 ",0
MADJ26: DB " AD COUNT: 27 ",0
MADJ27: DB " AD COUNT: 28 ",0
MADJ28: DB " AD COUNT: 29 ",0
MADJ29: DB " AD COUNT: 30 ",0
MADJA: DB " BD COUNT: 0 ",0
MADJA0: DB " BD COUNT: 1 ",0
MADJA1: DB " BD COUNT: 2 ",0
MADJA2: DB " BD COUNT: 3 ",0
MADJA3: DB " BD COUNT: 4 ",0
MADJA4: DB " BD COUNT: 5 ",0
MADJA5: DB " BD COUNT: 6 ",0
MADJA6: DB " BD COUNT: 7 ",0
MADJA7: DB " BD COUNT: 8 ",0
MADJA8: DB " BD COUNT: 9 ",0
MADJA9: DB " BD COUNT: 10 ",0
MADJA10: DB " BD COUNT: 11 ",0
MADJA11: DB " BD COUNT: 12 ",0
MADJA12: DB " BD COUNT: 13 ",0
MADJA13: DB " BD COUNT: 14 ",0
MADJA14: DB " BD COUNT: 15 ",0
MADJA15: DB " BD COUNT: 16 ",0
MADJA16: DB " BD COUNT: 17 ",0
MADJA17: DB " BD COUNT: 18 ",0
MADJA18: DB " BD COUNT: 19 ",0
MADJA19: DB " BD COUNT: 20 ",0
MADJA20: DB " BD COUNT: 21 ",0
MADJA21: DB " BD COUNT: 22 ",0
MADJA22: DB " BD COUNT: 23 ",0
MADJA23: DB " BD COUNT: 24 ",0
MADJA24: DB " BD COUNT: 25 ",0
MADJA25: DB " BD COUNT: 26 ",0
MADJA26: DB " BD COUNT: 27 ",0
MADJA27: DB " BD COUNT: 28 ",0
MADJA28: DB " BD COUNT: 29 ",0
MADJA29: DB " BD COUNT: 30 ",0
MADJA30: DB " BD COUNT: 31 ",0
MADJA31: DB " BD COUNT: 32 ",0
MADJB: DB " CD COUNT: 0 ",0
MADJB0: DB " CD COUNT: 1 ",0
MADJB1: DB " CD COUNT: 2 ",0
MADJB2: DB " CD COUNT: 3 ",0
MADJB3: DB " CD COUNT: 4 ",0
MADJB4: DB " CD COUNT: 5 ",0
MADJB5: DB " CD COUNT: 6 ",0
MADJB6: DB " CD COUNT: 7 ",0
MADJB7: DB " CD COUNT: 8 ",0
MADJB8: DB " CD COUNT: 9 ",0
MADJB9: DB " CD COUNT: 10 ",0
MADJB10: DB " CD COUNT: 11 ",0
MADJB11: DB " CD COUNT: 12 ",0
MADJB12: DB " CD COUNT: 13 ",0
MADJB13: DB " CD COUNT: 14 ",0
MADJB14: DB " CD COUNT: 15 ",0
MADJB15: DB " CD COUNT: 16 ",0
MADJB16: DB " CD COUNT: 17 ",0
MADJB17: DB " CD COUNT: 18 ",0
MADJB18: DB " CD COUNT: 19 ",0
MADJB19: DB " CD COUNT: 20 ",0
MADJB20: DB " CD COUNT: 21 ",0
MADJB21: DB " CD COUNT: 22 ",0
MADJB22: DB " CD COUNT: 23 ",0
MADJB23: DB " CD COUNT: 24 ",0
MADJB24: DB " CD COUNT: 25 ",0
MADJB25: DB " CD COUNT: 26 ",0
MADJB26: DB " CD COUNT: 27 ",0
MADJB27: DB " CD COUNT: 28 ",0
MADJB28: DB " CD COUNT: 29 ",0
MADJB29: DB " CD COUNT: 30 ",0
MADJB30: DB " CD COUNT: 31 ",0
MADJB31: DB " CD COUNT: 32 ",0
MADJB32: DB " CD COUNT: 33 ",0
MADJB33: DB " CD COUNT: 34 ",0
MADJB34: DB " CD COUNT: 35 ",0
MADJB35: DB " CD COUNT: 36 ",0
MADJB36: DB " CD COUNT: 37 ",0
MADJB37: DB " CD COUNT: 38 ",0
MADJB38: DB " CD COUNT: 39 ",0
;-------------------------------------------------
MENU: ;LCD 显示工作菜单消息
MOV DPTR,#MMENU
MOV A,#1
CALL LCD_PRINT
RET
;-------------------------------------------------
END
电路图如下