?? lcd89527.bak
字號:
;LCD89527:89C52:鍵盤控制、LCD控制顯示、接收從764傳過來的信號,并且按照順序顯示
;本程序和89521比較的特點:有2秒的穩定顯示時間,不會覺得太快
; 在8952的基礎上,通過串口把數據發送給另外一個764,信息包括取出的查表出的CALL機地址的后4位,以及信息數據
; 信息的格式:4 BYTE的CALL機地址,一位信息,總共5 BYTE
;功能:1、顯示最新的幾個信息每一個保留18秒,然后消失,后面的順序向前移動,2秒刷新一次.
; 2、按鍵可以控制單呼和組呼
; 3、
; p0控制LCD 的PIN
;P1.0--P1.7:按鍵盤輸入
;現在的問題是:最多顯示6個,最大接收暫存區是9個,如果更多的數據進來,就會出問題.
;本程序在LDTLCD1的基礎上改動接收按鍵部分
;遺留問題:設置初始化中,有時按鍵按不進去;清 除按鍵的處理
;本程序和3的區別是加上了清除按鍵,按鍵的處理改變。
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復位
TXDATA BIT P0.2 ;輸入.
TXCLK BIT P0.3 ;輸入.地址數據和選項的時鐘
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發送命令或數據的標志,當發出命令字時,=1
F_MOVED BIT 02H ;是否已經循環移位的標志
F_REFRESH BIT 03H ;2秒鐘重新刷新LCD,或者是在GET_BUFF滿了以后 ,來新的數據,就立即移動和刷新
F_KEY_FOUND BIT 04H ;
F_KEY_VALUE BIT 05H ;收到了按鍵的標志
F_HIGH BIT 07H ; 是否是已經處理過高位的標志
F_MOV BIT 08H ;是否啟動移位的標志
ACK BIT 09H ;I2C接收數據非應答標志
F_GENGGAI_STEP0 BIT 0AH ;設置中,更改的第一個步驟完成的標志
F_BLANK BIT 0BH ;是否是輸入一次“空格”鍵的標志
F_FULL BIT 0CH ;輸入的臺號是否已經滿了10個
F_DIS_CALL BIT 0DH ;是否是顯示了CALL的畫面
F_DIS_CALL_2 BIT 0EH ;
F_SEND_END BIT 0FH ;
F_GET BIT 016H ;接收到從764來的數據的標志
;*******************************************************************************
COMMAND EQU 030H ;控制LCD的命令
X_ADD EQU 031H
Y_ADD EQU 032H
TIMER_2S_0 EQU 033H ;2秒刷新一次屏幕的計數器
SHUZI EQU 034H ;要顯示的數字存放點
PAIDUI EQU 035H ;收到的信號的排隊的指針
KEY_LAST_TIME EQU 036H
KEY_NO EQU 037H ;按鍵值
KEY_GESHU EQU 038H ;按鍵的個數
OLD_KEY_NO EQU 039H
MSG_TEMP EQU 03AH ;
DPH_BAK EQU 03CH
DPL_BAK EQU 03DH ;計算出來的存放顯示的臺號的高位的DPTR
GET_BUFF EQU 040H ;接收的數據存放區,需要一個指針指向,最多放6個
TIMER_BUFF EQU 049H ;每個信息已經顯示的時間
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 數據位計數器
ByteCnt DATA 57H ; I2C 數據字節計數器
SlvAdr DATA 58H ;被控器地址
SubAdr DATA 59H ;被控器單元地址
OUT_BUFF EQU 060H ;輸出的數據的存儲區,前面4個保持0,使地址位1000000
SAVE_BUFF EQU 090H
KEY_AERA EQU 0A0H ;接受的按鍵的存放區,
XmtDat DATA 0B0H ;發送數據緩沖區,
RcvDat DATA 0C0H ;接收數據緩沖區
;**********************以下是進入設置功能是使用的RAM,分時使用*****************************
CALL_BAK DATA 64H ;初始化中,公共的CALL機號碼暫存區
TAI_GESHU DATA 65H ;初始化中,輸入的臺號的個數
SHUZI_GESHU DATA 66H ;初始化中,輸入的臺號的數字的個數,用來限制輸入的個數和處理
BLANK_GESHU DATA 67H ;空格的個數
OLD_Y_ADD DATA 7BH ;眼前這個數據顯示的Y的地址
OLD_X_ADD DATA 7CH ;眼前這個數據顯示的X的地址,用來處理數據輸入時的換行
;*************************************************************************
TEN_SEC DATA 0FAH ;立即數,現在改為18秒定時
EEPROM EQU 0A0H ;24wc02的地址 立即數
;***************************************************************************
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下降沿觸發
MOV PCON,#00H ;SMOD=1加倍,SMOD=0,不加倍
MOV SCON,#01010000B ;10位,方式1,允許串口接收,一個起始位,一個停止位,8個數據
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 ;預先設置按鍵區
CLR RS0
MOV R0,#KEY_AERA
CLR RS1
CLR RS0
;********************初始化********************************************
;開機檢測是否進入設置狀態
;**********************************************************************
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,就跳到設置部分
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 ;顯示開機歡迎畫面
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
;*****************************收到從串口過來的數據的處理**********************
MAIN3:
NOP
NOP
JNB F_GET,MAIN4
CLR F_GET
MOV A,PAIDUI ;如果短時間內有很多的進來,最多放8個,多于8個就R_MOV
CJNE A,#06H,MAIN3_0 ;最后一個留下來做暫存.在R_MOV中,把其中的數據移到GET_BUFF中
MAIN3_0:
JC MAIN3_1
SETB F_MOV ;如果大于6,就啟動R_MOV
MAIN3_1: ;如果小于6
INC PAIDUI ;PAIDUI中的數字表示個數,GET_BUFF+PAIDUI表示下一個的存放點
MOV A,#TIMER_BUFF
ADD A,PAIDUI
MOV R0,A
MOV @R0,#TEN_SEC ;把計時10秒的數據放在
; MOV A,PAIDUI
; CJNE A,#08H,MAIN3_2
;MAIN3_2:
SETB F_MOVED ;如果是在6個數以內,每一個進來的數,立即啟動刷新
SETB F_REFRESH
MAIN3_3:
;根據接收的地址,查表得到要CALL的號碼,并且把接收的地址發送出去
MOV R0,#OUT_BUFF
MOV @R0,#0 ;暫時的地址時0000,正式的應該是查表之后得到的4位地址
INC R0
MOV @R0,#0
INC R0
MOV @R0,#0
INC R0
MOV @R0,#0
LJMP DATA_OUT
;********主機call的畫面處理*************************************
MAIN4:
JB F_DIS_CALL,MAIN4_LOOP ;如果已經顯示了CALL機畫面,就直接去下一步
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 ;此標志是判斷是否輸入完成第一行的標志
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 ;等待輸入數據
MOV A,KEY_GESHU ;根據按鍵的個數來判斷程序的流向
CJNE A,#0,MAIN4_8
MOV A,KEY_NO
CJNE A,#0FH,MAIN4_4
NOP
NOP
LJMP CALL_OUT ;如果第一個輸入的數據就是F,就退出
MAIN4_4:
CJNE A,#0CH,MAIN4_5
NOP
NOP
LJMP CALL_OUT ;如果第一個輸入的數據就是C,就退出
MAIN4_5:
CJNE A,#10,MAIN4_6
MAIN4_6:
JC MAIN4_7
NOP
NOP
LJMP MAIN5 ;如果是不為C、F、0--9的其他數,不于處理
MAIN4_7:
MOV R0,#KEY_AERA ;第一個數字的存儲
MOV @R0,KEY_NO
MOV X_ADD,#3 ;顯示第一個數據
MOV Y_ADD,#88
LCALL KEY_COMPARE
LCALL OUTSHUZI
INC KEY_GESHU
MOV X_ADD,#3 ;顯示第一個光標
MOV Y_ADD,#96
MOV DPTR,#ZIMU_GUANGBIAO
LCALL OUTSHUZI
LJMP MAIN4_LOOP
;*******輸入的第二個數據的處理*************
MAIN4_8:
CJNE A,#01,MAIN4_10 ;
MOV A,KEY_NO
CJNE A,#0CH,MAIN4_9
MOV X_ADD,#3 ;清除第1個數據
MOV Y_ADD,#88
MOV DPTR,#BLANK8
LCALL OUTSHUZI
DEC KEY_GESHU
MOV X_ADD,#3 ;顯示第0個光標
MOV Y_ADD,#88
MOV DPTR,#ZIMU_GUANGBIAO
LCALL OUTSHUZI
MOV X_ADD,#3 ;CLEAR第一個光標
MOV Y_ADD,#96
MOV DPTR,#BLANK8
LCALL OUTSHUZI
LJMP MAIN5
MAIN4_9:
CJNE A,#0FH,MAIN4_91
MOV X_ADD,#3 ;清除第一行第2個光標
MOV Y_ADD,#96
MOV DPTR,#BLANK8
LCALL OUTSHUZI
MOV R0,#KEY_AERA ;只有一個數據的,然后是一個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個光標
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 ;第一個數字的存儲
MOV @R0,KEY_NO
MOV X_ADD,#3 ;顯示第2個數據
MOV Y_ADD,#96
LCALL KEY_COMPARE
LCALL OUTSHUZI
INC KEY_GESHU
LJMP MAIN5
MAIN4_B:
NOP ;其他的按鍵不處理
LJMP MAIN5
;*****************************************************
MAIN4_10: ;等待的是第3個數據是F或C,第2行
MOV A,KEY_NO
CJNE A,#0CH,MAIN4_11
MOV X_ADD,#3 ;清除第2個數據
MOV Y_ADD,#96
MOV DPTR,#ZIMU_GUANGBIAO
LCALL OUTSHUZI
MOV X_ADD,#3 ;清除第2個光標
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個光標
MOV Y_ADD,#88
MOV DPTR,#ZIMU_GUANGBIAO
LCALL OUTSHUZI
SETB F_DIS_CALL_2
;**************等待輸入第2行的數據****************
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個數據為C,清除第2個數據
MOV Y_ADD,#96
MOV DPTR,#BLANK8
LCALL OUTSHUZI
MOV X_ADD,#6 ;清除第2行的光標
MOV Y_ADD,#88
MOV DPTR,#BLANK8
LCALL OUTSHUZI
DEC KEY_GESHU
CLR F_DIS_CALL_2 ;回到上一行的標志
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
MAIN4_251:
CJNE A,#10,MAIN4_26
MAIN4_26:
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -