?? 1602232.asm
字號:
;********************************************************************************
;232通信程序2400速率,12m晶體, 燒寫后關掉XLISP軟件,編程仿真切換到仿真狀態(按下 *
;使用配套光盤的工具軟件:串口調試助手,設置波特率2400, 連接232電纜到串口, *
;連接1602液晶到開發板, *
用串口調試助手發送字符, 開發板的1602液晶顯示相應字符 *
;********************************************************************************
;* 日期: 2007-3-25 *
;* 版本: 3.0 *
;* 作者: 深圳學林電子有限公司 專業8051單片機教學站 *
;* 郵箱: sxj1974@163.com *
;* 網站: http://www.51c51.com http://www.8951.com 更多例程請登陸網站 *
;********************************************************************************
;* 硬件:此程序在本公司xlisp系列單片機實驗儀運行通過 *
;********************************************************************************
;* 【版權】 Copyright(C)深圳學林電子有限公司 www.51c51.com All Rights Reserved *
;* 【聲明】 此程序僅用于學習與參考,引用請注明版權和作者信息! *
;********************************************************************************
TEMP EQU 30H
TEMP1 EQU 31H
BUF EQU 32H
DISBUF EQU 40H
RS EQU P2.0
RW EQU P2.1
EN EQU P2.2
LCD_X EQU 2FH
PLAYFLAG BIT 20H.0
;*********************************************************
ORG 0000H
LJMP MAIN
ORG 0023H
LJMP T_SERIL
ORG 0030H
;*********************************************************
; 主程序
;*********************************************************
MAIN:
MOV SP,#60H
MOV P0,#0FFH
MOV P2,#0FFH
MOV TEMP,#00H
MOV TEMP1,#00H
CLR PLAYFLAG
MOV R1,#DISBUF ;清顯存單元
CLR1:
MOV @R1,#20H
INC R1
CJNE R1,#50H,CLR1
CALL SET_LCD ;LCD1602初始顯示
MOV TMOD,#20H ;定時器1工作于8位自動重載模式,用于產生波特率
MOV TH1,#0F3H
MOV TL1,#0F3H ;波特率2400
MOV SCON,#50H ;設定串行口工作方式
ANL PCON,#0EFH ;波特率不倍增
SETB EA ;允許總中斷
SETB ES ;允許串行中斷
SETB TR1 ;啟動定時器1
MOV LCD_X,#00H
MOV R1,#DISBUF
MAIN1:
CALL PLAY
JMP MAIN1
;*********************************************************
; LCD1602 初始化子程序
;*********************************************************
INIT_LCD: ;8位I/O控制 LCD 接口初始化
MOV A,#38H ;雙列顯示,字形5*7點陣
CALL WCOM
CALL DELAY5MS
MOV A,#38H ;雙列顯示,字形5*7點陣
CALL WCOM
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
;*********************************************************
; LCD1602 顯示字符程序
; 在LCD的第一行或第二行顯示信息字符
;*********************************************************
LCD_SHOW:
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
;*********************************************************
; 寫指令使能子程序
; RS=L,RW=L,D0-D7=指令碼,E=高脈沖
;*********************************************************
WCOM:
MOV P0,A
CLR RS
CLR RW
SETB EN
CALL DELAY0
CLR EN
RET
;*********************************************************
;寫數據使能子程序
;RS=H,RW=L,D0-D7=數據,E=高脈沖
;*********************************************************
WDATA:
MOV P0,A
SETB RS
CLR RW
SETB EN
CALL DELAY0
CLR EN
RET
DELAY0:
MOV R7,#250 ;延時500微秒
DJNZ R7,$
RET
;*********************************************************
;LCD第二行顯示字符子程序
;A=ASC DATA
;*********************************************************
LCDP2:
MOV TEMP1,A
MOV A,LCD_X ;設置顯示地址
ADD A,#0C0H ;設置LCD的第二行地址
CALL WCOM ;寫入命令
MOV A,TEMP1
CALL WDATA ;寫入數據
RET
;*********************************************************
; LCD 初始化設置
;*********************************************************
SET_LCD:
CLR EN
CALL INIT_LCD ;初始化 LCD
CALL DELAY5MS
MOV DPTR,#INFO1 ;指針指到顯示信息1
MOV A,#1 ;顯示在第一行
CALL LCD_SHOW
SET_LCD2:
MOV DPTR,#INFO2 ;指針指到顯示信息2
MOV A,#2 ;顯示在第二行
CALL LCD_SHOW
RET
INFO1: DB " SERIAL TRANFER ",0 ;LCD 第一行顯示信息
INFO2: DB " ",0 ;LCD 第二行顯示信息
;*********************************************************
; 串口中斷服務子程序
;*********************************************************
T_SERIL:
PUSH ACC
CLR ES ;關閉串行中斷
CLR RI ;清除串行接受標志位
MOV A,SBUF ;從串口緩沖區取得數據
CJNE A,#0DH,T_LOOP ;0D-回車
JMP T_END
T_LOOP:
CJNE A,#0AH,T_LOOP1 ;0A-換行
JMP T_END
T_LOOP1:
MOV BUF,A
CJNE A,#31H,T_LOOP2
MOV TEMP,#35H ;
CALL SENDDATA
JMP T_LOOP8
T_LOOP2:
CJNE A,#32H,T_LOOP3
MOV TEMP,#31H ;
CALL SENDDATA
JMP T_LOOP8
T_LOOP3:
CJNE A,#33H,T_LOOP4
MOV TEMP,#4CH ;
CALL SENDDATA
JMP T_LOOP8
T_LOOP4:
CJNE A,#34H,T_LOOP5
MOV TEMP,#35H ;
CALL SENDDATA
JMP T_LOOP8
T_LOOP5:
CJNE A,#35H,T_LOOP6
MOV TEMP,#31H ;
CALL SENDDATA
JMP T_LOOP8
T_LOOP6:
CJNE A,#36H,T_LOOP7
MOV TEMP,#52H ;
CALL SENDDATA
JMP T_LOOP8
T_LOOP7:
MOV TEMP,A
CALL SENDDATA
T_LOOP8:
SETB PLAYFLAG
MOV @R1,BUF
INC R1
CJNE R1,#50H,T_END
MOV R1,#DISBUF
T_END:
SETB ES
POP ACC
RETI
;*********************************************************
; 串口發送數據子程序
;*********************************************************
SENDDATA:
MOV A,TEMP
MOV SBUF,A
JNB TI,$ ; 等特數據傳送
CLR TI ; 清除數據傳送標志
RET
;*********************************************************
; 顯示子程序
;*********************************************************
PLAY:
JNB PLAYFLAG,PLAYEND ;判是否需要顯示
CALL SET_LCD2 ;清LCD1602第二行
MOV R1,#DISBUF
MOV LCD_X,#00H
PLAY1:
MOV A,@R1 ;顯示接收的數據
CALL LCDP2
INC LCD_X
INC R1
CJNE R1,#50H,PLAY1
MOV R1,#DISBUF ;清顯存單元
CLR2:
MOV @R1,#20H
INC R1
CJNE R1,#50H,CLR2
CLR PLAYFLAG
MOV R1,#DISBUF
PLAYEND:
RET
;*********************************************************
; 延時5MS子程序
;*********************************************************
DELAY5MS:
MOV R6,#25
DL2:
MOV R7,#100
DJNZ R7,$
DJNZ R6,DL2
RET
;*********************************************************
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -