📄 atmega32_project.asm
字号:
RJMP SAVE_USER_NAME
IN USART_DATA, UDR
CPI USART_DATA, 0X0D
BREQ LOAD_NAME_INTO_EEPROM_READY
CPI USART_DATA, 0X08
BREQ LOAD_NAME_INTO_EEPROM_READY_B
ST X+, USART_DATA
MOV TEMP, USART_DATA
RCALL TRANSMIT
INC COUNT_IT
RJMP SAVE_USER_NAME
LOAD_NAME_INTO_EEPROM_READY_B:
DEC XL
DEC COUNT_IT
MOV TEMP, USART_DATA
RCALL TRANSMIT
RJMP SAVE_USER_NAME
LOAD_NAME_INTO_EEPROM_READY:
LDI TEMP, 0X00
CPI COUNT_IT, 21
BRGE ADD_USER_RETRY
ST X, TEMP
LDI XL, LOW(201)
LOAD_NAME_INTO_EEPROM:
INC EADD_LOW
LD EEPROM_DATA, X+
RCALL EEPROM_WRITE
DEC COUNT_IT
CPI COUNT_IT, 0X00
BREQ NAME_SAVED
RJMP LOAD_NAME_INTO_EEPROM
NAME_SAVED:
INC EADD_LOW
LDI EEPROM_DATA, 0X00
RCALL EEPROM_WRITE
LDI EEPROM_DATA, '1'
POP EADD_LOW
RCALL EEPROM_WRITE
RJMP QUIT_ADD_USER_NAME
QUIT_ADD_USER_NAME:
RET
ADD_USER_CONTACT:
PUSH EADD_LOW
ADD_CONTACT_RETRY:
CLR XH
LDI XL, LOW(201)
LDI ZH, HIGH(USER_PC_CHANGE_OPTIONS_STR4*2)
LDI ZL, LOW(USER_PC_CHANGE_OPTIONS_STR4*2)
RCALL TRANSMIT_LOOP
CLR COUNT_IT
SAVE_USER_CONTACT:
SBIS UCSRA, RXC
RJMP SAVE_USER_CONTACT
IN USART_DATA, UDR
CPI USART_DATA, 0X0D
BREQ LOAD_CONTACT_INTO_EEPROM_READY
CPI USART_DATA, 0X08
BREQ SAVE_USER_CONTACT_B
ST X+, USART_DATA
MOV TEMP, USART_DATA
RCALL TRANSMIT
INC COUNT_IT
RJMP SAVE_USER_CONTACT
SAVE_USER_CONTACT_B:
DEC XL
DEC COUNT_IT
MOV TEMP, USART_DATA
RCALL TRANSMIT
RJMP SAVE_USER_CONTACT
LOAD_CONTACT_INTO_EEPROM_READY:
LDI TEMP, 0X00
ST X, TEMP
CPI COUNT_IT, 13
BRNE ADD_CONTACT_RETRY
LDI XL, LOW(201)
LOAD_CONTACT_INTO_EEPROM:
INC EADD_LOW
LD EEPROM_DATA, X+
RCALL EEPROM_WRITE
DEC COUNT_IT
CPI COUNT_IT, 0X00
BREQ CONTACT_SAVED
RJMP LOAD_CONTACT_INTO_EEPROM
CONTACT_SAVED:
INC EADD_LOW
LDI EEPROM_DATA, 0X00
RCALL EEPROM_WRITE
LDI EEPROM_DATA, '1'
POP EADD_LOW
RCALL EEPROM_WRITE
RJMP QUIT_ADD_USER_CONTACT
QUIT_ADD_USER_CONTACT:
RET
;---------------------------------------------------------
; CHANGE OR ALTER ANY MOBILE USER
CHANGE_OPTIONS:
RCALL BREAK_UP_LINE
LDI ZH, HIGH(USER_PC_CHANGE_OPTIONS_STR*2)
LDI ZL, LOW(USER_PC_CHANGE_OPTIONS_STR*2)
RCALL TRANSMIT_LOOP
RETURN_WHEN_CONFIGURED_ANY:
RCALL USERS_INFORMATION
CLR EADD_HIGH
LDI EADD_LOW, USER_STATUS_BYTE
RCALL EEPROM_READ
AGAIN_ASK_USER_NUMBER:
LDI ZH, HIGH(USER_PC_CHANGE_OPTIONS_STR2*2) ;Do you want to configure any user
LDI ZL, LOW(USER_PC_CHANGE_OPTIONS_STR2*2)
RCALL TRANSMIT_LOOP
RCALL GET_KEY_ENTERED
CPI TEMP, '1'
BREQ CONFIG_USER1
CPI TEMP, '2'
BREQ CONFIG_USER2
CPI TEMP, '3'
BREQ CONFIG_USER3
CPI TEMP, 'n'
BREQ QUIT_CHANGE_OPTIONS
CPI TEMP, 'N'
BREQ QUIT_CHANGE_OPTIONS
RCALL USER_INPUT_ERROR
RJMP AGAIN_ASK_USER_NUMBER
CONFIG_USER1:
MOV TEMP, EEPROM_DATA ; MOVE DATA TO TEMP FROM LAST READ EEPROM ADDRESS
ANDI TEMP, 0B11111101 ; ONLY CHANGE THE STATUS OF DEFAULT USER TO 0
MOV EEPROM_DATA, TEMP ; MOVE DATA FROM TEMP TO EEPROM DATA REGISTER
RCALL EEPROM_WRITE ; WRITE IT BACK TO LAST ACCESSED ADDRESS
LDI EADD_LOW, 0 ; LOAD NEW ADDRESS FOR EEPROM ACCESS
RCALL EEPROM_WRITE ; WRITE DATA INTO EEPROM ADDRESS 0 (FIRST BYTE)
PUSH TEMP ; STACK TEMP FOR FUTURE USE
LDI EADD_LOW, USER_NAME_AREA1 ; LOAD ADDRESS OF USER1 IN EEPROM
RCALL CONFIG_WHAT
POP TEMP
ORI TEMP, 0B00000010
MOV EEPROM_DATA, TEMP
LDI EADD_LOW, 0
RCALL EEPROM_WRITE
LDI EADD_LOW, USER_STATUS_BYTE
RCALL EEPROM_WRITE
RJMP RETURN_WHEN_CONFIGURED_ANY
CONFIG_USER2:
MOV TEMP, EEPROM_DATA
SBRS TEMP, 2
RJMP NO_SUCH_USER_EXISTS
LDI EADD_LOW, USER_NAME_AREA2
RCALL CONFIG_WHAT
RJMP RETURN_WHEN_CONFIGURED_ANY
CONFIG_USER3:
MOV TEMP, EEPROM_DATA
SBRS TEMP, 3
RJMP NO_SUCH_USER_EXISTS
LDI EADD_LOW, USER_NAME_AREA3
RCALL CONFIG_WHAT
RJMP RETURN_WHEN_CONFIGURED_ANY
NO_SUCH_USER_EXISTS:
LDI ZH, HIGH(USER_PC_CHANGE_OPTIONS_STR7*2) ;Sorry, no such user in the list
LDI ZL, LOW(USER_PC_CHANGE_OPTIONS_STR7*2)
RCALL TRANSMIT_LOOP
RJMP RETURN_WHEN_CONFIGURED_ANY
QUIT_CHANGE_OPTIONS:
RET
CONFIG_WHAT:
LDI ZH, HIGH(USER_PC_CHANGE_OPTIONS_STR6*2) ;Enter what to configure?(1 = Name, 2 = Contact):
LDI ZL, LOW(USER_PC_CHANGE_OPTIONS_STR6*2)
RCALL TRANSMIT_LOOP
RCALL GET_KEY_ENTERED
CPI TEMP, '1'
BREQ CONFIG_USER_NAME
CPI TEMP, '2'
BREQ CONFIG_USER_CONTACT
RCALL USER_INPUT_ERROR
RJMP CONFIG_WHAT
CONFIG_USER_NAME:
RCALL ADD_USER_NAME
RJMP QUIT_CONFIG_WHAT
CONFIG_USER_CONTACT:
LDI TEMP, 24
ADD EADD_LOW, TEMP
RCALL ADD_USER_CONTACT
RJMP QUIT_CONFIG_WHAT
QUIT_CONFIG_WHAT:
LDI ZH, HIGH(USER_PC_CHANGE_OPTIONS_STR5*2) ;Successfully Configured
LDI ZL, LOW(USER_PC_CHANGE_OPTIONS_STR5*2)
RCALL TRANSMIT_LOOP
RET
;---------------------------------------------------------
; BUZZER CONFIGURATION ROUTINE
BUZZER_OPTIONS:
RCALL BREAK_UP_LINE
LDI ZH, HIGH(USER_PC_BUZZER_OPTIONS_STR*2)
LDI ZL, LOW(USER_PC_BUZZER_OPTIONS_STR*2)
RCALL TRANSMIT_LOOP
CLR EADD_HIGH
LDI EADD_LOW, USER_BUZZER_BYTE
RCALL EEPROM_READ
CPI EEPROM_DATA, '0'
BREQ BUZZER_IS_OFF
LDI TEMP, 'O'
RCALL TRANSMIT
LDI TEMP, 'N'
RCALL TRANSMIT
RJMP GET_BUZZER_INPUT_READY
BUZZER_IS_OFF:
LDI TEMP, 'O'
RCALL TRANSMIT
LDI TEMP, 'F'
RCALL TRANSMIT
LDI TEMP, 'F'
RCALL TRANSMIT
RJMP GET_BUZZER_INPUT_READY
GET_BUZZER_INPUT_READY:
LDI ZH, HIGH(USER_PC_BUZZER_OPTIONS_STR2*2)
LDI ZL, LOW(USER_PC_BUZZER_OPTIONS_STR2*2)
RCALL TRANSMIT_LOOP
RCALL GET_KEY_ENTERED
CPI TEMP, '0'
BREQ SAVE_BUZZER_STATUS
CPI TEMP, '1'
BREQ SAVE_BUZZER_STATUS
RJMP GET_BUZZER_INPUT_READY
SAVE_BUZZER_STATUS:
MOV EEPROM_DATA, TEMP
LDI EADD_LOW, USER_BUZZER_BYTE
RCALL EEPROM_WRITE
RCALL DELAY_SHORT
LDI ZH, HIGH(USER_PC_BUZZER_OPTIONS_STR3*2)
LDI ZL, LOW(USER_PC_BUZZER_OPTIONS_STR3*2)
RCALL TRANSMIT_LOOP
RCALL DELAY_SHORT
RJMP QUIT_BUZZER_OPTIONS
QUIT_BUZZER_OPTIONS:
RCALL BREAK_UP_LINE
RCALL SET_ACTIVE_DEFAULTS
RCALL BUZZER
RCALL DELAY_SHORT
RCALL BUZZER
RET
;---------------------------------------------------------
; ADMINISTRATOR'S PASSWORD CONFIGURATION ROUTINE
CONFIG_PASSWORD:
RCALL BREAK_UP_LINE
CLT
LDI ZH, HIGH(USER_PC_PASSWORD_OPTIONS_STR*2) ;
LDI ZL, LOW(USER_PC_PASSWORD_OPTIONS_STR*2)
RCALL TRANSMIT_LOOP
RCALL PASSWORD_ENTER
BRTC INVALID_PASSWORD_ENTERED
RETRY_OPTIONS:
LDI ZH, HIGH(USER_PC_PASSWORD_OPTIONS_STR2*2)
LDI ZL, LOW(USER_PC_PASSWORD_OPTIONS_STR2*2)
RCALL TRANSMIT_LOOP
CLR XH
LDI XL, LOW(201)
CLR COUNT_IT
GET_NEW_PASSWORD:
SBIS UCSRA, RXC
RJMP GET_NEW_PASSWORD
IN USART_DATA, UDR
CPI USART_DATA, 0X0D
BREQ NEW_PASSWORD_LOAD
CPI USART_DATA, 0X08
BREQ GET_PASSWORD_BACKSPACE
ST X+, USART_DATA
LDI TEMP, '*'
RCALL TRANSMIT
INC COUNT_IT
RJMP GET_NEW_PASSWORD
GET_PASSWORD_BACKSPACE:
DEC XL
DEC COUNT_IT
MOV TEMP, USART_DATA
RCALL TRANSMIT
RJMP GET_NEW_PASSWORD
NEW_PASSWORD_LOAD:
LDI TEMP, 0X00
ST X, TEMP
CPI COUNT_IT, 9
BRSH NEW_PASSWORD_ERROR
LDI XL, LOW(201)
CLR EADD_HIGH
LDI EADD_LOW, USER_PASSWORD_AREA
LDI EEPROM_DATA, '1'
RCALL EEPROM_WRITE
INC EADD_LOW
SAVE_NEW_PASSWORD:
LD EEPROM_DATA, X+
RCALL EEPROM_WRITE
NOP
NOP
INC EADD_LOW
DEC COUNT_IT
CPI COUNT_IT, 0X00
BREQ SAVED_NEW_PASSWORD
RJMP SAVE_NEW_PASSWORD
SAVED_NEW_PASSWORD:
LDI EEPROM_DATA, 0X00
RCALL EEPROM_WRITE
LDI ZH, HIGH(USER_PC_PASSWORD_OPTIONS_STR5*2)
LDI ZL, LOW(USER_PC_PASSWORD_OPTIONS_STR5*2)
RCALL TRANSMIT_LOOP
RJMP QUIT_CONFIG_PASSWORD
INVALID_PASSWORD_ENTERED:
CLT
RCALL INVALID_USER
BRTS CONFIG_PASSWORD
BRTC QUIT_CONFIG_PASSWORD
NEW_PASSWORD_ERROR:
CLT
CLR TEMP
LDI ZH, HIGH(USER_PC_PASSWORD_OPTIONS_STR4*2)
LDI ZL, LOW(USER_PC_PASSWORD_OPTIONS_STR4*2)
RCALL TRANSMIT_LOOP
RJMP RETRY_PASSWORD
RETRY_PASSWORD:
LDI ZH, HIGH(USER_INVALID_STR2*2)
LDI ZL, LOW(USER_INVALID_STR2*2)
RCALL TRANSMIT_LOOP
RCALL GET_KEY_ENTERED
RETRY_LEAVE:
LDI ZH, HIGH(USER_PC_PASSWORD_OPTIONS_STR6*2)
LDI ZL, LOW(USER_PC_PASSWORD_OPTIONS_STR6*2)
RCALL TRANSMIT_LOOP
RJMP QUIT_CONFIG_PASSWORD
QUIT_CONFIG_PASSWORD:
RCALL BREAK_UP_LINE
CLT
RET
;---------------------------------------------------------
; LOCK SWITCHE OPTIONS ROUTINE
LOCK_OPTIONS:
RCALL BREAK_UP_LINE
LDI ZH, HIGH(USER_PC_LOCK_SWITCHES_STR*2)
LDI ZL, LOW(USER_PC_LOCK_SWITCHES_STR*2)
RCALL TRANSMIT_LOOP
ASK_FOR_LOCK:
RCALL CURRENT_LOCKED_SWITCHES
LDI ZH, HIGH(USER_PC_LOCK_SWITCHES_STR3*2)
LDI ZL, LOW(USER_PC_LOCK_SWITCHES_STR3*2)
RCALL TRANSMIT_LOOP
RCALL GET_KEY_ENTERED
CPI TEMP, 'y'
BREQ ASK_FOR_LOCK_GO
CPI TEMP, 'Y'
BREQ ASK_FOR_LOCK_GO
CPI TEMP, 'n'
BREQ QUIT_LOCK_OPTIONS
CPI TEMP, 'N'
BREQ QUIT_LOCK_OPTIONS
RCALL USER_INPUT_ERROR
RJMP ASK_FOR_LOCK
ASK_FOR_LOCK_GO:
RCALL SET_LOCK_SWITCH
RJMP ASK_FOR_LOCK
QUIT_LOCK_OPTIONS:
RCALL BREAK_UP_LINE
RET
CURRENT_LOCKED_SWITCHES:
CLR EADD_HIGH
LDI EADD_LOW, USER_DEVICE_LOCK_BYTE
RCALL EEPROM_READ
CPI EEPROM_DATA, 0X00
BREQ NO_SWITCH_LOCKED
LDI ZH, HIGH(USER_PC_LOCK_SWITCHES_STR2*2)
LDI ZL, LOW(USER_PC_LOCK_SWITCHES_STR2*2)
RCALL TRANSMIT_LOOP
LDI COUNT_IT, 1
CLC
RJMP CHECK_LOCKED_SWITCHES
NO_SWITCH_LOCKED:
LDI ZH, HIGH(USER_PC_LOCK_SWITCHES_STRN*2)
LDI ZL, LOW(USER_PC_LOCK_SWITCHES_STRN*2)
RCALL TRANSMIT_LOOP
RJMP QUIT_CURRENT_LOCKED_SWITCHES
CHECK_SWITCHES_STATUS: ; USED FOR CHECKING SWITCHES AS WELL
CHECK_LOCKED_SWITCHES:
SBRC EEPROM_DATA, 0
RCALL DISPLAY_LOCKED_SWITCH
INC COUNT_IT
CPI COUNT_IT, 9
BREQ QUIT_CURRENT_LOCKED_SWITCHES
ROR EEPROM_DATA
RJMP CHECK_LOCKED_SWITCHES
QUIT_CURRENT_LOCKED_SWITCHES:
RET
DISPLAY_LOCKED_SWITCH:
CLR TEMP
LDI R24, 0X30
ADD R24, COUNT_IT
MOV TEMP, R24
RCALL TRANSMIT
LDI TEMP, ','
RCALL TRANSMIT
LDI TEMP, ' '
RCALL TRANSMIT
WAIT
RET
SET_LOCK_SWITCH:
LDI ZH, HIGH(USER_PC_LOCK_SWITCHES_STR4*2)
LDI ZL, LOW(USER_PC_LOCK_SWITCHES_STR4*2)
RCALL TRANSMIT_LOOP
RCALL GET_KEY_ENTERED
CPI TEMP, '1'
BREQ SET_FOR_SWITCH_1
CPI TEMP, '2'
BREQ SET_FOR_SWITCH_2
CPI TEMP, '3'
BREQ SET_FOR_SWITCH_3
CPI TEMP, '4'
BREQ SET_FOR_SWITCH_4
CPI TEMP, '5'
BREQ SET_FOR_SWITCH_5
CPI TEMP, '6'
BREQ SET_FOR_SWITCH_6
CPI TEMP, '7'
BREQ SET_FOR_SWITCH_7
CPI TEMP, '8'
BREQ SET_FOR_SWITCH_8
RCALL USER_INPUT_ERROR
RJMP SET_LOCK_SWITCH
SET_FOR_SWITCH_1:
LDI R25, 0B00000001
LDI R24, 0B11111110
RCALL GET_STATUS_SET
RJMP BACK_LOCK_SWITCH
SET_FOR_SWITCH_2:
LDI R25, 0B00000010
LDI R24, 0B11111101
RCALL GET_STATUS_SET
RJMP BACK_LOCK_SWITCH
SET_FOR_SWITCH_3:
LDI R25, 0B00000100
LDI R24, 0B11111011
RCALL GET_STATUS_SET
RJMP BACK_LOCK_SWITCH
SET_FOR_SWITCH_4:
LDI R25, 0B00001000
LDI R24, 0B11110111
RCALL GET_STATUS_SET
RJMP BACK_LOCK_SWITCH
SET_FOR_SWITCH_5:
LDI R25, 0B00010000
LDI R24, 0B11101111
RCALL GET_STATUS_SET
RJMP BACK_LOCK_SWITCH
SET_FOR_SWITCH_6:
LDI R25, 0B00100000
LDI R24, 0B11011111
RCALL GET_STATUS_SET
RJMP BACK_LOCK_SWITCH
SET_FOR_SWITCH_7:
LDI R25, 0B01000000
LDI R24, 0B10111111
RCALL GET_STATUS_SET
RJMP BACK_LOCK_SWITCH
SET_FOR_SWITCH_8:
LDI R25, 0B10000000
LDI R24, 0B01111111
RCALL GET_STATUS_SET
RJMP BACK_LOCK_SWITCH
BACK_LOCK_SWITCH:
RET
GET_STATUS_SET:
CLR EADD_HIGH
LDI EADD_LOW, USER_DEVICE_LOCK_BYTE
RCALL EEPROM_READ
BACK_STATUS_TO_SET:
LDI ZH, HIGH(USER_PC_LOCK_SWITCHES_STR5*2)
LDI ZL, LOW(USER_PC_LOCK_SWITCHES_STR5*2)
RCALL TRANSMIT_LOOP
RCALL GET_KEY_ENTERED
CPI TEMP, '0'
BREQ SET_IT_UNLOCKED
CPI TEMP, '1'
BREQ SET_IT_LOCKED
RCALL USER_INPUT_ERROR
RJMP BACK_STATUS_TO_SET
SET_IT_UNLOCKED:
MOV TEMP, EEPROM_DATA
AND TEMP, R24
MOV EEPROM_DATA, TEMP
RJMP QUIT_GET_STATUS_TO_SET
SET_IT_LOCKED:
MOV TEMP, EEPROM_DATA
OR TEMP, R25
MOV EEPROM_DATA, TEMP
RJMP QUIT_GET_STATUS_TO_SET
QUIT_GET_STATUS_TO_SET:
RCALL EEPROM_WRITE
LDI ZH, HIGH(USER_PC_LOCK_SWITCHES_STR6*2)
LDI ZL, LOW(USER_PC_LOCK_SWITCHES_STR6*2)
RCALL TRANSMIT_LOOP
WAIT
RET
;---------------------------------------------------------
; USERS INFORMATION ROUTINE
USERS_INFORMATION:
LDI ZH, HIGH(USER_PC_USERS_INFO_STR*2)
LDI ZL, LOW(USER_PC_USERS_INFO_STR*2)
RCALL TRANSMIT_LOOP
RCALL USER_INFORMATION_1
LDI EADD_LOW, USER_STATUS_BYTE
RCALL EEPROM_READ
MOV R24, EEPROM_DATA
SBRS R24, 2
RJMP THIRD_USER_INFO
RCALL USER_INFORMATION_2
THIRD_USER_INFO:
SBRC R24, 3
RCALL USER_INFORMATION_3
RJMP QUIT_USER_INFORMATION
RJMP QUIT_USER_INFORMATION
QUIT_USER_INFORMATION:
RCALL BREAK_UP_LINE
RET
USER_INFORMATION_1:
LDI ZH, HIGH(USER_PC_USERS_INFO_STR1*2)
LDI ZL, LOW(USER_PC_USERS_INFO_STR1*2)
RCALL TRANSMIT_LOOP
CLR EADD_HIGH
LDI EADD_LOW, USER_NAME_AREA1
LDI COUNT_IT, 20
RCALL DISPLAY_IT_FROM_EEPROM
LDI EADD_LOW, USER_CONTACT_AREA1
LDI COUNT_IT, 14
RCALL DISPLAY_IT_FROM_EEPROM
LDI ZH, HIGH(USER_PC_USERS_INFO_STRD*2)
LDI ZL, LOW(USER_PC_USERS_INFO_STRD*2)
RCALL TRANSMIT_LOOP
RET
USER_INFORMATION_2:
LDI ZH, HIGH(USER_PC_USERS_INFO_STR2*2)
LDI ZL, LOW(USER_PC_USERS_INFO_STR2*2)
RCALL TRANSMIT_LOOP
LDI EADD_LOW, USER_NAME_AREA2
LDI COUNT_IT, 20
RCALL DISPLAY_IT_FROM_EEPROM
LDI EADD_LOW, USER_CONTACT_AREA2
LDI COUNT_IT, 14
RCALL DISPLAY_IT_FROM_EEPROM
RET
USER_INFORMATION_3:
LDI ZH, HIGH(USER_PC_USERS_INFO_STR3*2)
LDI ZL, LOW(USER_PC_USERS_INFO_STR3*2)
RCALL TRANSMIT_LOOP
LDI EADD_LOW, USER_NAME_AREA3
LDI COUNT_IT, 20
RCALL DISPLAY_IT_FROM_EEPROM
LDI EADD_LOW, USER_CONTACT_AREA3
LDI COUNT_IT, 14
RCALL DISPLAY_IT_FROM_EEPROM
RET
DISPLAY_IT_FROM_EEPROM:
INC EADD_LOW
RCALL EEPROM_READ
CPI EEPROM_DATA, 0X00
BREQ FILL_UP_SPACE
DEC COUNT_IT
MOV TEMP, EEPROM_DATA
RCALL TRANSMIT
RJMP DISPLAY_IT_FROM_EEPROM
FILL_UP_SPACE:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -