1602LCD液晶顯示秒表
[源程序:]
;------------------------------------------------------------------
; 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 ;無鍵按下轉LOOP
MOV KEY_V,KEY_S ;交換數(shù)據(jù)
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
;--------------------------------------------------------
;功能鍵處理子程序
;根據(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 產生中斷
;--------------------------------------------------------
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ù)轉換為 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 ;結果A存商數(shù),B存余數(shù)
ADD A,#30H ;A為十位數(shù),轉換為字符
PUSH B ;B放入堆棧暫存
MOV B,LCD_X ;設置 LCD 顯示的位置
CALL LCDP2 ;由 LCD 顯示出來
POP B ;
MOV A,B ;B為個位數(shù)
ADD A,#30H ;轉換為字符
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 ;判斷是否為結束碼
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
;傳入參數(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
;--------------------------------------------------------
;蜂鳴器響一聲子程序
;驅動交流蜂鳴器
;--------------------------------------------------------
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 ;判斷是否為結束碼
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
評論
查看更多