按键计数器

153 阅读6分钟

按键计数器

下面介绍一种,通过单片机记录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

 

 

电路图如下

搜狗截图20240221163152.png