?? clock_lcd1.asm
字號:
;/********************************************************************
; *
; * 程序功能 : 液晶顯示的秒表
; *
; * 應用軟件 : KEIL C
; *
; * 版 本 : KEIL 7.06
; *
; * 硬 件 : WS803、WS804、WS806、WS2511、WS2566、WS9600、WS9700
; *
; * 整理時間 : 2006-03-11
; *
; *
; * 注:為了有更多實用的實驗程序供大家學習,部分程序參考網上的資源,
; * 在此謝謝這些無私奉獻的朋友!!!
; *
; ********************************************************************/
/* 實驗目的:1、了解液晶顯示的基本原理
* 2、掌握如何有單片機來控制液晶顯示模塊的內容
* 3、掌握單片機對按鍵的控制
* 實驗內容:
* 晶振 11.0592M
* 定時器0,方式1
* 計時中斷程序每隔10ms中斷一次
*******************************************************************/
TLOW EQU 0CH ;定時器初值
THIGH EQU 0DCH
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 ;鍵計數單元
K1 EQU P2.0
K2 EQU P2.1
K3 EQU P2.2
K4 EQU P2.3
BEEP EQU P3.2
RS EQU P2.5 ;LCD控制端口定義
RW EQU P2.6
EN EQU P2.7
;----------------------------------------------------
ORG 0000H
JMP START
ORG 0BH
JMP T0_INT
;----------------------------------------------------
START: MOV SP,#60H
CLR EN
CALL SET_LCD
CALL INIT ;初始化變量
MOV KEY_V,#01H
CALL INIT_TIMER ;初始化定時器
CALL MENU
LOOP: CALL CONV ;時間計數處理
CALL LOOP1
CALL SKEY ;判是否有鍵按下
JZ LOOP ;無鍵按下轉LOOP
CALL CONV
CALL SKEY
JZ LOOP
MOV KEY_V,KEY_S ;交換數據
CALL P_KEY
JMP LOOP
;-----------------------------------------------------
LOOP1: JB K4,LOOP2 ;判清零鍵是否按下
CALL BZ
JMP START
LOOP2: RET
;-----------------------------------------------------
P_KEY: ;
MOV A,KEY_V
JB ACC.0,P_KEY3
INC KEY_C
MOV A,KEY_C ;K3鍵是否第一次按下?
CJNE A,#01H,P_KEY1
MOV DPTR,#MADJ ;顯示執行信息
MOV A,#1 ;
CALL LCD_PRINT
SETB TR0 ;啟動中斷
RET
P_KEY1: ;K3鍵是否第二次按下?
MOV A,KEY_C
CJNE A,#02H,P_KEY2
MOV DPTR,#MADJ1 ;顯示執行信息
MOV A,#1
CALL LCD_PRINT
CLR TR0 ;停止中斷
RET
P_KEY2: ;K3鍵是否第三次按下?
MOV A,KEY_C
CJNE A,#03H,P_KEY3
MOV DPTR,#MADJ2 ;顯示執行信息
MOV A,#1
CALL LCD_PRINT
SETB TR0 ;啟動中斷
RET
P_KEY3: ;K3鍵是否第四次按下?
MOV A,KEY_C
CJNE A,#04H,P_KEY4
MOV DPTR,#MADJ3 ;顯示執行信息
MOV A,#1
CALL LCD_PRINT
CLR TR0 ;啟動中斷
P_KEY4: RET
;-------------------------------------------------------
SKEY: CLR A ;判是否有鍵按下子程序
MOV KEY_S,A
MOV C,K3
RLC A
ORL KEY_S,A
MOV A,KEY_S
XRL A,KEY_V ;有鍵按下,A 中內容不為零
RET
;--------------------------------------------------------
LMESS1: DB " ",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 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
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 ;秒、分、時單元清0
MOV MIN,#0
MOV HOUR,#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,HOUR ;加載小時數據
MOV X,#5 ;設置位置
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 " SECOND-CLOCK 0 ",0
MADJ: DB " BEGIN COUNT 1 ",0
MADJ1: DB " PAUSE COUNT 2 ",0
MADJ2: DB " BEGIN COUNT 3 ",0
MADJ3: DB " PAUSE COUNT 4 ",0
;-------------------------------------------------
MENU: ;LCD 顯示工作菜單消息
MOV DPTR,#MMENU
MOV A,#1
CALL LCD_PRINT
RET
;-------------------------------------------------
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -