📄 voting.a51
字号:
IPFRMBU EQU P2 ;I/P FROM BALLOT UNIT(I/P CONFIGURED)
;HEXPAD PORT DEFINITIONS
RW1 EQU P2.4 ;row1 declared for keypad
RW2 EQU P2.5 ;row2 declared for keypad
RW3 EQU P2.6 ;row3 declared for keypad
RW4 EQU P2.7 ;row4 declared for keypad
CL1 EQU P3.4 ;column1 declared for keypad
CL2 EQU P3.5 ;column2 declared for keypad
CL3 EQU P3.6 ;column3 declared for keypad
CL4 EQU P3.7 ;column4 declared for keypad
;LCD PORT DEFINITIONS
DATAPORT EQU P0
EN EQU P1.2
RW EQU P1.1
RS EQU P1.0
DE EQU 0FFH ;(WHERE IS IT USED???)
D7 EQU P0.7
RDYSGN EQU P1.4 ;THIS PIN SENDS SIGNAL TO BU TO GLOW MACHINE READY LED(O/P CONFIGURED)
VOTSNL EQU P1.5 ;THIS PIN SENDS SIGNAL TO BU TO GLOW VOTE CASTED LED(O/P CONFIGURED)
STATLD EQU P3.1 ;THIS PIN IS SET TO GLOW STATUS LED(O/P CONFIGURED)
MCONBTN EQU P3.0 ;THIS PIN IS SET OR CLEARED ACCORDING TO MANUAL CONTROL BUTTON PRESSED OR NOT(I/P CONFIGURED)
RESBUT EQU P1.3 ;THIS PIN BECOMES LOW WHEN RESULT BUTTON IS PRESSED
DIG5 EQU 70h
DIG4 EQU 71h
DIG3 EQU 72h
DIG2 EQU 73h
DIG1 EQU 74h
TOTALLB EQU 76h
TOTALHB EQU 77h
MEM EQU 45h ;TO BRING EACH CHAR OF ENTERED PASSWORD ONE BY ONE
STATUS EQU 47h ;TO ENSURE POLL-RESULT-POLL SEQUENCE
COUNT EQU 49h
MODE EQU 60h ;SAVES D SELECTED MODE'S HEX VALUE
CCODE EQU 79h ;TO SAVE CANDIDATE'S CODE OBTINED FRM BU
;EEPROM PORT DEFINITIONS ETC.
SDA1 EQU P1.6
SCL1 EQU P1.7
WTCMD EQU 10100000B ;WRITE DATA COMMAND
RDCMD EQU 10100001B ;READ DATA COMMAND
HBADD EQU 7Eh
MEMORY EQU 7Fh
ORG 0000h
LJMP MAIN
ORG 0003h
LJMP CLOSE
ORG 0013h
LJMP TOTAL
MAIN: ;***************************MAIN*******************
SETB RESBUT
SETB STATLD
MOV DATAPORT,#0FFH
ACALL LCD216 ;LCD INITIALISATION
ACALL LCDCLR
ACALL RETHOME
ACALL DONCOFF ;LCD INITIALISED
LCALL STATREAD
MOV A,STATUS
CJNE A,#00h,LABEL1
JMP LABEL2
LABEL1:LJMP RESULT
LABEL2:LCALL EVM_LCD1 ;DISPLAYS "VOTING MODE"
LCALL DELAY_5SEC
LCALL PASSWORDDETECT
INITIALIZEM: ;INITIALIZING MEMORY LOCATIONS(USED FOR STORING TOTAL NO.OF VOTES OF EACH CANDIDATE) TO '0'
;MEMORY LOCATIONS 32, 33 ARE FOR CANDIDATE1'S VOTE COUNT
;AND 34,35 ARE FOR CANDIDATE2'S VOTE COUNT AND SO ON....
MOV R0,#32h
MOV R2,#10h
LABEL3:
MOV @R0,#00h
INC R0
DJNZ R2,LABEL3
MOV TOTALLB,#00h ;INITIALISING TOTAL VOTE COUNT TO ZERO
MOV TOTALHB,#00h
ACALL MEMORYINIT
ACALL MEMINIT
MOV IE,#85h ;ENABLING BOTH 'CLOSE' AND 'TOTAL' INTERRUPT
MACFREE: ;MACHINE IS FREE TO ACCEPT NEW CODE FRM BU AT DIS PT.
;SETB VOTSNL
CLR STATLD ;TO GLOW SATUS LED FOR THE VERY FIRST TIME
SETB RDYSGN ;CONFIGURING AS O/P
SETB MCONBTN ;CONFIGURING AS I/P
JB MCONBTN,$
SETB STATLD ;WAIT TILL MANUAL CONTROL BUTTON IS PRESSED
CLR RDYSGN ;WHEN PRESSED, SEND SIGNAL TO BU TO SWITCH
;ON ITS MACHINE READY LED
NOP
SETB RDYSGN
MOV IPFRMBU,#0FFh ;CONFIGURING PORT
;REFRESH: ;CLEAR THE PORT (INTERFACED WITH BU) FROM
;THE PREVIOUS CODE OBTAINED FRM BU
; MOV A,IPFRMBU
; ANL A,#00001111b
; CJNE A,#00h,REFRESH
START: ;POLLING PROGRAM TO DETECT THE CODE FROM BU
;MOV IPFRMBU,#0FFh ;CONFIGURING PORT AS I/P
MOV A,IPFRMBU
ANL A,#00001111b
CJNE A,#0Fh,START1
JMP START
START1: MOV A,IPFRMBU
ANL A,#00001111b
CJNE A,#09h,VALID
CLR VOTSNL
NOP
SETB VOTSNL
JMP MACFREE
VALID: ;*******INCREMENTING VOTE(INDIVIDUAL & TOTAL) AND WRITING IT TO EEPROM*******
MOV CCODE,A
MOV R2,TOTALLB
CJNE R2,#0FFh,LABEL11 ;TOTAL VOTE COUNT SHUD B INCREMENTED AS
INC TOTALHB ;SOON AS WE GET CONFIRMED DAT A VALID
MOV TOTALLB,#00h ;VOTE HAS BEEN CASTED
JMP LABEL12
LABEL11:
INC TOTALLB
LABEL12:
LCALL TOTALWRITE
MOV R0,#30h ;INITIALISING MEMORY LOCATION TO 30h
MOV B,#02h ;AS 2 BYTES ARE RESERVED TO STORE VOTE
;COUNT OF EACH CANDIDATE
MOV A,CCODE
MUL AB
ADD A,R0
MOV R0,A
MOV A,@R0
CJNE A,#0FFh,INCRM
INC R0
MOV A,@R0
INC A
MOV @R0,A
DEC R0
MOV @R0,#00h
JMP COMP
INCRM:
INC A
MOV @R0,A
COMP:
CLR VOTSNL
;ACALL DELAY_5SEC
NOP
SETB VOTSNL
LCALL VOTEWRITE
LJMP MACFREE
RESULT: ;*******************************RESULT ROUTINE *************************
LCALL EVM_LCD5 ;DISPLAY "RESULT MODE"
LCALL DELAY_5SEC
LCALL PASSWORDDETECT
MOV IE,#84h ;ENABLING 'TOTAL' INTERRUPT ONLY, AND DISABLING
;'CLOSE' INTERRUPT
MOV COUNT,#00h
LCALL VOTEREAD
LCALL STATWRITE0
LABEL14:
MOV R0,#32h
MOV A,COUNT
MOV B,#02h
MUL AB
ADD A,R0
MOV R0,A
MOV A,@R0
MOV R2,A ;LOWER BYTE
INC R0
MOV A,@R0
MOV R1,A ;HIGHER BYTE
ACALL CONVERSION
;LCD MODULE
ACALL LCDCLR
ACALL FCBFL
ACALL COMMAND
ACALL EVM_LCDO
ACALL DELAY_5SEC
JB RESBUT,$
INC COUNT
MOV A,COUNT
CJNE A,#08h,LABEL14
MOV COUNT,#00h
JMP LABEL14
;LCD ROUTINES
EVM_LCDO:
MOV DPTR,#TABLE1O
MOV A,COUNT
CLR C
MOV B,#0Ch
MUL AB
ADD A,DPL
MOV DPL,A
MOV A,#00h
ADDC A,DPH
MOV DPH,A
ACALL WRITE1O
ACALL FCBSL
ACALL COMMAND
MOV DPTR,#TABLE2O
ACALL WRITE2O
RET
WRITE1O:
CLR A
MOVC A,@A+DPTR
JZ BACK2O
ACALL DISPLAY
INC DPTR
SJMP WRITE1O
BACK2O: RET
TABLE1O:
DB 'CANDIDATE 1',0
DB 'CANDIDATE 2',0
DB 'CANDIDATE 3',0
DB 'CANDIDATE 4',0
DB 'CANDIDATE 5',0
DB 'CANDIDATE 6',0
DB 'CANDIDATE 7',0
DB 'CANDIDATE 8',0
WRITE2O:
CLR A
MOVC A,@A+DPTR
JZ BACK3O
ACALL DISPLAY
INC DPTR
SJMP WRITE2O
BACK3O:
ACALL BACK3
RET
TABLE2O: DB 'VOTES: ',0
;********************************** CLOSE ROUTINE *************************************
CLOSE :
;INITIALIZING MEMORY LOCATIONS(USED FOR STORING TOTAL NO.OF VOTES OF EACH CANDIDATE)
;TO '0' MEMORY LOCATIONS 32, 33 ARE FOR CANDIDATE1'S VOTE COUNT AND 34,35 ARE FOR
;CANDIDATE2'S VOTE COUNT AND SO ON....
SETB STATLD
LCALL STATWRITE1
MOV A,PCON
ORL A,#02h
MOV PCON,A
RETI
;*********************************TOTAL ROUTINE **********************************
TOTAL:
LCALL TOTALREAD
MOV R2,TOTALLB
MOV R1,TOTALHB
LCALL CONVERSION
;LCD MODULE
MOV DATAPORT,#0FFH
ACALL LCD216 ;LCD INITIALISATION
ACALL LCDCLR
ACALL RETHOME
ACALL DONCOFF
ACALL LCDCLR
ACALL FCBFL
ACALL COMMAND
ACALL EVM_LCDT
RETI
EVM_LCDT:
MOV DPTR,#TABLE1T
ACALL WRITE
ACALL FCBSL
ACALL COMMAND
MOV DPTR,#TABLE2T
ACALL WRITE2T
RET
TABLE1T:
DB 'TOTAL NO. OF',0
WRITE2T:
CLR A
MOVC A,@A+DPTR
JZ BACK3T
ACALL DISPLAY
INC DPTR
SJMP WRITE2T
BACK3T:
ACALL BACK3 ;BACK3 DISPLAYS D DECIMAL NUMBER SATORED AT DIG5,DIG4, ...DIG0
RET
TABLE2T: DB 'VOTES: ',0
;***************PASSWORD DETECTION**********************************
PASSWORDDETECT:
LCALL EVM_LCD2 ;DISPLAYS "ENTER PASSWORD ......"
INITIALIZEP: ;INITIALIZING MEMORY LOCATIONS(USED FOR STORING THE
;PASSWORD ACCEPTED FROM THE USER,ie, OFFICER IN CHARGE)
MOV R0,#50h
MOV R2,#06h
LABEL4:
MOV @R0,#00h
INC R0
DJNZ R2,LABEL4
MOV R0,#50h
MOV R2,#06h
KEYCALL: LCALL KEYDETECTION
MOV @R0,A
INC R0
CJNE R2,#06h,LCD1
;***LCD MODULE TO DISPLAY '*' WHENEVER A KEY IS PRESSED TO ENTER PASSWORD***
;MOV DATAPORT,#0FFH
;ACALL LCD216 ; LCD INITIALISATION
;ACALL LCDCLR
;ACALL RETHOME
;ACALL DONCB ; LCD INITIALISED
ACALL LCDCLR
ACALL FCBFL
ACALL COMMAND
LCD1:
MOV DPTR,#TABLE1
ACALL WRITE
TABLE1: DB '*',0
DEC R2
CJNE R2,#00h,KEYCALL
;**********COMPARING ALREADY STORE PASSWORD AND ENTERED PASSWORD*********
;CHECK STATUS VALUE HERE AGAIN, IF IT IS '1'(MEANS WE ARE WORKING IN RESULT MODE)
; THEN USE"MOV DPTR,#LIST1R" AND IF IT IS '0'(MEANS WE ARE WORKING IN VOTING MODE)
; THEN USE"MOV DPTR,#LIST1V"
MOV R0,#50h
MOV R3,#06h
MOV A,STATUS
CJNE A,#00h,RESLT
MOV DPTR,#LIST1V
JMP COMMON
RESLT: MOV DPTR,#LIST1R ;LIST1 POINTS TO PASSWORD OF VOTING MODE
COMMON:
CHECKING:
MOV MEM,@R0
MOV A,#00h
MOVC A,@A+DPTR
CJNE A,MEM,INCORRECT
INC R0
INC DPTR
DJNZ R3,CHECKING
JMP CORRECT
INCORRECT:
LCALL EVM_LCD3 ;DISPLAYS "WRONG PASSWORD"
ACALL DELAY_5SEC
LJMP PASSWORDDETECT
CORRECT:
LCALL EVM_LCD4 ;DISPLAY "PASSWORD ACCEPTED & PROCEED AHEAD"
RET ;TO RETURN FROM PASSWORD DETECTION
LIST1V: DB '0','1','2','3','4','5' ;PASSWORD OF VOTING MODE
LIST1R: DB '6','7','8','9','A','B' ;PASSWORD OF RESULT MODE
;*********PASSWORD DETECTION ENDS HERE****************
;*************************HEX TO DECIMAL CONVERSION*******************************
CONVERSION:
MOV R3,#00D
MOV R4,#00D
MOV R5,#00D
MOV R6,#00D
MOV R7,#00D
MOV B,#10D
MOV A,R2
DIV AB
MOV R3,B
MOV B,#10 ;R7,R6,R5,R4,R3
DIV AB
MOV R4,B
MOV R5,A
CJNE R1,#0H,HIGH_BYTE ;CHECK FOR HIGH BYTE
SJMP ENDD
HIGH_BYTE:
MOV A,#6
ADD A,R3
MOV B,#10
DIV AB
MOV R3,B
ADD A,#5
ADD A,R4
MOV B,#10
DIV AB
MOV R4,B
ADD A,#2
ADD A,R5
MOV B,#10
DIV AB
MOV R5,B
CJNE R6,#00D,ADD_IT
SJMP CONTINUE
ADD_IT:
ADD A,R6
CONTINUE:
MOV R6,A
DJNZ R1,HIGH_BYTE
MOV B,#10D
MOV A,R6
DIV AB
MOV R6,B
MOV R7,A
ENDD:
MOV A,#30h
ADD A,R7
MOV DIG5,A
MOV A,#30h
ADD A,R6
MOV DIG4,A
MOV A,#30h
ADD A,R5
MOV DIG3,A
MOV A,#30h
ADD A,R4
MOV DIG2,A
MOV A,#30h
ADD A,R3
MOV DIG1,A
RET ;TO RETURN FROM HEX TO BCD CONVERSION
;***********HEX TO BCD CONVERSION ENDS HERE******************
;****************************** 5 SEC DELAY ROUTINE*************************
DELAY_5SEC:
MOV R1,#05h
AGAIN2:MOV R2,#0FFh
AGAIN1:MOV R7,#0FFh
DJNZ R7,$
DJNZ R2,AGAIN1
DJNZ R1, AGAIN2
RET
;*********DELAY_5SEC ENDS HERE*****************
;*************************KEYDETECTION MODULE*************************
KEYDETECTION:
CLR RW1 ;configuring rows for o/p
CLR RW2
CLR RW3
CLR RW4
SETB CL1 ;configuring columns for i/p
SETB CL2
SETB CL3
SETB CL4
RELEASE: ;TO CHECK WHETHER THE KEY IS STILL PRESSED OR RELEASED
CLR RW1
CLR RW2
CLR RW3
CLR RW4
JNB CL1, RELEASE
JNB CL2, RELEASE
JNB CL3, RELEASE
JNB CL4, RELEASE
AJMP STARTING
STARTING: ;TO CHECK WHETHER A KEY IS PRESSED
ACALL DELAY
JNB CL1, DEBOUNCE
JNB CL2, DEBOUNCE
JNB CL3, DEBOUNCE
JNB CL4, DEBOUNCE
JMP STARTING
DEBOUNCE: ;TO CHECK WHETHER KEY IS ACTUALLY PRESSED & IT IS NOT DEBOUNCE
ACALL DELAY
JNB CL1, OVER
JNB CL2, OVER
JNB CL3, OVER
JNB CL4, OVER
JMP STARTING
OVER:
CLR RW1
SETB RW2
SETB RW3
SETB RW4
JNB CL1, ROW1
JNB CL2, ROW1
JNB CL3, ROW1
JNB CL4, ROW1
SETB RW1
CLR RW2
SETB RW3
SETB RW4
JNB CL1, ROW2
JNB CL2, ROW2
JNB CL3, ROW2
JNB CL4, ROW2
SETB RW1
SETB RW2
CLR RW3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -