?? lcd89527.asm
字號:
;LCD89527:89C52:鍵盤控制、LCD控制顯示、接收從764傳過來的信號,并且按照順序顯示
;本程序和89521比較的特點:有2秒的穩(wěn)定顯示時間,不會覺得太快
; 在8952的基礎(chǔ)上,通過串口把數(shù)據(jù)發(fā)送給另外一個764,信息包括取出的查表出的CALL機(jī)地址的后4位,以及信息數(shù)據(jù)
; 信息的格式:4 BYTE的CALL機(jī)地址,一位信息,總共5 BYTE
;功能:1、顯示最新的幾個信息每一個保留18秒,然后消失,后面的順序向前移動,2秒刷新一次.
; 2、按鍵可以控制單呼和組呼
; 3、
; p0控制LCD 的PIN
;P1.0--P1.7:按鍵盤輸入
;現(xiàn)在的問題是:最多顯示6個,最大接收暫存區(qū)是9個,如果更多的數(shù)據(jù)進(jìn)來,就會出問題.
;本程序在LDTLCD1的基礎(chǔ)上改動接收按鍵部分
;遺留問題:設(shè)置初始化中,有時按鍵按不進(jìn)去;清 除按鍵的處理
;本程序和3的區(qū)別是加上了清除按鍵,按鍵的處理改變。
DI BIT P2.0
RW BIT P2.1
RST BIT P2.2
LCD BIT P2.3 ;控制背光
;SEND_PTT BIT P2.3
E BIT P2.4
;POC_TMD BIT P2.5
CS1 BIT P2.6
CS2 BIT P2.7
XRESET BIT P0.1 ;輸出,=0時,使93C10復(fù)位
TXDATA BIT P0.2 ;輸入.
TXCLK BIT P0.3 ;輸入.地址數(shù)據(jù)和選項的時鐘
ON BIT P0.4 ;輸出.接收模式使能
LED BIT P3.2 ;輸出.接收成功之后閃爍
WDI BIT P3.2 ;喂狗的信號
PEN BIT P3.3 ; 控制PLL
PDAT BIT P3.4
PCLK BIT P3.5
SDA BIT P3.6 ;;用來寫24WC02
SCL BIT P3.7
;****************************************************************************
F_COMMAND BIT 01H ;給LCD發(fā)送命令或數(shù)據(jù)的標(biāo)志,當(dāng)發(fā)出命令字時,=1
F_MOVED BIT 02H ;是否已經(jīng)循環(huán)移位的標(biāo)志
F_REFRESH BIT 03H ;2秒鐘重新刷新LCD,或者是在GET_BUFF滿了以后 ,來新的數(shù)據(jù),就立即移動和刷新
F_KEY_FOUND BIT 04H ;
F_KEY_VALUE BIT 05H ;收到了按鍵的標(biāo)志
F_HIGH BIT 07H ; 是否是已經(jīng)處理過高位的標(biāo)志
F_MOV BIT 08H ;是否啟動移位的標(biāo)志
ACK BIT 09H ;I2C接收數(shù)據(jù)非應(yīng)答標(biāo)志
F_GENGGAI_STEP0 BIT 0AH ;設(shè)置中,更改的第一個步驟完成的標(biāo)志
F_BLANK BIT 0BH ;是否是輸入一次“空格”鍵的標(biāo)志
F_FULL BIT 0CH ;輸入的臺號是否已經(jīng)滿了10個
F_DIS_CALL BIT 0DH ;是否是顯示了CALL的畫面
F_DIS_CALL_2 BIT 0EH ;
F_SEND_END BIT 0FH ;
F_GET BIT 016H ;接收到從764來的數(shù)據(jù)的標(biāo)志
;*******************************************************************************
COMMAND EQU 030H ;控制LCD的命令
X_ADD EQU 031H
Y_ADD EQU 032H
TIMER_2S_0 EQU 033H ;2秒刷新一次屏幕的計數(shù)器
SHUZI EQU 034H ;要顯示的數(shù)字存放點
PAIDUI EQU 035H ;收到的信號的排隊的指針
KEY_LAST_TIME EQU 036H
KEY_NO EQU 037H ;按鍵值
KEY_GESHU EQU 038H ;按鍵的個數(shù)
OLD_KEY_NO EQU 039H
MSG_TEMP EQU 03AH ;
DPH_BAK EQU 03CH
DPL_BAK EQU 03DH ;計算出來的存放顯示的臺號的高位的DPTR
GET_BUFF EQU 040H ;接收的數(shù)據(jù)存放區(qū),需要一個指針指向,最多放6個
TIMER_BUFF EQU 049H ;每個信息已經(jīng)顯示的時間
SEND_BYTE EQU 51H
SEND_BIT_NUM EQU 52H
SEND_BYTE_NUM EQU 53H
SEND_STRU EQU 54H
POC_NUM EQU 55H ; POCSAG DATA 1ST BYTE
; HIGH 4 BIT POCSAG NUM (32BIT=1)
; LOW 4 BIT ZHENG_HAO , 8 = ALL
BitCnt DATA 56H ; I2C 數(shù)據(jù)位計數(shù)器
ByteCnt DATA 57H ; I2C 數(shù)據(jù)字節(jié)計數(shù)器
SlvAdr DATA 58H ;被控器地址
SubAdr DATA 59H ;被控器單元地址
OUT_BUFF EQU 060H ;輸出的數(shù)據(jù)的存儲區(qū),前面4個保持0,使地址位1000000
SAVE_BUFF EQU 090H
KEY_AERA EQU 0A0H ;接受的按鍵的存放區(qū),
XmtDat DATA 0B0H ;發(fā)送數(shù)據(jù)緩沖區(qū),
RcvDat DATA 0C0H ;接收數(shù)據(jù)緩沖區(qū)
;**********************以下是進(jìn)入設(shè)置功能是使用的RAM,分時使用*****************************
CALL_BAK DATA 64H ;初始化中,公共的CALL機(jī)號碼暫存區(qū)
TAI_GESHU DATA 65H ;初始化中,輸入的臺號的個數(shù)
SHUZI_GESHU DATA 66H ;初始化中,輸入的臺號的數(shù)字的個數(shù),用來限制輸入的個數(shù)和處理
BLANK_GESHU DATA 67H ;空格的個數(shù)
OLD_Y_ADD DATA 7BH ;眼前這個數(shù)據(jù)顯示的Y的地址
OLD_X_ADD DATA 7CH ;眼前這個數(shù)據(jù)顯示的X的地址,用來處理數(shù)據(jù)輸入時的換行
;*************************************************************************
TEN_SEC DATA 0FAH ;立即數(shù),現(xiàn)在改為18秒定時
EEPROM EQU 0A0H ;24wc02的地址 立即數(shù)
;***************************************************************************
ORG 0000H
LJMP SYS_START
ORG 000BH ; TIME0 OUT
NOP
NOP
LJMP TIMER0_INT ;40MS一次,用來記時,
ORG 001BH ; TIME1 OUT
RETI
ORG 0023H ; COM I/O
NOP
NOP
LJMP S_INT
ORG 002BH
NOP
RETI
;****************************************************
SYS_START:
CLR EA
NOP
MOV SP,#0F0H
CLR RS0
CLR RS1
MOV TCON,#050H ;外部中斷1下降沿觸發(fā)
MOV PCON,#00H ;SMOD=1加倍,SMOD=0,不加倍
MOV SCON,#01010000B ;10位,方式1,允許串口接收,一個起始位,一個停止位,8個數(shù)據(jù)
MOV TMOD,#021H ;定時器T1為方式2,T0為16位計時器
MOV TH1,#0FAH ;11.0592M,4.8kBPS
MOV TL1,#0FAH
SETB ET0
;SETB ES
SETB EA
;***********************************************************************
CLEAR_RAM:
MOV R0,#00H
CLEAR_RAM0:
MOV @R0,#00H
INC R0
MOV A,R0
NOP
NOP
CJNE A,#0F0H,CLEAR_RAM0
NOP
NOP
MOV TIMER_2S_0,#30 ;
SETB RS1 ;預(yù)先設(shè)置按鍵區(qū)
CLR RS0
MOV R0,#KEY_AERA
CLR RS1
CLR RS0
;********************初始化********************************************
;開機(jī)檢測是否進(jìn)入設(shè)置狀態(tài)
;**********************************************************************
CLR P1.7
MOV A,P1
ANL A,#0FH
NOP
CJNE A,#07H,NORMAL_PRO
LCALL DELAY_1MS
LCALL DELAY_1MS
CLR P1.7
MOV A,P1
ANL A,#0FH
NOP
CJNE A,#07H,NORMAL_PRO
NOP
NOP
LJMP SETUP_PRO ;檢測到長時間按下的F,就跳到設(shè)置部分
NORMAL_PRO:
;**********************************************************************************
;***********************************************************************
; LCD 初始化
;**********************************************************************
;CLR RST
;LCALL DELAY_1MS
;SETB RST
SETB F_COMMAND
MOV COMMAND,#03EH
LCALL LCD_COMMAND
SETB F_COMMAND
MOV COMMAND,#0C0H
LCALL LCD_COMMAND
SETB F_COMMAND
MOV COMMAND,#03FH
LCALL LCD_COMMAND
LCALL CLRLCD
LCALL DISPLAY_ALL ;顯示開機(jī)歡迎畫面
SETB ES
;***********************************************************************
MAIN:
JNB F_MOV,MAIN2
CLR F_MOV
NOP
NOP
LCALL R_MOV
;SETB F_REFRESH ;啟動刷新
;*************刷新屏幕的程序***************************
MAIN2:
NOP
NOP ; 移動在顯示之前
JNB F_REFRESH,MAIN3
NOP
NOP
JNB F_MOVED,MAIN3 ;如果沒有移動,不用刷新
NOP
NOP
LCALL DIS_REFRESH ;刷新一次需要時間最多100MS
CLR F_REFRESH
CLR F_MOVED
LJMP MAIN
;*****************************收到從串口過來的數(shù)據(jù)的處理**********************
MAIN3:
NOP
NOP
JNB F_GET,MAIN4
CLR F_GET
MOV A,PAIDUI ;如果短時間內(nèi)有很多的進(jìn)來,最多放8個,多于8個就R_MOV
CJNE A,#06H,MAIN3_0 ;最后一個留下來做暫存.在R_MOV中,把其中的數(shù)據(jù)移到GET_BUFF中
MAIN3_0:
JC MAIN3_1
SETB F_MOV ;如果大于6,就啟動R_MOV
MAIN3_1: ;如果小于6
INC PAIDUI ;PAIDUI中的數(shù)字表示個數(shù),GET_BUFF+PAIDUI表示下一個的存放點
MOV A,#TIMER_BUFF
ADD A,PAIDUI
MOV R0,A
MOV @R0,#TEN_SEC ;把計時10秒的數(shù)據(jù)放在
; MOV A,PAIDUI
; CJNE A,#08H,MAIN3_2
;MAIN3_2:
SETB F_MOVED ;如果是在6個數(shù)以內(nèi),每一個進(jìn)來的數(shù),立即啟動刷新
SETB F_REFRESH
MAIN3_3:
;根據(jù)接收的地址,查表得到要CALL的號碼,并且把接收的地址發(fā)送出去
MOV R0,#OUT_BUFF
MOV @R0,#0 ;暫時的地址時0000,正式的應(yīng)該是查表之后得到的4位地址
INC R0
MOV @R0,#0
INC R0
MOV @R0,#0
INC R0
MOV @R0,#0
LJMP DATA_OUT
;********主機(jī)call的畫面處理*************************************
MAIN4:
JB F_DIS_CALL,MAIN4_LOOP ;如果已經(jīng)顯示了CALL機(jī)畫面,就直接去下一步
JB F_KEY_VALUE,MAIN4_0
NOP
NOP
LJMP MAIN5
MAIN4_0:
CLR F_KEY_VALUE
MOV A,KEY_NO
CJNE A,#0AH,MAIN4_1
AJMP MAIN4_2
MAIN4_1:
NOP
NOP
LJMP MAIN5
MAIN4_2:
LCALL CLRLCD
LCALL DIS_CALL
SETB F_DIS_CALL
;********************************************************
MAIN4_LOOP:
JNB F_DIS_CALL_2,MAIN4_LOOP3 ;此標(biāo)志是判斷是否輸入完成第一行的標(biāo)志
NOP
NOP
LJMP MAIN4_LOOP4
MAIN4_LOOP3:
JB F_KEY_VALUE,MAIN4_3
NOP
NOP
MAIN4_OUT:
LJMP MAIN5
MAIN4_3:
CLR F_KEY_VALUE ;等待輸入數(shù)據(jù)
MOV A,KEY_GESHU ;根據(jù)按鍵的個數(shù)來判斷程序的流向
CJNE A,#0,MAIN4_8
MOV A,KEY_NO
CJNE A,#0FH,MAIN4_4
NOP
NOP
LJMP CALL_OUT ;如果第一個輸入的數(shù)據(jù)就是F,就退出
MAIN4_4:
CJNE A,#0CH,MAIN4_5
NOP
NOP
LJMP CALL_OUT ;如果第一個輸入的數(shù)據(jù)就是C,就退出
MAIN4_5:
CJNE A,#10,MAIN4_6
MAIN4_6:
JC MAIN4_7
NOP
NOP
LJMP MAIN5 ;如果是不為C、F、0--9的其他數(shù),不于處理
MAIN4_7:
MOV R0,#KEY_AERA ;第一個數(shù)字的存儲
MOV @R0,KEY_NO
MOV X_ADD,#3 ;顯示第一個數(shù)據(jù)
MOV Y_ADD,#88
LCALL KEY_COMPARE
LCALL OUTSHUZI
INC KEY_GESHU
MOV X_ADD,#3 ;顯示第一個光標(biāo)
MOV Y_ADD,#96
MOV DPTR,#ZIMU_GUANGBIAO
LCALL OUTSHUZI
LJMP MAIN4_LOOP
;*******輸入的第二個數(shù)據(jù)的處理*************
MAIN4_8:
CJNE A,#01,MAIN4_10 ;
MOV A,KEY_NO
CJNE A,#0CH,MAIN4_9
MOV X_ADD,#3 ;清除第1個數(shù)據(jù)
MOV Y_ADD,#88
MOV DPTR,#BLANK8
LCALL OUTSHUZI
DEC KEY_GESHU
MOV X_ADD,#3 ;顯示第0個光標(biāo)
MOV Y_ADD,#88
MOV DPTR,#ZIMU_GUANGBIAO
LCALL OUTSHUZI
MOV X_ADD,#3 ;CLEAR第一個光標(biāo)
MOV Y_ADD,#96
MOV DPTR,#BLANK8
LCALL OUTSHUZI
LJMP MAIN5
MAIN4_9:
CJNE A,#0FH,MAIN4_91
MOV X_ADD,#3 ;清除第一行第2個光標(biāo)
MOV Y_ADD,#96
MOV DPTR,#BLANK8
LCALL OUTSHUZI
MOV R0,#KEY_AERA ;只有一個數(shù)據(jù)的,然后是一個F的處理
MOV A,@R0
MOV @R0,#0
INC R0
MOV @R0,A
INC KEY_GESHU
SETB F_DIS_CALL_2
MOV X_ADD,#6 ;顯示第2行,第1個光標(biāo)
MOV Y_ADD,#88
MOV DPTR,#ZIMU_GUANGBIAO
LCALL OUTSHUZI
LJMP MAIN5
MAIN4_91:
CJNE A,#010,MAIN4_A
MAIN4_A:
JNC MAIN4_B ;0--9
MOV R0,#KEY_AERA+1 ;第一個數(shù)字的存儲
MOV @R0,KEY_NO
MOV X_ADD,#3 ;顯示第2個數(shù)據(jù)
MOV Y_ADD,#96
LCALL KEY_COMPARE
LCALL OUTSHUZI
INC KEY_GESHU
LJMP MAIN5
MAIN4_B:
NOP ;其他的按鍵不處理
LJMP MAIN5
;*****************************************************
MAIN4_10: ;等待的是第3個數(shù)據(jù)是F或C,第2行
MOV A,KEY_NO
CJNE A,#0CH,MAIN4_11
MOV X_ADD,#3 ;清除第2個數(shù)據(jù)
MOV Y_ADD,#96
MOV DPTR,#ZIMU_GUANGBIAO
LCALL OUTSHUZI
MOV X_ADD,#3 ;清除第2個光標(biāo)
MOV Y_ADD,#96
MOV DPTR,#BLANK8
LCALL OUTSHUZI
DEC KEY_GESHU
LJMP MAIN5
MAIN4_11:
CJNE A,#0FH,MAIN4_B
MAIN4_OK: ;收到F按鍵的處理
MOV X_ADD,#6 ;第2行的第1個光標(biāo)
MOV Y_ADD,#88
MOV DPTR,#ZIMU_GUANGBIAO
LCALL OUTSHUZI
SETB F_DIS_CALL_2
;**************等待輸入第2行的數(shù)據(jù)****************
MAIN4_LOOP4:
JB F_DIS_CALL_2,MAIN4_20
NOP
NOP
LJMP MAIN5
MAIN4_20:
JB F_KEY_VALUE,MAIN4_21
NOP
NOP
LJMP MAIN5
MAIN4_21:
;****************
CLR F_KEY_VALUE
MOV A,KEY_GESHU
CJNE A,#2,THREE_KEYS
MOV A,KEY_NO
CJNE A,#0CH,MAIN4_25
MOV X_ADD,#3 ;如果第3個數(shù)據(jù)為C,清除第2個數(shù)據(jù)
MOV Y_ADD,#96
MOV DPTR,#BLANK8
LCALL OUTSHUZI
MOV X_ADD,#6 ;清除第2行的光標(biāo)
MOV Y_ADD,#88
MOV DPTR,#BLANK8
LCALL OUTSHUZI
DEC KEY_GESHU
CLR F_DIS_CALL_2 ;回到上一行的標(biāo)志
LJMP MAIN5
MAIN4_25:
;CJNE A,#0FH,MAIN4_251
;MOV R0,#KEY_AERA+2
;MOV A,@R0
;MOV @R0,#0
;INC R0
;MOV @R0,A
;LJMP MAIN4_4OK
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -