$mod52
;*******************************************************
;	DC Motor Cotrol : MCS-51
;	MCU : AT89C1051
;*******************************************************

	COM1	    BIT P3.7
	COM2	    BIT P1.0
	SDA	    BIT P3.4
	SCL	    BIT P3.3
	LED_PWM	    BIT P3.5
	SW_PWM_DOWN BIT P3.1
	SW_PWM_UP   BIT P3.0
	SW_LR	    BIT P3.4
	PWM	    EQU 09
	I2C_DATA    EQU 10
	BUF_SEG1    EQU 11
	BUF_SEG2    EQU 12
	DELAY_SEG   EQU 13
	SS200US	    EQU 14
	OUTPUT	    EQU 15
	EEPROM_CODE EQU 10100000B
;*******************************************************
;	MAIN PROGRAM
;*******************************************************
	
	ORG	0000H
	MOV	SP,#07H
	MOV	P1,#11111111B
	MOV	P3,#11111111B
	LCALL	DELAY_100MS
	LCALL	READ_EEPROM
	
START:	MOV	R4,PWM
Z1:	LCALL	CONVERT
	LCALL	DISPLAY
	LCALL	PWM_MODE
Z2:	JB	PWM_DOWN,Z3
	LCALL	MODE_PWM_DOWN
Z3:	JB	PWM_UP,Z1
	LCALL	MODE_PWM_UP
Z4:	JB	SW_LR,Z1
	SJMP

;********************************************************
;	PWM MODE
;********************************************************

MODE_PWM_UP: PUSH AC
	MOVE	A,PWM
	CJNE	A,#60H,PW1
	SJMP	PW2
	PW1:INC	PWM
	MOV	A,PWM
	ADD	A,#00
	DA	A
	MOV	PWM,A
	PW2:MOV	R4,A
	LCALL	SCAN_WAIT
	LCALL	WRITE_EEPROM
	POP	ACC
	RET

MODE_PWM_DOWN:PUSH   ACC
	MOV	A,PWM
	CJNE	A,#00H,PW3
	SJMP	PW6
	PW3:DEC	PWM
	MOV	A,PWM
	ANL	A,#0FH
	CJNE	A,#0FH,PW4
	PW4:MOV	A,PWM
	JC	PW5
	ADD	A,#10H
	SUBB	A,#10H
	PW5:MOV	PWM,A
	PW6:MOV	R4,A
	LCALL	SCAN-WAIT
	LCALL	WRITE_EEPROM
	POP	ACC
	RET

MODE_LR:CLR	LED_PWM
	LCALL	DELAY_1S
	CPL	P3.2
	LCALL	DELAY_1S
	RET

SCAN_WAOT:MOV	R3,#90
	LCALL	CONVERT
	QW:LCALL DIAPLAY
	LCALL	PWM_MODE
	DJNZ	R3,QW
	RET

TABLE_SEGMENT:DB  01111111B ;0
	DB	00001101B ;1
	DB	10110111B ;2
	DB	10011111B ;3
	DB	11001101B ;4
	DB	11011011B ;5
	DB	11111011B ;6
	DB	00001111B ;7
	DB	11111111B ;8
	DB	11011111B ;9

CONVERT:PUSH  ACC
	MOV	A,R4
	SWAP	A
	ANL	A,#0FH
	MOV	DPTR,#TABLE_SEGMENT
	MOVC	A,@A+DPTR
	MOV	BUF_SEG2,A
	MOV	A,R4
	ANL	A,#0FH
	MOV	DPTR,#TABLE_SEGMENT
	MOVC	A,@A+DPTR
	MOV	BUF_SEG2,A
	POP	ACC
	RET

DISPLAY:MOV  P1,BUF_SEG1
	CLR	COM1
	LCALL	DELAY_SEGMENT
	SETB	COM1
	MOV	P1,BUF_SEG2
	CLR	COM2
	LCALL	DELAY_SEGMENT
	SETB	COM2
	RET

DELAY_SEGENT:MOV  DELAY_SEG,#00H
	DJNZ	DELAY_SEG,$
	RET

WRITE_EEPROM:LCALL I2C_START
	MOV	I2C_DATA,#EEPROM_CODE1
	LCALL	I2C_WR
	MOV	I2C_DATA,#00H
	LCALL	I2C_WR
	MOV	I2C_DATA,PWM
	LCALL	I2C_WR
	LCALL	I2C_STOP
	RET

READ_EEPROM:LCALL  I2C_START
	MOV	I2C_DATA,#EEPROM_CODE1
	LCALL	I2C_WR
	MOV	I2C_DATA,#00H
	LCALL	I2C_WR
	LCALL	EEPROM_RD1
	MOV	PWM,I2C_DATA
	RET

I2C_WR:PUSH	ACC
	MOV	A,I2C_DATA
	MOV	R5,#08
I2C_WR_1:RLC	A
	MOV	SDA,C
	LCALL	I2C_DELAY
	DJNZ	R5,I2C_WR_1
	SETB	SDA
	LCALL	I2C_DELAY
	SETB	SCL
	LCALL	I2C_DELAY
	JB	SDA,I2C_WR_2
I2C_WR_2:CLR	SCL
	POP	ACC
	RET

I2C_RD:PUSH	ACC
	CLR	A
	MOV	R5,#08
I2C_RD_1:ACALL	I2C_DELAY
	SETB	SCL
	ACALL	I2C_DELAY
	MOV	C,SDA
	RLC	A
	CLR	SCL
	DJNZ	R5,I2C_RD_1
	MOV	I2C_DATA,A
	POP	ACC
	RET

EEPROM_RD1:LCALL  I2C_START
	MOV	I2C_DATA,#EEPROM_CODE1+1
	LCALL	I2C_WR
	LCALL	I2C_RD
	LCALL	I2C_STOP
	RET

I2C_NACK:SETB	SDA
	LCALL	I2C_CLK
	RET

I2C_START:SETB  SDA
	SETB	SDA
	LCALL	I2C_DELAY
	CLR	SDA
	LCALL	I2C_DELAY
	CLR	SCL
	RET

I2C_STOP:CLR	SDA
	LCALL	I2C_DELAY
	SETB	SCL
	LCALL	I2C_DELAY
	SETB	SDA
	RET

I2C_CLK:LCALL	I2C_DELAY
	SETB	SCL
	LCALL	I2C_DELAY
	CLR	SCL
	RET

I2C_DELAY:MOV	R6,#03
I2C_DELAY_1:NOP
	NOP
	DJNZ	R6,I2C_DELAY_1
	RET

;**********************************************
;	Delay 
;**********************************************

DELAY_10MS:MOV	R7,#10
DELAY_10MS_1:MOB R6,#0E6H
DELAY_10MS_2:NOP
	NOP
	DJNZ	R6,DELAY_10MS_2
	DJNZ	R7,DELAY_10MS_1
	RET

DELAY_100MS:MOV	R7,#100
DELAY_100MS_1:MOB R6,#0E6H
DELAY_100MS_2:NOP
	NOP
	DJNZ	R6,DELAY_10MS_2
	DJNZ	R7,DELAY_10MS_1
	RET

DELAY_1S:MOV	R5,#100
DELAY_1S_1:ACALL  DELAY_10MS
	DJNZ	R5,DELAY_1S_1
	RET

PWM_MODE:PUSH	ACC
	PUSH	00H
	MOV	TMOD.#10H
	MOV	TLO,#0B0H
	MOV	TH0,#0B0H
	SETB	LED_PWM
	MOV	SS200US,#00
	MOV	OUTPUT_PWM,#00
	SETB	TRO
	CLR	A
DELO:CJNE	A,PWM,DEL1
	CLR	LED_PWM
DEL1:JNB	TCON.0,DEL1
	INC	SS200US
	MOV	R0,SS200US
	CJNE	R0,#05GMDEL1
	MOV	SS200US,#00
	INC	OUTPUT_PWM
	MOV	A,OUTPUT_PWM
	ADD	A,#00
	DA	A
	MOV	OUTPUT_PWM,A
	CJNE	A,#70HDEL0
	CLR	TRO
	POP	00H
	POP	ACC
	RET

	END	





			
	
   
