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

📄 isp_serve.asm

📁 一个非常好的微处理器烧录EEPROM的C++ 原代码项目文件,直接可用,而且还是一拖八的, 成果奉献
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;--------------------------------------------------------
;			ISP  Serve program
;  Description:
;
;     Use it only at UART mode and needn`t any key input.
;  for dvd937 mcu is sm5964,it modify by original ver3.0a
;  the entry addr is: 0xfc00
;  ------------------write by laijun---------------------
;  -----------------------------------Ver1.00--2005.08.19
;  ------------------------------------------------------
;    Add follow 2 function at the new version
;  1: Use Eeprom(AT24C512) direct write into sm5964 flash
;  2: Use Eeprom(AT24C512) direct read from sm5964 flash
;     Above 2 function support PnP technology,and the iic 
;  wire use the UART 2 wire,it needn`t change any hardware
;  ------------------------------------------------------
;  **NOTE: At the version add a VFD display(PT6318)***
;    If you want to add your display program,please modify
;  every part about display subprogram carefully,it is de
;  -fined by macro,including font and font index,memory,
;  send subprogam,display subprogram,etc.
;  ------------------------------------------------------
;  the entry addr is: 0xf800
;  ------------------added by laijun---------------------
;  -----------------------------------Ver1.10--2005.09.22
;--------------------------------------------------------
#include "sm5964.h"
#include "DVD7390Ver.h"
;=======================================================
;=======================================================
;=======================================================
;Define Display type
DISP_NONE		EQU	00H
DISP_VFD		EQU	01H
DISP_LCD		EQU	02H
DISP_TFT		EQU	03H
DISP_DVD		EQU	04H
;DISPLAY			EQU	DISP_VFD
DISPLAY			EQU	DISP_DVD
;=======================================================
;--------------------------------------------------------
IF  DISPLAY==DISP_VFD
;Define VFD Driver IC
VFD_DRIVER_PT6318	EQU	00H
DISP_VFD_DRIVER		EQU	VFD_DRIVER_PT6318
;--------------------------------------------------------
;Define VFD Screen type
VFD_SCREEN_GTD_1007A	EQU	00H
DISP_VFD_SCREEN		EQU	VFD_SCREEN_GTD_1007A
;--------------------------------------------------------
ENDIF
;=======================================================
IF  DISPLAY==DISP_LCD
;add the lcd part
ENDIF
;=======================================================
IF  DISPLAY==DISP_TFT
;add the tft part
ENDIF
;=======================================================
IF  DISPLAY==DISP_DVD
;
ENDIF
;=======================================================
;--------------------------------------------------------
;Don`t change it
;ISP_MODE
ISP_MODE_UART	 	EQU	00H
ISP_MODE_EEWRITE	EQU	01H
ISP_MODE_EEREAD	 	EQU	02H
;define	Register
Iic_Type		EQU	2DH
Iic_Addr		EQU	2EH
Isp_Mode 		EQU	2FH
Function_Statu		EQU	020H^0
Rom_Type   		EQU  	020H^1 
Iic_Ack_Bit		EQU	020H^2
Iic_Error_Flag		EQU	020H^3
Eeprom_Type		EQU	020H^4
Eeprom_WR_Flag		EQU	020H^5
Verify_Sum 		EQU	030H 
Pgstr_Adr   		EQU 	031H
Pgend_Adr   		EQU 	032H
Iic_Send_Buffer		EQU	033H
Iic_Rec_Buffer		EQU	034H
Iic_SubAddr_H		EQU	035H
Iic_SubAddr_L		EQU	036H
Iic_Number		EQU	037H
Temp			EQU	038H
Temp1			EQU	039H
Temp2			EQU	03AH

Loop1			EQU	070H
Loop2			EQU	071H
Loop3			EQU	072H
Loop4			EQU	073H
Loop5			EQU	074H
Loop6			EQU	075H

Iic_Buffer		EQU	00H	;don`t modify it
;--------------------------------------------------------
;added follow memory define
IF  DISPLAY==DISP_VFD
Vfd_Send_Buffer		EQU	03BH

IF  DISP_VFD_DRIVER==VFD_DRIVER_PT6318
IF  DISP_VFD_SCREEN==VFD_SCREEN_GTD_1007A
Vfd_Mem_Addr_0L		EQU	03CH
Vfd_Mem_Addr_0H		EQU	03DH
Vfd_Mem_Addr_1L		EQU	03EH
Vfd_Mem_Addr_1H		EQU	03FH
Vfd_Mem_Addr_2L		EQU	040H
Vfd_Mem_Addr_2H		EQU	041H
Vfd_Mem_Addr_3L		EQU	042H
Vfd_Mem_Addr_3H		EQU	043H
Vfd_Mem_Addr_4L		EQU	044H
Vfd_Mem_Addr_4H		EQU	045H
Vfd_Mem_Addr_5L		EQU	046H
Vfd_Mem_Addr_5H		EQU	047H
Vfd_Mem_Addr_6L		EQU	048H
Vfd_Mem_Addr_6H		EQU	049H
Vfd_Mem_Addr_7L		EQU	04AH
Vfd_Mem_Addr_7H		EQU	04BH
Vfd_Mem_Addr_8L		EQU	04CH
Vfd_Mem_Addr_8H		EQU	04DH
Vfd_Mem_Addr_9L		EQU	04EH
Vfd_Mem_Addr_9H		EQU	04FH

Vfd_Mem_1		EQU	050H
Vfd_Mem_2		EQU	051H
Vfd_Mem_3		EQU	052H
Vfd_Mem_4		EQU	053H
Vfd_Mem_5		EQU	054H
Vfd_Mem_6		EQU	055H
Vfd_Mem_7		EQU	056H
Vfd_Mem_8		EQU	057H
Vfd_Mem_9		EQU	058H
ENDIF
ENDIF
ENDIF

IF  DISPLAY==DISP_DVD
Xpos			EQU	03BH
Ypos			EQU	03CH
Color			EQU	03DH
ENDIF
;--------------------------------------------------------
;Don`t change it
Percent			EQU	059H
Eeprom_Addr_L		EQU	05AH
Eeprom_Addr_H		EQU	05BH
Eeprom_Func		EQU	05CH
;--------------------------------------------------------
IIC_ADDR_EEPROM		EQU	0A0H
IIC_ADDR_DVD		EQU	50H
;--------------------------------------------------------
IF  DISPLAY<>DISP_NONE
CH_0			EQU	00H	;//"0"
CH_1			EQU	01H	;//"1"
CH_2			EQU	02H	;//"2"
CH_3			EQU	03H	;//"3"
CH_4			EQU	04H	;//"4"
CH_5			EQU	05H	;//"5"
CH_6			EQU	06H	;//"6"
CH_7			EQU	07H	;//"7"
CH_8			EQU	08H	;//"8"
CH_9			EQU	09H	;//"9"
CH_A			EQU	0AH	;//"A"
CH_B			EQU	0BH	;//"B"
CH_C			EQU	0CH	;//"C"
CH_D			EQU	0DH	;//"D"
CH_E			EQU	0EH	;//"E"
CH_F			EQU	0FH	;//"F"
CH_G			EQU	10H	;//"G"
CH_H			EQU	11H	;//"H"
CH_I			EQU	12H	;//"I"
CH_J			EQU	13H	;//"J"
CH_K			EQU	14H	;//"K"
CH_L			EQU	15H	;//"L"
CH_M			EQU	16H	;//"M"
CH_N			EQU	17H	;//"N"
CH_O			EQU	18H	;//"O"
CH_P			EQU	19H	;//"P"
CH_Q			EQU	1AH	;//"Q"
CH_R			EQU	1BH	;//"R"
CH_S			EQU	1CH	;//"S"
CH_T			EQU	1DH	;//"T"
CH_U			EQU	1EH	;//"U"
CH_V			EQU	1FH	;//"V"
CH_W			EQU	20H	;//"W"
CH_X			EQU	21H	;//"X"
CH_Y			EQU	22H	;//"Y"
CH_Z			EQU	23H	;//"Z"
CH_ADD   		EQU	24H	;//"+"
CH_SUB   		EQU	25H	;//"-"
CH_LINE			EQU	26H  	;//"under line"
CH_NULL  		EQU	35H	;//NULL
ENDIF
IF  DISPLAY==DISP_DVD
DVD_CMD_SETADDR		EQU	0x01
DVD_CMD_SETCOLOR	EQU	0x02
DVD_CMD_SETDATA		EQU	0x03
DVD_CMD_CLRDISP		EQU	0x04
;define  COLOR
BLACK			EQU	0x00
BLUE			EQU	0x01
GREEN			EQU	0x02
CYAN			EQU	0x03
RED			EQU	0x04
MAGENT			EQU	0x05
YELLOW			EQU	0x06
WHITE			EQU	0x07
ENDIF
;------------------------------------------------------
;	Flash ISP command table
;------------------------------------------------------
;Don`t change it
CHIP_ERASE		EQU	00H
PROGRAM_CODE		EQU	01H
PAGE_ERASE_CODE		EQU	02H
PROTECT			EQU	03H
PAGE_ERASE_DATA		EQU	04H
PROGRAM_DATA		EQU	05H
MCU_RESET		EQU	06H
VERIFY			EQU	07H
READ			EQU	08H
;------------------------------------------------------
;	I/O PORT DEFINE
;------------------------------------------------------
sbit			Pin_Sda_IIC=P3^1
sbit			Pin_Scl_IIC=P3^0
IF  DISPLAY==DISP_VFD
sbit			Pin_Data_VFD=P1^2
sbit			Pin_Clk_VFD=P1^3
sbit			Pin_Stb_VFD=P1^4
ENDIF
IF  DISPLAY==DISP_LCD
;Add LCD I/O part
ENDIF
IF  DISPLAY==DISP_TFT
;Add TFT I/O part
ENDIF
IF  DISPLAY==DISP_DVD
sbit			Pin_Sda_DVD=P0^1
sbit			Pin_Scl_DVD=P0^2
sbit			Pin_Stb_DVD=P0^3
ENDIF
;------------------------------------------------------
;	IIC_TYPE DEFINE
;------------------------------------------------------
IIC_EEPROM		EQU	00H
IIC_DVD			EQU	01H
;------------------------------------------------------
;Don`t change it
ISP_OK			EQU	0AAH
ISP_FAIL		EQU	57H
;------------------------------------------------------
IF  DISPLAY==DISP_VFD
FONT_VFD		EQU	0FF90H
ENDIF
IF  DISPLAY==DISP_DVD
STRING_TITLE		EQU	0FF40H
STRING_AUTHOR		EQU	0FF5FH
STRING_INSERT		EQU	0FF71H
STRING_REMOVEIC		EQU	0FF84H
STRING_TYPE		EQU	0FF97H
STRING_ERROR		EQU	0FF9FH
STRING_ERASE		EQU	0FFA8H
STRING_WRITE		EQU	0FFB3H
STRING_READ		EQU	0FFBEH
STRING_VERIFY		EQU	0FFC8H
STRING_PROTECT		EQU	0FFD4H
STRING_RESTART		EQU	0FFE1H
STRING_SUCCEED		EQU	0FFEBH
STRING_OK		EQU	0FFF6H
ENDIF
;=======================================================
;=======================================================
;		ISP_SERVE SOFTWARE 
;=======================================================
;------------------------------------------------------
		ORG	IspServerAddr ;  if you want change it 
                LJMP    Chek_Isp_mode ;--please enter dvd937ver.h 
			      	      ;--modify Isp_Server_AddrL 
		     		      ;--modify Isp_Server_AddrH 
;------------------------------------------------------
;		    DELAY  PROGRAM
;------------------------------------------------------
Delay5us:
		NOP
		RET
Delay10us:
		CALL	Delay5us
		CALL	Delay5us
		RET
Delay05s:	
		MOV	R5,#19H
Delay05s_1:		
		MOV	R6,#64H
Delay05s_2:		
		MOV	R7,#64H
		DJNZ	R7,$
		DJNZ	R6,Delay05s_2
		DJNZ	R5,Delay05s_1
		RET

Delay5ms:	
		MOV	R6,#19H
Delay5ms_1:		
		MOV	R7,#64H
		DJNZ	R7,$
		DJNZ	R6,Delay5ms_1
		RET
;------------------------------------------------------
;  	       DELAY  PROGRAM TO HERE IS OVER
;------------------------------------------------------
;IIC part:
;------------------------------------------------------
;		      IIC  PROGRAM
;------------------------------------------------------
SetIic_Addr:
		MOV	A,Iic_Type
		CJNE	A,#IIC_EEPROM,SIA1
		MOV	Iic_Addr,#IIC_ADDR_EEPROM
		RET
SIA1:		MOV	Iic_Addr,#IIC_ADDR_DVD
		RET
;------------------------------------------------------
SetbSda:
		MOV	A,Iic_Type
		CJNE	A,#IIC_EEPROM,SSD1
		SETB	Pin_Sda_IIC
		RET
SSD1:		CJNE	A,#IIC_DVD,SSD2
		SETB	Pin_Sda_DVD
SSD2:		RET
;------------------------------------------------------
ClrSda:
		MOV	A,Iic_Type
		CJNE	A,#IIC_EEPROM,CSD1
		CLR	Pin_Sda_IIC
		RET
CSD1:		CJNE	A,#IIC_DVD,CSD2
		CLR	Pin_Sda_DVD
CSD2:		RET
;------------------------------------------------------
SetbScl:
		MOV	A,Iic_Type
		CJNE	A,#IIC_EEPROM,SSC1
		SETB	Pin_Scl_IIC
		RET
SSC1:		CJNE	A,#IIC_DVD,SSC2
		SETB	Pin_Scl_DVD
SSC2:		RET
;------------------------------------------------------
ClrScl:
		MOV	A,Iic_Type
		CJNE	A,#IIC_EEPROM,CSC1
		CLR	Pin_Scl_IIC
		RET
CSC1:		CJNE	A,#IIC_DVD,CSC2
		CLR	Pin_Scl_DVD
CSC2:		RET
;------------------------------------------------------
InSda:
		MOV	A,Iic_Type
		CJNE	A,#IIC_EEPROM,ISD1
		JNB	Pin_Sda_IIC,ISD_End
		SETB	C
		RET
ISD1:		JNB	Pin_Sda_DVD,ISD_End
		SETB	C
		RET
ISD_End:	CLR	C
		RET
;------------------------------------------------------
Iic_Start:
		CALL	SetbSda
		CALL	SetbScl
		CALL	Delay10us
		CALL	ClrSda
		CALL	ClrScl
		RET
;------------------------------------------------------
Iic_Stop:
		CALL	SetbScl
		CALL	Delay10us
		CALL	SetbSda
		RET
;------------------------------------------------------
Iic_Ack:
		JB	Iic_Ack_Bit,Ack_High
		CALL	ClrSda
		JMP	Ack_Wait	
Ack_High:
		CALL	SetbSda
Ack_Wait:
		CALL	SetbScl
		CALL	Delay5us
		CALL	ClrScl
		CALL	ClrSda
		RET
;------------------------------------------------------
IIC_SendByte:
		CLR	Iic_Error_Flag
		MOV	R7,#08H
		MOV	R6,#80H
IIC_SendAga:
		MOV	A,Iic_Send_Buffer
		ANL	A,R6
		JZ	IIC_Send_Zero
		CALL	SetbSda
		JMP	IIC_Send_Wait
IIC_Send_Zero:	
		CALL	ClrSda
IIC_Send_Wait:
		CALL	Delay5us
		CALL	SetbScl
		CALL	Delay5us
		CALL	ClrScl
		MOV	A,R6
		RR	A
		MOV	R6,A
		DJNZ	R7,IIC_SendAga
		CALL	SetbSda
		CALL	SetbScl
		NOP
		NOP
		CALL	InSda
		JNC	IIC_Send_End
		SETB	Iic_Error_Flag
IIC_Send_End:	CALL	ClrScl
		CALL	ClrSda
		RET
;------------------------------------------------------
IIC_ReceiveByte:
		MOV	Iic_Rec_Buffer,#00H
		MOV	R7,#08H
		MOV	R6,#80H
		CALL	SetbSda
IIC_Rec_Aga:
		CALL	ClrScl
		CALL	Delay5us
		CALL	SetbScl
		CALL	Delay5us
		CALL	InSda
		JNC	IIC_Rec_Next
		MOV	A,R6
		ORL	Iic_Rec_Buffer,A
IIC_Rec_Next:
		MOV	A,R6
		RR	A
		MOV	R6,A
		DJNZ	R7,IIC_Rec_Aga
		CALL	ClrScl
		CALL	ClrSda
		RET
;------------------------------------------------------		
IIC_Write:
		CALL	Iic_Start
		MOV	Iic_Send_Buffer,Iic_Addr
		CALL	IIC_SendByte
		JB	Iic_Error_Flag,IIC_Write_End
		MOV	A,Iic_Type
		CJNE	A,#IIC_EEPROM,IIC_Write_DVD
		MOV	Iic_Send_Buffer,Iic_SubAddr_H
		CALL	IIC_SendByte
		JB	Iic_Error_Flag,IIC_Write_End
IIC_Write_DVD:		
		MOV	Iic_Send_Buffer,Iic_SubAddr_L
		CALL	IIC_SendByte
		JB	Iic_Error_Flag,IIC_Write_End
		MOV	DPL,#00H
		MOV	DPH,#00H
		MOV	R5,Iic_Number
		CJNE	R5,#00H,IIC_Write_Next
		JMP	IIC_Write_End
IIC_Write_Next:	
		MOVX	A,@DPTR
		MOV	Iic_Send_Buffer,A
		CALL	IIC_SendByte
		JB	Iic_Error_Flag,IIC_Write_End
		INC	DPL
		DJNZ	R5,IIC_Write_Next
IIC_Write_End:
		CALL	Iic_Stop
		CALL	Delay5ms
		RET
;------------------------------------------------------		
IIC_Read:
		CALL	Iic_Start
		MOV	Iic_Send_Buffer,Iic_Addr
		CALL	IIC_SendByte
		JB	Iic_Error_Flag,IIC_Read_End
		MOV	Iic_Send_Buffer,Iic_SubAddr_H
		CALL	IIC_SendByte
		JB	Iic_Error_Flag,IIC_Read_End
		MOV	Iic_Send_Buffer,Iic_SubAddr_L
		CALL	IIC_SendByte
		JB	Iic_Error_Flag,IIC_Read_End
		CALL	Iic_Start
		MOV	Iic_Send_Buffer,#0A1H
		CALL	IIC_SendByte
		JB	Iic_Error_Flag,IIC_Read_End
		MOV	DPH,#00H
		MOV	DPL,#00H
		MOV	R5,Iic_Number
IIC_Read_Next:		
		CALL	IIC_ReceiveByte
		CJNE	R5,#01,IIC_Read_1
		SETB	Iic_Ack_Bit
		JMP	IIC_Read_2
IIC_Read_1:
		CLR	Iic_Ack_Bit
IIC_Read_2:
		CALL	Iic_Ack
		MOV	A,Iic_Rec_Buffer
		MOVX	@DPTR,A
		INC	DPL
		DJNZ	R5,IIC_Read_Next
IIC_Read_End:
		CALL	Iic_Stop
		RET
;------------------------------------------------------
Stop_Eeprom:
		MOV	Iic_Type,#IIC_EEPROM
		CALL	SetIic_Addr
		RET

Write_Eeprom:
		MOV	Iic_Type,#IIC_EEPROM
		CALL	SetIic_Addr
		CALL	IIC_Write
		RET

Read_Eeprom:
		MOV	Iic_Type,#IIC_EEPROM
		CALL	SetIic_Addr
		CALL	IIC_Read
		RET

IF	DISPLAY==DISP_DVD
Write_DVD:
		JNB	Pin_Stb_DVD,$
		MOV	Iic_Type,#IIC_DVD
		CALL	SetIic_Addr
		CALL	IIC_Write
		RET
ENDIF
;------------------------------------------------------
;  	       IIC TO HERE IS OVER
;------------------------------------------------------
;Display part:
;------------------------------------------------------
;	        DISPLAY  PROGRAM
;------------------------------------------------------
;Display Driver
IF  DISPLAY==DISP_VFD

VFD_SendByte:
IF  DISP_VFD_DRIVER==VFD_DRIVER_PT6318

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -