⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd89527.asm

📁 餐饮呼叫系统的汇编源代码
💻 ASM
📖 第 1 页 / 共 5 页
字号:
;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 + -