📄 atmega32_project.asm
字号:
ST X, TEMP
RCALL DELAY
RCALL SET_SMS_DELETE
RCALL LCD_CLEAR
RCALL DELAY_LCD
LDI XH, HIGH(SMS_SENDER_DETAILS_START)
LDI XL, LOW(SMS_SENDER_DETAILS_START)
CBI PORTB, PB0
CBI PORTB, PB1
RCALL TEST_USER_AUTHENTICATION
BRTC SMS_INVALID_SENDER
RJMP DECODE_SMS_MESSAGE
DECODE_SMS_MESSAGE:
RCALL DECODE_MESSAGE_NOW
LDI EADD_LOW, USER_DEVICE_LOCK_BYTE
RCALL EEPROM_READ
MOV R25, EEPROM_DATA
LDI EADD_LOW, USER_DEVICE_BYTE
RCALL EEPROM_READ
MOV TEMP, EEPROM_DATA
RCALL ACTIVATE_DECODED_MESSAGE
RCALL DELAY
RJMP QUIT_GET_SMS_DATA
SMS_INVALID_SENDER:
LDI ZH, HIGH(LCD_MOBILE_USER_INVALID*2)
LDI ZL, LOW(LCD_MOBILE_USER_INVALID*2)
RCALL LCD_STRING
RCALL LCD_LINE2
LDI XH, HIGH(SMS_SENDER_DETAILS_START)
LDI XL, LOW(SMS_SENDER_DETAILS_START)
LDI TEMP, (SMS_SENDER_DETAILS_END+1)
TRANSMIT_INVALID_SENDER_TO_LCD:
LD LCD_CHAR, X+
RCALL LCD_DATA
CP XL, TEMP
BRNE TRANSMIT_INVALID_SENDER_TO_LCD
QUIT_GET_SMS_DATA:
RCALL DELAY
SBI PORTB, PB0
SBI PORTB, PB1
RCALL DELAY_SHORT
RCALL INIT_CELL_PHONE
SBI UCSRB, RXEN
SEI
RCALL DELAY_SHORT
RCALL BUZZER
RCALL DISPLAY_SWITCHES_ON_LCD
RCALL BUZZER
RCALL OUTPUT_TO_PORTA
RET
TEST_USER_AUTHENTICATION:
CLR EADD_HIGH
LDI EADD_LOW, USER_STATUS_BYTE
RCALL EEPROM_READ
MOV R24, EEPROM_DATA
CLT
RCALL TEST_FOR_USER1
BRTS QUIT_TEST_USER_AUTHENTICATION
CLR R6
SBRC R24, 2
RCALL TEST_FOR_USER2
BRTS QUIT_TEST_USER_AUTHENTICATION
SBRC R24, 3
RCALL TEST_FOR_USER3
BRTS QUIT_TEST_USER_AUTHENTICATION
QUIT_TEST_USER_AUTHENTICATION:
RET
TEST_FOR_USER1:
LDI EADD_LOW, (USER_CONTACT_AREA1+1)
RCALL CHECK_SENDER_NOW
BRTC QUIT_TEST_FOR_USER1
LDI EADD_LOW, (USER_NAME_AREA1+1)
RCALL TRANSMIT_NAME_ON_LCD
LDI TEMP, '1'
LDI R25, 0B00000001
MOV R6, R25
QUIT_TEST_FOR_USER1:
RET
TEST_FOR_USER2:
LDI EADD_LOW, (USER_CONTACT_AREA2+1)
RCALL CHECK_SENDER_NOW
BRTC QUIT_TEST_FOR_USER2
LDI EADD_LOW, (USER_NAME_AREA2+1)
RCALL TRANSMIT_NAME_ON_LCD
LDI TEMP, '2'
QUIT_TEST_FOR_USER2:
RET
TEST_FOR_USER3:
LDI EADD_LOW, (USER_CONTACT_AREA3+1)
RCALL CHECK_SENDER_NOW
BRTC QUIT_TEST_FOR_USER3
LDI EADD_LOW, (USER_NAME_AREA3+1)
RCALL TRANSMIT_NAME_ON_LCD
LDI TEMP, '3'
QUIT_TEST_FOR_USER3:
RET
CHECK_SENDER_NOW:
CLT
LDI XH, HIGH(SMS_SENDER_DETAILS_START)
LDI XL, LOW(SMS_SENDER_DETAILS_START)
LDI COUNT_IT, 13
CHECK_SENDER_LOOP:
RCALL EEPROM_READ
LD TEMP, X+
CP TEMP, EEPROM_DATA
BRNE QUIT_CHECK_SENDER_NOW
INC EADD_LOW
DEC COUNT_IT
CPI COUNT_IT, 0X00
BREQ USER_VARIFIED
RJMP CHECK_SENDER_LOOP
USER_VARIFIED:
RCALL LCD_CLEAR
LDI ZH, HIGH(LCD_MOBILE_USER_VALID*2)
LDI ZL, LOW(LCD_MOBILE_USER_VALID*2)
RCALL LCD_STRING
SET
QUIT_CHECK_SENDER_NOW:
RET
TRANSMIT_NAME_ON_LCD:
RCALL LCD_LINE2
TRANSMIT_NAME_LOOP:
RCALL EEPROM_READ
MOV LCD_CHAR, EEPROM_DATA
CPI LCD_CHAR, 0X00
BREQ QUIT_TRANSMIT_NAME_ON_LCD
RCALL LCD_DATA
INC EADD_LOW
WAIT
RJMP TRANSMIT_NAME_LOOP
QUIT_TRANSMIT_NAME_ON_LCD:
RET
;---------------------------------------------------------
; DECODE MESSAGE ROUTINE GO HERE
DECODE_MESSAGE_NOW:
LDI R25, 1
MOV R0, R25
LDI R25, 2
MOV R8, R25
CLR EADD_HIGH
LDI EADD_LOW, USER_DEVICE_BYTE
RCALL EEPROM_READ
MOV R24, EEPROM_DATA
LDI XH, HIGH(SMS_MESSAGE_START)
LDI XL, LOW(SMS_MESSAGE_START)
LDI COUNT_IT, 8
CLC
START_DECODING_NOW:
MOV EEPROM_DATA, R24
LD TEMP, X+
CPI TEMP, '1'
BREQ SET_ONE_TO_IT
CPI TEMP, '0'
BREQ SET_ZERO_TO_IT
RJMP CONT_NOW
SET_ZERO_TO_IT:
COM R0
AND EEPROM_DATA, R0
MOV R24, EEPROM_DATA
COM R0
RJMP CONT_NOW
SET_ONE_TO_IT:
OR EEPROM_DATA, R0
MOV R24, EEPROM_DATA
RJMP CONT_NOW
CONT_NOW:
MUL R0, R8
DEC COUNT_IT
BRNE START_DECODING_NOW
RJMP QUIT_DECODE_MESSAGE_NOW
QUIT_DECODE_MESSAGE_NOW:
RET
;---------------------------------------------------------
; ACTIVATE DECODED MESSAGE ROUTINE
ACTIVATE_DECODED_MESSAGE:
SBRS R6, 0
RJMP NOT_ADMINISTRATOR
MOV EEPROM_DATA, R24
RJMP LOAD_DEVICE_BYTE
NOT_ADMINISTRATOR:
AND TEMP, R25
COM R25 ;COMPLEMENT LOCK BYTE FROM EEPROM
AND R24, R25
OR TEMP, R24
MOV EEPROM_DATA, TEMP
LOAD_DEVICE_BYTE:
CLR EADD_HIGH
LDI EADD_LOW, USER_DEVICE_BYTE
RCALL EEPROM_WRITE
RCALL DELAY_SHORT
QUIT_ACTIVATE_DECODED_MESSAGE:
RET
;---------------------------------------------------------
; PC TO RESPONSE WHEN INTERRUPTED BY PC
PC_RESPONSE:
CLI
CLR R24
LDI TEMP, 0X00
PUSH TEMP
CBI PORTB, PB0
CBI PORTB, PB1
LDI TEMP, '#'
MOV R24, TEMP
RCALL TRANSMIT
RCALL DELAY_SHORT
FIRST_PASSWORD_CHECK:
RCALL BREAK_UP_LINE
LDI ZH, HIGH(USER_PC_COMMAND_STR*2)
LDI ZL, LOW(USER_PC_COMMAND_STR*2)
RCALL TRANSMIT_LOOP
RCALL LCD_CLEAR
LDI ZH, HIGH(LCD_PC_COMMAND_STR*2)
LDI ZL, LOW(LCD_PC_COMMAND_STR*2)
RCALL LCD_STRING
RCALL PASSWORD_ENTER
BRTC INVALID_USER_GO
BRTS VALID_USER_GO
INVALID_USER_GO:
CLT
RCALL INVALID_USER
BRTS FIRST_PASSWORD_CHECK
BRTC QUIT_PC_RESPONSE
VALID_USER_GO:
CLT
RCALL BREAK_UP_LINE
RCALL VALID_USER
LDI ZH, HIGH(LCD_PC_CONNECT_STR*2)
LDI ZL, LOW(LCD_PC_CONNECT_STR*2)
RCALL LCD_CLEAR
RCALL LCD_STRING
RCALL RETURN_PLACE
RJMP QUIT_PC_RESPONSE
QUIT_PC_RESPONSE:
POP TEMP
CPI TEMP, 0X00
BREQ RETURN_BACK
RJMP QUIT_PC_RESPONSE
RETURN_BACK:
LDI ZH, HIGH(USER_PC_EXIT_STR*2)
LDI ZL, LOW(USER_PC_EXIT_STR*2)
RCALL TRANSMIT_LOOP
WAIT
LDI TEMP, 1
RCALL TRANSMIT
SBI PORTB, PB0
SBI PORTB, PB1
RCALL INTRO_LCD
RCALL INIT_CELL_PHONE
RCALL BUZZER
RCALL BUZZER
SEI
RCALL DISPLAY_SWITCHES_ON_LCD
RET
RETURN_PLACE:
LDI ZH, HIGH(USER_PC_CURSOR_STR*2)
LDI ZL, LOW(USER_PC_CURSOR_STR*2)
RCALL TRANSMIT_LOOP
RCALL GET_KEY_ENTERED
CHECK_KEYWORD:
CPI TEMP, 'h'
BREQ HELP_INDEX_GO
CPI TEMP, 'H'
BREQ HELP_INDEX_GO
CPI TEMP, 'a'
BREQ ADD_USER_GO
CPI TEMP, 'A'
BREQ ADD_USER_GO
CPI TEMP, 'B'
BREQ BUZZER_OPTIONS_GO
CPI TEMP, 'c'
BREQ CHANGE_OPTIONS_GO
CPI TEMP, 'C'
BREQ CHANGE_OPTIONS_GO
CPI TEMP, 'b'
BREQ BUZZER_OPTIONS_GO
CPI TEMP, 'E'
BREQ QUIT_PC_RESPONSE_GO
CPI TEMP, 'l'
BREQ LOCK_OPTIONS_GO
CPI TEMP, 'L'
BREQ LOCK_OPTIONS_GO
CPI TEMP, 'e'
BREQ QUIT_PC_RESPONSE_GO
CPI TEMP, 'P'
BREQ CONFIG_PASSWORD_GO
CPI TEMP, 'p'
BREQ CONFIG_PASSWORD_GO
CPI TEMP, 'r'
BREQ RESET_HARDWARE_GO
CPI TEMP, 'R'
BREQ RESET_HARDWARE_GO
CPI TEMP, 's'
BREQ SWITCH_OPTIONS_GO
CPI TEMP, 'S'
BREQ SWITCH_OPTIONS_GO
CPI TEMP, 'u'
BREQ USERS_INFORMATION_GO
CPI TEMP, 'U'
BREQ USERS_INFORMATION_GO
CPI TEMP, 'v'
BREQ VIEW_INFORMATION_GO
CPI TEMP, 'V'
BREQ VIEW_INFORMATION_GO
RCALL USER_INPUT_ERROR
RJMP RETURN_PLACE
HELP_INDEX_GO:
RCALL BUZZER
RCALL HELP_INDEX
RJMP RETURN_PLACE
ADD_USER_GO:
RCALL BUZZER
RCALL ADD_USER_OPTIONS
RJMP RETURN_PLACE
BUZZER_OPTIONS_GO:
RCALL BUZZER
RCALL BUZZER_OPTIONS
RJMP RETURN_PLACE
CHANGE_OPTIONS_GO:
RCALL BUZZER
RCALL CHANGE_OPTIONS
RJMP RETURN_PLACE
CONFIG_PASSWORD_GO:
RCALL BUZZER
RCALL CONFIG_PASSWORD
RJMP RETURN_PLACE
LOCK_OPTIONS_GO:
RCALL BUZZER
RCALL LOCK_OPTIONS
RJMP RETURN_PLACE
RESET_HARDWARE_GO:
RCALL BUZZER
RCALL RESET_HARDWARE
RJMP RETURN_PLACE
SWITCH_OPTIONS_GO:
RCALL BUZZER
RCALL SWITCH_OPTIONS
RJMP RETURN_PLACE
USERS_INFORMATION_GO:
RCALL BUZZER
RCALL BREAK_UP_LINE
RCALL USERS_INFORMATION
RJMP RETURN_PLACE
VIEW_INFORMATION_GO:
RCALL BUZZER
RCALL VIEW_INFORMATION
RJMP RETURN_PLACE
QUIT_PC_RESPONSE_GO:
RET
;---------------------------------------------------------
; INVALID AND VALID USERS ROUTINES
INVALID_USER:
LDI ZH, HIGH(USER_INVALID_STR*2)
LDI ZL, LOW(USER_INVALID_STR*2)
RCALL TRANSMIT_LOOP
INVALID_USER_RETRY:
LDI ZH, HIGH(USER_INVALID_STR2*2)
LDI ZL, LOW(USER_INVALID_STR2*2)
RCALL TRANSMIT_LOOP
RCALL GET_KEY_ENTERED
CPI TEMP, 'Y'
BREQ FIRST_PASSWORD_CHECK_GO
CPI TEMP, 'y'
BREQ FIRST_PASSWORD_CHECK_GO
CPI TEMP, 'N'
BREQ QUIT_INVALID_USER
CPI TEMP, 'n'
BREQ QUIT_INVALID_USER
RCALL USER_INPUT_ERROR
RJMP INVALID_USER_RETRY
FIRST_PASSWORD_CHECK_GO:
SET
QUIT_INVALID_USER:
RET
VALID_USER:
LDI ZH, HIGH(USER_VALID_STR*2)
LDI ZL, LOW(USER_VALID_STR*2)
RCALL TRANSMIT_LOOP
RCALL LCD_CLEAR
LDI ZH, HIGH(LCD_VALID_STR*2)
LDI ZL, LOW(LCD_VALID_STR*2)
RCALL LCD_STRING
LDI ZH, HIGH(USER_PC_CONNECT_STR*2)
LDI ZL, LOW(USER_PC_CONNECT_STR*2)
RCALL TRANSMIT_LOOP
RCALL DELAY_SHORT
RET
;---------------------------------------------------------
; HELP INDEX FOR NEW USERS
HELP_INDEX:
RCALL BREAK_UP_LINE
LDI ZH, HIGH(USER_PC_OPTIONS_STR*2)
LDI ZL, LOW(USER_PC_OPTIONS_STR*2)
RCALL TRANSMIT_LOOP
RCALL BREAK_UP_LINE
RET
;---------------------------------------------------------
; USER_INPUT_ERROR
USER_INPUT_ERROR:
LDI ZH, HIGH(USER_PC_ADD_OPTIONS_STR7*2)
LDI ZL, LOW(USER_PC_ADD_OPTIONS_STR7*2)
RCALL TRANSMIT_LOOP
RET
;---------------------------------------------------------
; ADD USER OPTIONS
ADD_USER_OPTIONS:
RCALL BREAK_UP_LINE
LDI ZH, HIGH(USER_PC_ADD_OPTIONS_STR*2)
LDI ZL, LOW(USER_PC_ADD_OPTIONS_STR*2)
RCALL TRANSMIT_LOOP
ADD_USER_OPTIONS_GO:
RCALL USERS_INFORMATION
LDI ZH, HIGH(USER_PC_ADD_OPTIONS_STR1*2)
LDI ZL, LOW(USER_PC_ADD_OPTIONS_STR1*2)
RCALL TRANSMIT_LOOP
RCALL GET_KEY_ENTERED
CPI TEMP, '1'
BREQ USER1_EXISTS
CPI TEMP, '2'
BREQ USER_ADD_2_GO
CPI TEMP, '3'
BREQ USER_ADD_3_GO
CPI TEMP, 'n'
BREQ QUIT_ADD_USER_OPTIONS
CPI TEMP, 'N'
BREQ QUIT_ADD_USER_OPTIONS
RCALL USER_INPUT_ERROR
RJMP ADD_USER_OPTIONS_GO
USER1_EXISTS:
LDI ZH, HIGH(USER_PC_ADD_OPTIONS_STRD*2)
LDI ZL, LOW(USER_PC_ADD_OPTIONS_STRD*2)
RCALL TRANSMIT_LOOP
RJMP ADD_USER_OPTIONS_GO
USER_ADD_2_GO:
CLT
CLR EADD_HIGH
LDI EADD_LOW, USER_STATUS_BYTE
RCALL EEPROM_READ
MOV R24, EEPROM_DATA
LDI R25, 0B11111011
SBRS EEPROM_DATA, 2
RCALL USER_ADD_2
BRTS ADD_ANOTHER_USER
RCALL DO_YOU_WANT_TO_REMOVE
BRTS REMOVE_THIS_USER
RJMP ADD_USER_OPTIONS_GO
USER_ADD_3_GO:
CLT
CLR EADD_HIGH
LDI EADD_LOW, USER_STATUS_BYTE
RCALL EEPROM_READ
MOV R24, EEPROM_DATA
LDI R25, 0B11110111
SBRS EEPROM_DATA, 3
RCALL USER_ADD_3
BRTS ADD_ANOTHER_USER
RCALL DO_YOU_WANT_TO_REMOVE
BRTS REMOVE_THIS_USER
RJMP ADD_USER_OPTIONS_GO
REMOVE_THIS_USER:
AND EEPROM_DATA, R25
RCALL EEPROM_WRITE
RJMP ADD_USER_OPTIONS_GO
ADD_ANOTHER_USER:
LDI ZH, HIGH(USER_PC_ADD_OPTIONS_STR3*2)
LDI ZL, LOW(USER_PC_ADD_OPTIONS_STR3*2)
RCALL TRANSMIT_LOOP
RCALL GET_KEY_ENTERED
CPI TEMP, 'y'
BREQ ADD_USER_OPTIONS_GO
CPI TEMP, 'Y'
BREQ ADD_USER_OPTIONS_GO
CPI TEMP, 'n'
BREQ QUIT_ADD_USER_OPTIONS
CPI TEMP, 'N'
BREQ QUIT_ADD_USER_OPTIONS
RCALL USER_INPUT_ERROR
RJMP ADD_ANOTHER_USER
QUIT_ADD_USER_OPTIONS:
RCALL BREAK_UP_LINE
CLT
RET
DO_YOU_WANT_TO_REMOVE:
LDI ZH, HIGH(USER_PC_ADD_OPTIONS_STR2*2)
LDI ZL, LOW(USER_PC_ADD_OPTIONS_STR2*2)
RCALL TRANSMIT_LOOP
LDI ZH, HIGH(USER_PC_ADD_OPTIONS_STRR*2)
LDI ZL, LOW(USER_PC_ADD_OPTIONS_STRR*2)
RCALL TRANSMIT_LOOP
RCALL GET_KEY_ENTERED
CPI TEMP, 'y'
BREQ YES_REPLACE
CPI TEMP, 'Y'
BREQ YES_REPLACE
CPI TEMP, 'n'
BREQ DONT_REPLACE
CPI TEMP, 'N'
BREQ DONT_REPLACE
CPI TEMP, 'N'
RCALL USER_INPUT_ERROR
RJMP DO_YOU_WANT_TO_REMOVE
DONT_REPLACE:
CLT
RJMP QUIT_REMOVE_OPTION
YES_REPLACE:
SET
QUIT_REMOVE_OPTION:
RET
USER_ADD_2:
LDI EADD_LOW, USER_NAME_AREA2
RCALL ADD_USER_NAME
LDI EADD_LOW, USER_CONTACT_AREA2
RCALL ADD_USER_CONTACT
LDI EADD_LOW, USER_STATUS_BYTE
RCALL EEPROM_READ
ORI R24, 0B00000100
MOV EEPROM_DATA, R24
RCALL EEPROM_WRITE
WAIT
LDI ZH, HIGH(USER_PC_ADD_OPTIONS_STR4*2)
LDI ZL, LOW(USER_PC_ADD_OPTIONS_STR4*2)
RCALL TRANSMIT_LOOP
SET
RET
USER_ADD_3:
LDI EADD_LOW, USER_NAME_AREA3
RCALL ADD_USER_NAME
LDI EADD_LOW, USER_CONTACT_AREA3
RCALL ADD_USER_CONTACT
LDI EADD_LOW, USER_STATUS_BYTE
RCALL EEPROM_READ
ORI R24, 0B00001000
MOV EEPROM_DATA, R24
RCALL EEPROM_WRITE
WAIT
LDI ZH, HIGH(USER_PC_ADD_OPTIONS_STR4*2)
LDI ZL, LOW(USER_PC_ADD_OPTIONS_STR4*2)
RCALL TRANSMIT_LOOP
SET
RET
ADD_USER_NAME:
PUSH EADD_LOW
ADD_USER_RETRY:
CLR XH
LDI XL, LOW(201)
LDI ZH, HIGH(USER_PC_CHANGE_OPTIONS_STR3*2)
LDI ZL, LOW(USER_PC_CHANGE_OPTIONS_STR3*2)
RCALL TRANSMIT_LOOP
CLR COUNT_IT
SAVE_USER_NAME:
SBIS UCSRA, RXC
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -