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

📄 atmega32_project.asm

📁 Home Automation System (Source Code)
💻 ASM
📖 第 1 页 / 共 4 页
字号:
	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 + -