《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 解決方案 > 1602LCD液晶顯示秒表

1602LCD液晶顯示秒表

2008-12-28
關鍵詞: 秒表 液晶顯示

[源程序:]

;------------------------------------------------------------------

;      ME300系列單片機開發(fā)系統(tǒng)演示程序 - 1602LCD顯示秒表

;------------------------------------------------------------------
;功能描述:                                      
;                  1602LCD顯示秒表
                            
;   K3 --- 控制按鍵                       
;          第一次按下時,開始計時,第二次按下時,暫停計時。
;          第三次按下時,累計計時,第四次按下時,暫停計時。
;   K4 --- 清零按鍵:                      
;          在任何狀態(tài)下,按一下K4,均可清零。

;可同時顯示:時、分、秒、毫秒(帶有兩位ms級顯示)
;------------------------------------------------------------------

          TLOW    EQU  00H      ;10ms定時初值
          THIGH   EQU  0DCH

          HOUR    EQU  30H      ;時存放單元
          MIN     EQU  31H      ;分存放單元
          SEC     EQU  32H      ;秒存放單元
          SEC0    EQU  33H      ;10MS計數(shù)值存放單元
          KEY_S   EQU  34H      ;為鍵當前的端口狀況
          KEY_V   EQU  35H      ;為鍵上次的端口狀況
          KEY_C   EQU  36H      ;鍵計數(shù)單元
          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     ;復位鍵
;----------------------------------------------------
;你可根據(jù)使用開發(fā)板的型號來選擇獨立鍵端口定義
;----------------------------------------------------
          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            ;第二行滾動顯示網(wǎng)址
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            ;時間數(shù)據(jù)處理
          JB  K4,LOOP1          ;判清零鍵是否按下
          CALL  BEEP_BL         ;蜂鳴器響一聲
          JNB  K4,$             ;等待K4鍵釋放
          JMP  MAIN             ;軟件復位
LOOP1:
          CALL  SKEY            ;判是否有鍵按下
          JZ  LOOP              ;無鍵按下轉(zhuǎn)LOOP
          MOV  KEY_V,KEY_S      ;交換數(shù)據(jù)
          CALL  P_KEY           ;功能鍵處理
          JMP  LOOP
;-------------------------------------------------------
;判是否有鍵按下子程序

;有鍵按下,A 中內(nèi)容不為零
;無鍵按下,A 中內(nèi)容則為零
;-------------------------------------------------------
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
;--------------------------------------------------------
;功能鍵處理子程序

;根據(jù)K3鍵按下的次數(shù)來執(zhí)行相應的功能
;--------------------------------------------------------
P_KEY:
          MOV  A,KEY_V
          JB  ACC.0,P_KEY4       ;
          INC  KEY_C             ;鍵按下次數(shù)加1
          MOV  A,KEY_C
          CJNE  A,#01H,P_KEY1    ;K3鍵是否第一次按下?
          SETB  TR0              ;啟動中斷
          MOV    DPTR,#MADJ      ;顯示執(zhí)行信息
          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      ;顯示執(zhí)行信息
          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      ;顯示執(zhí)行信息
          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      ;顯示執(zhí)行信息
          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位數(shù)據(jù)傳送方式,雙行顯示,字形5*7點陣。
;開顯示,不顯示光標。
;--------------------------------------------------------
INIT_LCD:
          CALL    DELAY5MS   ;延時15MS
          CALL    DELAY5MS
          CALL    DELAY5MS
          MOV  A,#38H        ;雙行顯示,字形5*7點陣,8位數(shù)據(jù)。
          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 產(chǎn)生中斷
;--------------------------------------------------------
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 計數(shù)值加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
         MOV  SEC,#0          ;秒、分、時單元清零
         MOV  MIN,#0
         MOV  HOUR,#0
 TT:     POP  ACC
         RETI

;--------------------------------------------------------
;時間數(shù)據(jù)轉(zhuǎn)換為 ASCII 碼并顯示
;--------------------------------------------------------
CONV:
          MOV  A,HOUR        ;加載小時數(shù)據(jù)
          MOV  LCD_X,#5      ;設置位置
          CALL  SHOW_DIG2    ;顯示數(shù)據(jù)
          INC  LCD_X         ;
          MOV  A,#':'        ;顯示“:”
          MOV  B,LCD_X       ;
          CALL  LCDP2        ;
          MOV  A,MIN         ;加載分鐘數(shù)據(jù)
          INC  LCD_X         ;設置位置
          CALL  SHOW_DIG2    ;顯示數(shù)據(jù)
          INC  LCD_X         ;
          MOV  A,#':'        ;顯示“:”
          MOV  B,LCD_X       ;
          CALL  LCDP2        ;
          MOV  A,SEC         ;加載秒數(shù)數(shù)據(jù)
          INC  LCD_X         ;設置位置
          CALL  SHOW_DIG2    ;顯示數(shù)據(jù)
          INC  LCD_X         ;
          MOV  A,#':'        ;顯示“:”
          MOV  B,LCD_X       ;
          CALL  LCDP2        ;
          MOV  A,SEC0        ;加載秒數(shù)數(shù)據(jù)
          INC  LCD_X         ;設置位置
          CALL  SHOW_DIG2
          RET
;--------------------------------------------------------
;在LCD1602的第二行顯示數(shù)字
;--------------------------------------------------------
SHOW_DIG2:
          MOV  B,#10         ;設置被除數(shù)
          DIV  AB            ;結(jié)果A存商數(shù),B存余數(shù)
          ADD  A,#30H        ;A為十位數(shù),轉(zhuǎn)換為字符
          PUSH  B            ;B放入堆棧暫存
          MOV  B,LCD_X       ;設置 LCD 顯示的位置
          CALL  LCDP2        ;由 LCD 顯示出來
          POP  B             ;
          MOV  A,B           ;B為個位數(shù)
          ADD  A,#30H        ;轉(zhuǎn)換為字符
          INC  LCD_X         ;LCD 顯示位置加1
          MOV  B,LCD_X       ;設置 LCD 顯示的位置
          CALL  LCDP2        ;由 LCD 顯示出來
          RET
;--------------------------------------------------------
;在LCD的第二行顯示字符
;--------------------------------------------------------
LCDP2:
         PUSH  ACC          ;入棧保護
         MOV  A,B           ;設置顯示地址
         ADD  A,#0C0H       ;設置LCD的第二行地址
         CALL  WCOM         ;寫入命令
         POP  ACC           ;由堆棧取出A
         CALL  WDATA        ;寫入數(shù)據(jù)
         RET
;--------------------------------------------------------
;在LCD的第一行或第二行顯示字符
;--------------------------------------------------------
LCD_PRINT:
          CJNE  A,#1,LINE2  ;判斷是否為第一行
  LINE1:  MOV  A,#80H       ;設置 LCD 的第一行地址
          CALL  WCOM        ;寫入命令
          CALL  CLR_LINE    ;清除該行字符數(shù)據(jù)
          MOV  A,#80H       ;設置 LCD 的第一行地址
          CALL  WCOM        ;寫入命令
          JMP  FILL
  LINE2:  MOV  A,#0C0H      ;設置 LCD 的第二行地址
          CALL  WCOM        ;寫入命令
          CALL  CLR_LINE    ;清除該行字符數(shù)據(jù)
          MOV  A,#0C0H      ;設置 LCD 的第二行地址
          CALL  WCOM
  FILL:   CLR  A            ;填入字符
          MOVC  A,@A+DPTR   ;由信息區(qū)取出字符
          CJNE  A,#0,LC1    ;判斷是否為結(jié)束碼
          RET
  LC1:    CALL  WDATA       ;寫入數(shù)據(jù)
          INC  DPTR         ;指針加1
          JMP  FILL         ;繼續(xù)填入字符
          RET
;--------------------------------------------------------
;清除 LCD 指定行的字符
;“空白”的ASCII代碼為20H。
;--------------------------------------------------------
CLR_LINE:
          MOV  R0,#24
   CL1:   MOV  A,#20H       ;' '
          CALL  WDATA
          DJNZ  R0,CL1
          RET

;--------------------------------------------------------
;寫控制指令子程序

;寫控制指令到LCD
;傳入?yún)?shù): ACC(要寫入的指令)
;RS=L,RW=L,E=高脈沖,D0-D7=指令碼 。
;--------------------------------------------------------
WCOM:
          ACALL  CHECKBUSY
WCOM_NC:
          MOV  P0,A         ;寫入指令
          CLR  LCD_EN
          NOP
          NOP
          CLR LCD_RS
          CLR LCD_RW
          SETB LCD_EN
          ACALL DEL_250
          CLR  LCD_EN
          RET
;--------------------------------------------------------
;寫數(shù)據(jù)子程序

;寫顯示數(shù)據(jù)到LCD
;傳入?yún)?shù): ACC(要寫入的數(shù)據(jù))
;RS=H,RW=L,E=高脈沖,D0-D7=數(shù)據(jù)碼 。
;--------------------------------------------------------
WDATA:
          ACALL  CHECKBUSY
          MOV  P0,A         ;寫入數(shù)據(jù)
          CLR  LCD_EN
          NOP
          NOP
          SETB  LCD_RS
          CLR   LCD_RW
          SETB  LCD_EN
          CALL  DEL_250
          CLR  LCD_EN
          RET

 DEL_250:
          MOV  R7,#125      ;延時250微秒
          DJNZ  R7,$
          RET
;--------------------------------------------------------
;檢測LCD控制器忙碌狀態(tài)

;正常讀寫操作之前必須檢測LCD控制器狀態(tài)
;BUSY FLAG(P0.7)=1時,忙,不能接收MCU送來的指令和數(shù)據(jù)。
;BUSY FLAG(P0.7)=0時,閑,能夠接收MCU送來的指令和數(shù)據(jù)。
;讀數(shù)據(jù)時
;RS=L,RW=H,E=H,輸出:D0-D7=數(shù)據(jù)
;--------------------------------------------------------
CHECKBUSY:
          PUSH  ACC
          MOV  P0,#0FFH           ;置P0口為輸入狀態(tài)
          CLR  LCD_EN
          NOP
          NOP
          SETB  LCD_RW
          CLR  LCD_RS
          SETB  LCD_EN
BUSYLOOP:
          NOP
          JB P0.7,BUSYLOOP
          CLR  LCD_EN
          POP  ACC
          RET

;--------------------------------------------------------
;蜂鳴器響一聲子程序
;驅(qū)動交流蜂鳴器
;--------------------------------------------------------
BEEP_BL:
         MOV  R6,#150
 BL1:    CALL  BL2
         CPL  BEEP
         DJNZ  R6,BL1
         CALL  DELAY5MS
         CALL  DELAY5MS
         CALL  DELAY5MS
         RET

 BL2:    MOV  R7,#180
 BL3:    NOP
         DJNZ  R7,BL3
         RET
;--------------------------------------------------------
;延時5MS子程序
;--------------------------------------------------------
DELAY5MS:
         MOV  R6,#25
DEL1:    MOV  R7,#100
         DJNZ  R7,$
         DJNZ  R6,DEL1
         RET
;--------------------------------------------------------

MADJ:   DB  " BEGIN COUNT  1 ",0
MADJ1:  DB  " PAUSE COUNT  2 ",0
MADJ2:  DB  " BEGIN COUNT  3 ",0
MADJ3:  DB  " PAUSE COUNT  4 ",0

;--------------------------------------------------------
;第二行滾動顯示網(wǎng)址子程序
;--------------------------------------------------------
MENU:
          MOV A,#06H         ;移動光標(光標加1)
          CALL  WCOM
          CALL  DELAY5MS
        
          MOV  A,#0C0H      ;設置 LCD 的第二行地址
          CALL  WCOM        ;寫入命令
          CALL  CLR_LINE    ;清除該行字符數(shù)據(jù)
          
          MOV  A,#0C0H      ;設置 LCD 的第二行地址
          CALL  WCOM
          MOV  DPTR,#CHAR
          
FILL1:    CLR  A            ;填入字符
          MOVC  A,@A+DPTR   ;由信息區(qū)取出字符
          CJNE  A,#0,LC2    ;判斷是否為結(jié)束碼
          RET
          
  LC2:    CALL  WDATA       ;寫入數(shù)據(jù)
          INC  DPTR         ;指針加1
          CALL  DELAY100
          CALL  DELAY100
          JMP  FILL1         ;繼續(xù)填入字符
          RET
CHAR:
      DB  " www.willar.com ",0
;--------------------------------------------------
;延時100MS子程序
;--------------------------------------------------
DELAY100:                      
          MOV r7,#200
 DL1:     MOV r6,#250
 DL2:     DJNZ R6,DL2
          DJNZ R7,DL1
          RET         
;--------------------------------------------------          
         END

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認版權者。如涉及作品內(nèi)容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經(jīng)濟損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。