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

📄 voting.a51

📁 8051单片机 a51 投票器 带控制端 含原理图
💻 A51
📖 第 1 页 / 共 3 页
字号:
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 + -