📄 lcd89527.asm
字号:
;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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -