⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 miao.asm

📁 LCD1602显示秒表.功能描述:K3为控制按键.第一次按下时,开始计时
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;LCD1602显示秒表

;------------------------------------------------------------------
;功能描述:                                      
;                  1602LCD显示秒表
                            
;   K3 --- 控制按键                       
;          第一次按下时,开始计时,第二次按下时,暂停计时。
;          第三次按下时,累计计时,第四次按下时,暂停计时。
;   K4 --- 清零按键:                      
;          在任何状态下,按一下K4,均可清零。

;可同时显示:时、分、秒、毫秒(带有两位ms级显示)
;------------------------------------------------------------------
          TLOW    EQU  00H      ;10ms定时初值
          THIGH   EQU  0DCH

          HOUR    EQU  30H      ;时存放单元
          MIN     EQU  31H      ;分存放单元
          SEC     EQU  32H      ;秒存放单元
          SEC0    EQU  33H      ;10MS计数值存放单元
          KEY_S   EQU  34H      ;为键当前的端口状况
          KEY_V   EQU  35H      ;为键上次的端口状况
          KEY_C   EQU  36H      ;键计数单元
          LCD_X   EQU  37H      ;LCD 地址变量

          BEEP    EQU  P3.7     ;蜂鸣器控制端口
          LCD_RS  EQU  P2.0     ;LCD控制端口
          LCD_RW  EQU  P2.1
          LCD_EN  EQU  P2.2
;----------------------------------------------------
;ME300B、ME300A+ 的独立键端口定义
;----------------------------------------------------
          K1      EQU  P1.4     
          K2      EQU  P1.5
          K3      EQU  P1.6     ;功能键
          K4      EQU  P1.7     ;复位键
;----------------------------------------------------
;ME300A 的独立键端口定义
;----------------------------------------------------          
;         K1      EQU  P3.2     
;         K2      EQU  P3.3
;         K3      EQU  P3.4     ;功能键
;         K4      EQU  P3.5     ;复位键
;----------------------------------------------------
;你可根据使用开发板的型号来选择独立键端口定义
;----------------------------------------------------
          ORG   0000H
          JMP  MAIN
          ORG  0BH
          JMP  T0_INT
          ORG  0030H
;----------------------------------------------------
MAIN:
          MOV  SP,#60H          ;设堆栈初值
          MOV  KEY_V,#01H       ;设初值
          CALL  INIT_LCD        ;初始化LCD
          CALL  SET_LCD1        ;第一行显示信息
          
          MOV  R5,#30
          CALL  MENU            ;第二行滚动显示网址
MAIN1:    CALL  DELAY100        ;停留3S。
          DJNZ  R5,MAIN1
          
          ;JMP   $
          
          CALL  INIT_LCD        ;初始化LCD
          CALL  SET_LCD1        ;第一行显示信息
          CALL  SET_LCD2        ;第二行显示信息
          CALL  INIT            ;初始化变量
          CALL  INIT_TIMER      ;初始化定时器
LOOP:
          CALL  CONV            ;时间数据处理
          JB  K4,LOOP1          ;判清零键是否按下
          CALL  BEEP_BL         ;蜂鸣器响一声
          JNB  K4,$             ;等待K4键释放
          JMP  MAIN             ;软件复位
LOOP1:
          CALL  SKEY            ;判是否有键按下
          JZ  LOOP              ;无键按下转LOOP
          MOV  KEY_V,KEY_S      ;交换数据
          CALL  P_KEY           ;功能键处理
          JMP  LOOP
;-------------------------------------------------------
;判是否有键按下子程序

;有键按下,A 中内容不为零
;无键按下,A 中内容则为零
;-------------------------------------------------------
SKEY:
          CLR  A
          MOV  KEY_S,A
          MOV  C,K3
          RLC  A
          ORL  KEY_S,A
          MOV  A,KEY_S
          XRL  A,KEY_V
          RET
;--------------------------------------------------------
;功能键处理子程序

;根据K3键按下的次数来执行相应的功能
;--------------------------------------------------------
P_KEY:
          MOV  A,KEY_V
          JB  ACC.0,P_KEY4       ;
          INC  KEY_C             ;键按下次数加1
          MOV  A,KEY_C
          CJNE  A,#01H,P_KEY1    ;K3键是否第一次按下?
          SETB  TR0              ;启动中断
          MOV    DPTR,#MADJ      ;显示执行信息
          MOV    A,#1            ;LCD第一行显示信息字符串
          CALL   LCD_PRINT
          CALL  BEEP_BL          ;蜂鸣器响一声
          RET
P_KEY1:
          MOV   A,KEY_C
          CJNE  A,#02H,P_KEY2    ;K3键是否第二次按下?
          CLR   TR0              ;停止中断
          MOV   DPTR,#MADJ1      ;显示执行信息
          MOV   A,#1             ;LCD第一行显示信息字符串
          CALL  LCD_PRINT
          CALL  BEEP_BL          ;蜂鸣器响一声
          RET
P_KEY2:
          MOV   A,KEY_C
          CJNE  A,#03H,P_KEY3    ;K3键是否第三次按下?
          SETB   TR0             ;启动中断
          MOV   DPTR,#MADJ2      ;显示执行信息
          MOV   A,#1             ;LCD第一行显示信息字符串
          CALL  LCD_PRINT
          CALL  BEEP_BL          ;蜂鸣器响一声
          RET
P_KEY3:
          MOV   A,KEY_C
          CJNE  A,#04H,P_KEY4    ;K3键是否第四次按下?
          CLR   TR0              ;关闭中断
          MOV   DPTR,#MADJ3      ;显示执行信息
          MOV   A,#1             ;LCD第一行显示信息字符串
          CALL  LCD_PRINT
          CALL  BEEP_BL
P_KEY4:
          RET
;--------------------------------------------------------
;设置LCD初始化显示
;--------------------------------------------------------
SET_LCD1:
          MOV  DPTR,#LMESS1   ;指针指到显示信息1
          MOV  A,#1           ;显示在第一行
          CALL  LCD_PRINT
          RET
SET_LCD2:          
          MOV  DPTR,#LMESS2   ;指针指到显示信息2
          MOV  A,#2           ;显示在第二行
          CALL  LCD_PRINT
          RET

LMESS1:
         DB  "  STOPWATCH  0  ",0  ;LCD 第一行显示
LMESS2:
         DB  "TIME            ",0  ;LCD 第二行显示

;--------------------------------------------------------
;LCD 初始化子程序

;8位数据传送方式,双行显示,字形5*7点阵。
;开显示,不显示光标。
;--------------------------------------------------------
INIT_LCD:
          CALL    DELAY5MS   ;延时15MS
          CALL    DELAY5MS
          CALL    DELAY5MS
          MOV  A,#38H        ;双行显示,字形5*7点阵,8位数据。
          CALL  WCOM_NC      ;不检测忙信号
          CALL  DELAY5MS
          MOV  A,#38H        ;双行显示,字形5*7点阵
          CALL  WCOM_NC      ;不检测忙信号
          CALL  DELAY5MS
          MOV  A,#38H        ;双行显示,字形5*7点阵
          CALL  WCOM_NC      ;不检测忙信号
          CALL  DELAY5MS

          MOV  A,#38H        ;双行显示,字形5*7点阵
          CALL  WCOM         ;检测忙信号
          CALL  DELAY5MS
          MOV  A,#0CH        ;开显示,不显示光标,光标不闪烁。
          CALL  WCOM
          CALL  DELAY5MS
          MOV  A,#01H        ;清除 LCD 显示屏
          CALL  WCOM
          CALL  DELAY5MS
          RET
;--------------------------------------------------------
;初始化控制变量
;--------------------------------------------------------
INIT:
         CLR  A
         MOV  KEY_C,A
         MOV  SEC0,A
         MOV  SEC,A
         MOV  MIN,A
         MOV  HOUR,A
         MOV  KEY_S,A
         MOV  KEY_V,A
         SETB  BEEP
         CLR  TR0
         RET
;--------------------------------------------------------
;初始化定时器子程序

;设置定时器0 工作模式为模式1
;启用定时器0 产生中断
;--------------------------------------------------------
INIT_TIMER:
         MOV  TMOD,#01H
         MOV  IE,  #82H
         MOV  TL0,#TLOW
         MOV  TH0,#THIGH
         RET
;--------------------------------------------------------
;定时器0计时中断服务子程序

;定时器0,方式1
;10ms中断一次
;--------------------------------------------------------
T0_INT:
         PUSH  ACC
         MOV  TL0,#TLOW
         MOV  TH0,#THIGH
         INC  SEC0
         MOV  A,SEC0         ;10MS 计数值加1
         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
         MOV  SEC0,#0

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -