📄 transmitter.a51
字号:
INCLUDE REG_52.PDF
RB0 EQU 000H ; Select Register Bank 0
RB1 EQU 008H ; Select Register Bank 1 ...poke to PSW to use
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
; PORT DECLERATION
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
WRITE EQU P1.0
SEND EQU P1.1
KEYB_CLOCK EQU P3.3
KEYB_DATA EQU P3.2
KB_LSHIFT EQU 12H
KB_RSHIFT EQU 59H
KB_CTRL EQU 14H
KB_ALT EQU 11H
KB_CAPS EQU 58H
KB_SCROLL EQU 7EH
KB_NUML EQU 77H
KB_TAB EQU 0DH
KB_REL EQU 0F0H
KB_EXT EQU 0E0H
KB_PAUSE EQU 0E1H
CAPS EQU 01H
NUML EQU 02H
SCROLL EQU 04H
SHIFT EQU 08H
ACK EQU 10H
CTRL EQU 20H
ALT EQU 40H
RELEASE EQU 80H
PAUSED EQU 40H
EXTENDED EQU 80H
; ***LCD CONTROL***
LCD_RS EQU P0.0 ;LCD REGISTER SELECT LINE
LCD_E EQU P0.1 ;LCD ENABLE LINE
LCD_DB4 EQU P0.2 ;PORT 1 IS USED FOR DATA
LCD_DB5 EQU P0.3 ;USED FOR DATA
LCD_DB6 EQU P0.4 ;FOR DATA
LCD_DB7 EQU P0.5 ;FOR DATA
; ***CURSOR CONTROL INSTRUCTIONS***
OFFCUR EQU 0CH
BLINKCUR EQU 0DH
; ***DISPLAY CONTROL INSTRUCTIONS***
CLRDSP EQU 01H
ONDSP EQU 0CH
; ***SYSTEM INSTRUCTIONS***
CONFIG EQU 28H ; 4-BIT DATA,2 LINES,5X7 MATRIX LCD
ENTRYMODE EQU 6 ; INCREMENT CURSOR DON'T SHIFT DISPLAY
DSEG ; This is internal data memory
ORG 20H ; Bit adressable memory
FLAGS1: DS 1
KEYBRD BIT FLAGS1.0
POLY BIT FLAGS1.1
KB_OK: DS 1
KB_DATA: DS 1
KB_STATS: DS 1
KB_SCAN: DS 1
KB_TEMP: DS 1 ; For the da*n pause key
KB_COUNT: DS 1
COUNT: DS 1
MSG: DS 64
STACK: DS 1
CSEG ; Code begins here
; ---------==========----------==========---------=========---------
; Main routine. Program execution starts here.
; ---------==========----------==========---------=========---------
ORG 00H ; Reset
; ---------==========----------==========---------=========---------
MAIN:
MOV SP,#70H
MOV PSW,#RB0 ; Select register bank 0
MOV TMOD,#20H
MOV TH1,#0A0H
MOV SCON,#50H
CLR KEYBRD
SETB TR1
CALL RESETLCD4
CALL INITLCD4
MAINS: CALL TITLE1
CALL DELAYS
CALL DELAYS
SETB WRITE
SETB SEND
JB WRITE,$ ;CHK WRITE BUTTON
LAP: CALL DELAY
JNB WRITE,$
LAP1: JB KEYBRD,LAOPS
CALL InitKeyb ;Inizialize Keyboard
MOV a, KB_OK
JZ KBNotOK
SETB KEYBRD
LAP1S: JNB WRITE,$
CALL EDIT_DATA ;enter the text
CALL CLEAR_MEMORY
MOV R0,#MSG
MOV R5,#64
SETB WRITE ;CHK WRITE BUTTON FOR CANCEL EDITING
LAOPS: CALL Check_Keyb
JNB WRITE,LAP1S
JNB SEND,SEN_DATA
JNC LAOPS
MOV A,KB_DATA
MOV @R0,A
INC R0
CJNE R5,#64,LINE1 ;CLEAR SCREEN
MOV R4,#01H
CALL WRLCDCOM4
CALL MDELAY
MOV R4,#80H
CALL WRLCDCOM4
CALL MDELAY
MOV R4,#0FH
CALL WRLCDCOM4
CALL MDELAY
AJMP LINE
KBNotOK: AJMP KBNotOKS
LINE1: CJNE R5,#48,LINE2 ;SECOND LINE
MOV R4,#0C0H
CALL WRLCDCOM4
CALL MDELAY
AJMP LINE
LINE2: CJNE R5,#32,LINE3 ;SECOND PAGE FIRST LINE
MOV R4,#01H
CALL WRLCDCOM4
CALL MDELAY
MOV R4,#80H
CALL WRLCDCOM4
CALL MDELAY
AJMP LINE
LINE3: CJNE R5,#16,LINE ;SECOND PAGE SECOND LINE
MOV R4,#0C0H
CALL WRLCDCOM4
CALL MDELAY
AJMP LINE
LINE: MOV R4,KB_DATA
CALL WRLCDDATA
CALL MDELAY
DJNZ R5,LAOPS
CALL PRESS_SENT
SETB SEND
SETB WRITE
HERE: JNB SEND,SEN_DATA
JB WRITE,HERE
AJMP LAP
SEN_DATA:
CALL DELAY
JNB SEND,$
CALL ALGO_DISP ;DISP SELECT ALGORITHM
SETB SEND
SETB WRITE
NXT1: JNB SEND,NEXT
JB WRITE,NXT1
CLR POLY
CALL DELAY
JNB WRITE,$
CALL DELAY
AJMP NEXT1
NEXT: SETB POLY
CALL DELAY
JNB SEND,$
CALL DELAY
NEXT1: MOV COUNT,#00H
CALL SELECT_KEY
CALL DELAY
CALL SENDING_DATA
MOV R6,#50
TOPS:
MOV A,#0AAH ;START BYTE
CALL TRANS
MOV A,#64
CLR C
SUBB A,R5 ;TRANSMIT MESSAGE LENGTH
MOV R5,A
CALL TRANS
JNB POLY,FGV1
MOV A,#21H ;ENCRYPTION TYPE BYTE
CALL TRANS ;AB FOR MONO
AJMP FGV2
FGV1: MOV A,#20H ;;AC FOR POLY
CALL TRANS
FGV2: MOV A,COUNT
ADD A,#30H
CALL TRANS
MOV R0,#MSG
REPEAT: MOV A,@R0
INC R0
CALL TRANS
DJNZ R5,REPEAT
SETB WRITE
JNB WRITE,LAP1SA
DJNZ R6,TOPS
CALL DATA_SENT
CALL DELAYS
CALL DELAYS
CALL DELAYS
AJMP MAINS
LAP1SA: CALL MDELAY
JNB WRITE,$
AJMP LAP1S
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CLEAR_MEMORY:
MOV R0,#MSG
MOV R5,#64
MOV A,#' '
PEER: MOV @R0,A
INC R0
DJNZ R5,PEER
RET
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
KBNotOKS:
CALL DISP1
SETB WRITE
JB WRITE,$
CALL MDELAY
JNB WRITE,$
AJMP LAP1
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DELAY:
MOV R1,#0FFH
RE1: MOV R2,#0FFH
RE: NOP
DJNZ R2,RE
DJNZ R1,RE1
RET
;**********************************************************
; ---------==========----------==========---------=========---------
TRANS:
MOV SBUF,A
JNB TI,$
CLR TI
RET
;##########################################################
; DISPLAY ROUTINES
;##########################################################
TITLE1:
MOV DPTR,#MSAG1
CALL LCD_MSG
RET
MSAG1:
DB 1H,82H,'Securred Comm',0C3H,'Automation ',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SENDING_DATA:
MOV DPTR,#MSAG2
CALL LCD_MSG
RET
MSAG2:
DB 1H,80H,'Sending data....',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PRESS_SENT:
MOV DPTR,#MSAG3
CALL LCD_MSG
RET
MSAG3:
DB 1H,80H,'Write to Edit..',0C0H,'Send to Transmit',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DISP1:
MOV DPTR,#MSG1
CALL LCD_MSG
RET
MSG1:
DB 1H,84H,'Keyboard',0C3H,'* Not Ok *', 00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
EDIT_DATA:
MOV DPTR,#MSG2
CALL LCD_MSG
RET
MSG2:
DB 1H,80H,'Enter the text',0C0H,00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ALGO_DISP:
MOV DPTR,#MSG21
CALL LCD_MSG
RET
MSG21:
DB 1H,80H,'Monoalphabetic ',0C0H,'Polyalphabetic ',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ASK_KEY0:
MOV DPTR,#MSG22
CALL LCD_MSG
RET
MSG22:
DB 1H,80H,'Please select',0C0H,'the Key: 0',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ASK_KEY1:
MOV DPTR,#MSG23
CALL LCD_MSG
RET
MSG23:
DB 1H,80H,'Please select',0C0H,'the Key: 1',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ASK_KEY2:
MOV DPTR,#MSG24
CALL LCD_MSG
RET
MSG24:
DB 1H,80H,'Please select',0C0H,'the Key: 2',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ASK_KEY3:
MOV DPTR,#MSG25
CALL LCD_MSG
RET
MSG25:
DB 1H,80H,'Please select',0C0H,'the Key: 3',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ASK_KEY4:
MOV DPTR,#MSG26
CALL LCD_MSG
RET
MSG26:
DB 1H,80H,'Please select',0C0H,'the Key: 4',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ASK_KEY5:
MOV DPTR,#MSG261
CALL LCD_MSG
RET
MSG261:
DB 1H,80H,'Please select',0C0H,'the Key: 5',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ASK_KEY6:
MOV DPTR,#MSG27
CALL LCD_MSG
RET
MSG27:
DB 1H,80H,'Please select',0C0H,'the Key: 6',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ASK_KEY7:
MOV DPTR,#MSG29
CALL LCD_MSG
RET
MSG29:
DB 1H,80H,'Please select',0C0H,'the Key: 7',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ASK_KEY8:
MOV DPTR,#MSG30
CALL LCD_MSG
RET
MSG30:
DB 1H,80H,'Please select',0C0H,'the Key: 8',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ASK_KEY9:
MOV DPTR,#MSG31
CALL LCD_MSG
RET
MSG31:
DB 1H,80H,'Please select',0C0H,'the Key: 9',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DATA_SENT:
MOV DPTR,#MSG33
CALL LCD_MSG
RET
MSG33:
DB 1H,80H,'Data send...',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SELECT_KEY:
MOV A,COUNT
CJNE A,#00H,CVF0
CALL ASK_KEY0
AJMP CVFF
CVF0: CJNE A,#01H,CVF1
CALL ASK_KEY1
AJMP CVFF
CVF1: CJNE A,#02H,CVF2
CALL ASK_KEY2
AJMP CVFF
CVF2: CJNE A,#03H,CVF3
CALL ASK_KEY3
AJMP CVFF
CVF3: CJNE A,#04H,CVF4
CALL ASK_KEY4
AJMP CVFF
CVF4: CJNE A,#05H,CVF5
CALL ASK_KEY5
AJMP CVFF
CVF5: CJNE A,#06H,CVF6
CALL ASK_KEY6
AJMP CVFF
CVF6: CJNE A,#07H,CVF7
CALL ASK_KEY7
AJMP CVFF
CVF7: CJNE A,#08H,CVF8
CALL ASK_KEY8
AJMP CVFF
CVF8: CJNE A,#09H,CVF9
CALL ASK_KEY9
AJMP CVFF
CVF9: MOV COUNT,#00H
AJMP SELECT_KEY
CVFF:
SETB WRITE
SETB SEND
FCD3: JNB WRITE,FCD1
JNB SEND,FCD2
AJMP FCD3
FCD2: CALL MDELAY
JNB SEND,$
RET
FCD1: INC COUNT
MOV A,COUNT
CALL MDELAY
JNB WRITE,$
AJMP SELECT_KEY
;**********************************************************
; INITIALIZE THE LCD 4-BIT MODE
;**********************************************************
INITLCD4:
CLR LCD_RS ; LCD REGISTER SELECT LINE
CLR LCD_E ; ENABLE LINE
MOV R4, #CONFIG; FUNCTION SET - DATA BITS,
; LINES, FONTS
CALL WRLCDCOM4
MOV R4, #ONDSP ; DISPLAY ON
CALL WRLCDCOM4
MOV R4, #ENTRYMODE ; SET ENTRY MODE
CALL WRLCDCOM4 ; INCREMENT CURSOR RIGHT, NO SHIFT
MOV R4, #CLRDSP; CLEAR DISPLAY, HOME CURSOR
CALL WRLCDCOM4
RET
; **********************************************************
; SOFTWARE VERSION OF THE POWER ON RESET
; **********************************************************
RESETLCD4:
CLR LCD_RS ; LCD REGISTER SELECT LINE
CLR LCD_E ; ENABLE LINE
CLR LCD_DB7 ; SET BIT PATTERN FOR...
CLR LCD_DB6 ; ... POWER-ON-RESET
SETB LCD_DB5
SETB LCD_DB4
SETB LCD_E ; START ENABLE PULSE
CLR LCD_E ; END ENABLE PULSE
MOV A, #4 ; DELAY 4 MILLISECONDS
CALL MDELAY
SETB LCD_E ; START ENABLE PULSE
CLR LCD_E ; END ENABLE PULSE
MOV A, #1 ; DELAY 1 MILLISECOND
CALL MDELAY
SETB LCD_E ; START ENABLE PULSE
CLR LCD_E ; END ENABLE PULSE
MOV A, #1 ; DELAY 1 MILLISECOND
CALL MDELAY
CLR LCD_DB4 ; SPECIFY 4-BIT OPERATION
SETB LCD_E ; START ENABLE PULSE
CLR LCD_E ; END ENABLE PULSE
MOV A, #1 ; DELAY 1 MILLISECOND
CALL MDELAY
MOV R4, #CONFIG; FUNCTION SET
CALL WRLCDCOM4
MOV R4, #08H ; DISPLAY OFF
CALL WRLCDCOM4
MOV R4, #1 ; CLEAR DISPLAY, HOME CURSOR
CALL WRLCDCOM4
MOV R4,#ENTRYMODE ; SET ENTRY MODE
ACALL WRLCDCOM4
JMP INITLCD4
; **********************************************************
; SUB WRITES A COMMAND WORD TO THE LCD
; COMMAND MUST BE PLACED IN R4 BY CALLING PROGRAM
; **********************************************************
WRLCDCOM4:
CLR LCD_E
CLR LCD_RS ; SELECT SEND COMMAND
PUSH ACC ; SAVE ACCUMULATOR
MOV A, R4 ; PUT DATA BYTE IN ACC
MOV C, ACC.4 ; LOAD HIGH NIBBLE ON DATA BUS
MOV LCD_DB4, C ; ONE BIT AT A TIME USING...
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -