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

📄 ci910cpu.asm.svn-base

📁 keilC底层软件,能够结合硬件产生加解密密文,具有安全保护功能.
💻 SVN-BASE
📖 第 1 页 / 共 5 页
字号:
CalY2NoAdjust:
	mov	b,#8
	div	ab
	mov	PageReg2,a					;Y2/8
	mov	a,b
	movc	a,@a+dptr
	cpl	a
	mov	HideReg2,a
	ret
;========================================================================;
EnterModifyReadMode:
	mov	dptr,#LCD_CommandPort
	mov	a,#0e0h
	movx	@dptr,a						;set modify-read mode
	mov	dptr,#LCD_DataPort
	ret
;========================================================================;
ResetModifyReadMode:
	mov	dptr,#LCD_CommandPort
	mov	a,#0eeh
	movx	@dptr,a						;reset modify-read mode
	ret
;========================================================================;
Calculate:
	mov	a,PageReg2
	clr	c
	subb	a,PageReg1
	inc	a
	mov	PageReg2,a					;Y loop counter
	mov	a,PageReg1
	add	a,#0b0h
	mov	PageReg1,a					;page address
	ret
;========================================================================;
GenerateCounter:
	mov	a,PublicVariable1				;X2
	clr	c
	subb	a,r7
	mov	PublicVariable1,PublicVariable2			;PublicVariable1==Y2
	mov	b,#16
	cjne	a,#128,JudgX2Val
JudgX2Val:
	jc	GenerX2Ok
	mov	a,#127
GenerX2Ok:
	div	ab
	inc	a
	mov	LengthX,a					;LengthX==(X2-X1)/16+1
	mov	a,b
	clr	c
	rlc	a						;*2
	mov	PublicVariable2,a				;PublicVariable2==(X2-X1)%16*2
	ret
;========================================================================;
DisplayVersion:
	mov	b,#16
	mov	r5,#113							;Y
	mov	r7,#16							;X
	mov	dptr,#CPUDispVersion					;display hardware version
	lcall	MemoryCopy
	mov	r2,#HIGH(ExternTempBuffer)				;pointer(MSB)
	mov	r3,#LOW(ExternTempBuffer)				;pointer(LSB)
	mov	PublicVariable1,b
	mov	PublicVariable2,#01h					;display color
	mov	PublicVariable3,#41h					;library select
	lcall	_StringDisplayPro					;exit setup?
	ret
;========================================================================;
ReadTable:
	clr	a
	movc	a,@a+dptr
	inc	dptr
	ret
;========================================================================;
_MenuGetAddress:
	mov	dph,MenuAddressH
	mov	dpl,MenuAddressL
_MenuGetAddressLoop:
	mov	a,b
	cjne	a,#1,_MenuGetContinue
	ljmp	_MenuGetData
_MenuGetContinue:
	inc	dptr							;skip X
	inc	dptr							;skip Y
	clr	a
	movc	a,@a+dptr						;read in length
	add	a,#3
	add	a,dpl
	mov	dpl,a
	mov	a,dph
	addc	a,#0
	mov	dph,a
	djnz	b,_MenuGetAddressLoop
_MenuGetData:
	lcall	ReadTable
	add	a,#29
	mov	r7,a							;X1
	lcall	ReadTable
	clr	c
	subb	a,#1
	mov	r5,a							;Y1
	lcall	ReadTable
	clr	c
	subb	a,#5
	mov	r3,a							;length
	mov	a,dpl
	add	a,#7
	mov	dpl,a
	mov	a,dph
	addc	a,#0
	mov	dph,a							;pointe to data
	mov	b,#0
_MenuGetCharLenLoop:
	lcall	ReadTable
	inc	b
	cjne	a,#CPU_CharType,_MenuCharJudg
_MenuCharJudg:
	jnc	_MenuContinue
	inc	b
_MenuContinue:
	djnz	r3,_MenuGetCharLenLoop
	mov	a,#6
	mul	ab							;(char number)*6=X2
	add	a,#4
	add	a,r7
	mov	r3,a							;X2=X1+x
	mov	a,r5
	add	a,#14
	mov	PublicVariable1,a					;Y2
	lcall	_ReverseRectanglePro
	ret
;========================================================================;
;uchar DisplayWindow(uchar* WindowID)
;-------------------------------;
;Description:	CPU menu display
;	  IN:	DPTR==Display window ID number
;		R7==Key upper limit
;		Acc==Now focus
;		B==Hisroy focus
;        OUT:	R7==User selected key
;        USE:	R7==Pressed valid key
;-------------------------------;
_DisplayWindow:
	push	HistoryFocus
	push	NowFocus
	push	Index
	push	MenuAddressH
	push	MenuAddressL
	push	SubMenuNumber

	mov	NowFocus,a						;line1
	mov	HistoryFocus,b
	mov	b,r7
	push	dph
	push	dpl
	push	acc
	push	b
	mov	r5,#0h
	mov	r7,#0h
	lcall	ClearLCDPro						;clear display

	mov	r7,#0							;X1
	mov	r5,#20							;Y1
	mov	r3,#127							;X2
	mov	PublicVariable1,#20					;Y2
	mov	PublicVariable2,#02h					;color
	lcall	_DrawLinePro
	mov	r7,#0							;X1
	mov	r5,#22							;Y1
	mov	r3,#127							;X2
	mov	PublicVariable1,#22					;Y2
	mov	PublicVariable2,#02h					;color
	lcall	_DrawLinePro

	pop	b
	pop	acc
	pop	dpl
	pop	dph
	mov	r7,b
	clr	a
	movc	a,@a+dptr
	inc	dptr
	mov	SubMenuNumber,a
	mov	CharInterval,a						;save MAX key
	push	dph
	push	dpl
	inc	dptr
	inc	dptr
	lcall	ReadTable
	add	a,#2
	add	a,dpl
	mov	MenuAddressL,a
	mov	a,dph
	addc	a,#0
	mov	MenuAddressH,a						;save address
	pop	dpl
	pop	dph
	push	SubMenuNumber
_MenuDisplayLoop:
	lcall	ReadTable
	mov	r7,a							;X
	lcall	ReadTable
	mov	r5,a							;Y
	lcall	ReadTable
	mov	PublicVariable1,a					;Length
	lcall	ReadTable
	mov	PublicVariable2,a					;Display mode
	lcall	ReadTable
	mov	PublicVariable3,a					;Library select
	mov	b,PublicVariable1
	lcall	MemoryCopy
	push	dph
	push	dpl
	mov	r2,#HIGH(ExternTempBuffer)				;pointer(MSB)
	mov	r3,#LOW(ExternTempBuffer)				;pointer(LSB)
	lcall	_StringDisplayPro
	pop	dpl
	pop	dph
	djnz	SubMenuNumber,_MenuDisplayLoop
	lcall	DisplayVersion
	pop	SubMenuNumber						;recover length
	ljmp	_MenuReverse
_MenuGetKeyLoop:
	mov	r6,#HIGH(AutoOffTime)
	mov	r7,#LOW(AutoOffTime)					;3 minute limited
	mov	r5,#1							;buzzer enable
	lcall	_GetCharPro
	cjne	r7,#TimerOut,_MenuShutPowerCheck			;disable auto power off
	ajmp	_MenuCheckUp
_MenuShutPowerCheck:
	lcall	_ShutPowerCheckPro
_MenuCheckUp:
	cjne	r7,#KeyUp,_MenuJudgDownKey				;up key judg
	mov	HistoryFocus,NowFocus
	dec	NowFocus
	lcall	_MenuBoundaryCheck
	ajmp	_MenuReverse
_MenuJudgDownKey:
	cjne	r7,#KeyDown,_MenuJudgEnter				;down key judg
	mov	HistoryFocus,NowFocus
	inc	NowFocus
	lcall	_MenuBoundaryCheck
	ajmp	_MenuReverse
_MenuJudgEnter:
	cjne	r7,#KeyEnter,_MenuJudgSelect				;enter key judg
	mov	r7,NowFocus
	ajmp	_MenuDisplayExit
_MenuJudgSelect:
	cjne	r7,#KeySelect,_MenuJudgClear				;clear key judg
	mov	r7,NowFocus
	ajmp	_MenuDisplayExit
_MenuJudgClear:
	cjne	r7,#KeyClear,_MenuJudgESC				;clear key judg
	ajmp	_MenuDisplayExit
_MenuJudgESC:
	cjne	r7,#KeyEsc,_MenuJudgNumber1				;ESC key judg
	mov	r7,#KeyClear
	ajmp	_MenuDisplayExit
_MenuJudgNumber1:
	cjne	r7,#Key1,_MenuJudgKey1
_MenuJudgKey1:
	jnc	_MenuJudgNumber2
	ljmp	_MenuGetKeyLoop						;press invalid key loop again
_MenuJudgNumber2:
	mov	b,SubMenuNumber						;key upper limit
	mov	a,r7
	cjne	a,b,_MenuJudgKey2
_MenuJudgKey2:
	jc	_MenuDisplayExit
	ljmp	_MenuGetKeyLoop						;1<Key<(key upper limit) then key value valid
_MenuReverse:
	mov	b,NowFocus
	lcall	_MenuGetAddress						;reverse display now line
	mov	b,HistoryFocus
	mov	a,b							;copy B
	cjne	a,#NoKey,_MenuReverseHistory
	ljmp	_MenuGetKeyLoop						;loop untile presse valid key
_MenuReverseHistory:
	lcall	_MenuGetAddress						;reverse display history line
	ljmp	_MenuGetKeyLoop						;loop untile presse valid key
_MenuDisplayExit:
	pop	SubMenuNumber
	pop	MenuAddressL
	pop	MenuAddressH
	pop	Index
	pop	NowFocus
	pop	HistoryFocus
	ret
;========================================================================;
_MenuBoundaryCheck:
	mov	a,NowFocus
	cjne	a,#0,_MenuUpBoundaryCheck
	mov	a,SubMenuNumber
	add	a,#0ffh							;NowFocus==SubMenuNumber-1
	mov	NowFocus,a						;SubMenuNumber=upper limit
_MenuUpBoundaryCheck:
	mov	a,SubMenuNumber
	cjne	a,NowFocus,_MenuBoundaryExit
	mov	NowFocus,#Key1						;reload key1
_MenuBoundaryExit:
	ret
;========================================================================;
;void Communication(void)
;-------------------------------;
;Description:	CPU download program process
;	  IN:	No
;        OUT:	No
;        USE:	
;-------------------------------;
Communication:
	mov	r7,#5
	mov	r5,#30
	mov	r3,#122
	mov	PublicVariable1,#100
	mov	PublicVariable2,#03h
	lcall	_DrawRectanglePro					;draw rectangle

	mov	b,#4
	mov	r5,#45							;Y
	mov	r7,#40							;X
	mov	dptr,#CommInf						;display communication
	lcall	DisplayString
	mov	b,#6
	mov	r5,#74							;Y
	mov	r7,#28							;X
	mov	dptr,#PressKeyInf					;press enter exit
	lcall	DisplayString
DownLoadLoop:
	mov	r6,#LOW(ExternTempBuffer)
	mov	r7,#HIGH(ExternTempBuffer)
	lcall	_ReceiveFramePro
	cjne	r7,#UserExitKey,CommPowerDetect
	ret
CommPowerDetect:
	cjne	r7,#PowerLower,DownLoadContinue
	mov	dptr,#PowerLowerInf
	ljmp	InterruptShut						;power low shutdown system
DownLoadContinue:
	cjne	r7,#00h,DownReturnAnswer
	mov	FlashLatch,#Enable
	mov	dpl,r1
	mov	dph,r2
	movx	a,@dptr							;read in SEQ
	mov	b,a
	inc	dptr
	movx	a,@dptr							;read in TAG
	inc	dptr
	inc	dptr							;point to length 2
	cjne	a,#WRITE_FLASH,ReadFlashCheck
	lcall	CommWriteFlash
	ljmp	DownReturnAnswer
ReadFlashCheck:
	cjne	a,#READ_FLASH,SelfCheckJudg				;comp command
	push	acc

	inc	dptr
	movx	a,@dptr
	inc	dptr							;read in source address(MSB)
	mov	r2,a
	movx	a,@dptr
	inc	dptr							;read in source address(LSB)
	mov	r3,a
	inc	dptr							;skip length(MSB)
	mov	r4,#0							;length(MSB)
	movx	a,@dptr
	inc	dptr							;length(LSB)
	mov	r5,a
	movx	a,@dptr
	inc	dptr							;attribute byte
	clr	c
	rrc	a
	mov	r7,a							;page

	mov	dptr,#ExternTempBuffer
	mov	a,b
	movx	@dptr,a							;save SEQ
	inc	dptr
	pop	acc
	movx	@dptr,a							;save TAG
	inc	dptr
	clr	a
	movx	@dptr,a							;save length(MSB)
	inc	dptr
	mov	a,r5
	movx	@dptr,a							;save length(LSB)
	inc	dptr

	mov	PublicVariable2,#HIGH(ExternTempBuffer+4)
	mov	PublicVariable3,#LOW(ExternTempBuffer+4)
	lcall	_ReadFlashToExterMemPro
	ajmp	DownLoadAnswer
DownReturnAnswer:
	mov	dptr,#(ExternTempBuffer+2)
	mov	a,#0
	movx	@dptr,a
	inc	dptr
	mov	a,#1
	movx	@dptr,a
	inc	dptr
	mov	a,r7							;result
	movx	@dptr,a
	ajmp	DownLoadAnswer
SelfCheckJudg:
	;Reserved							;reserved
	mov	r7,#NoDefineCommand					;no defined command
	ajmp	DownReturnAnswer
DownLoadAnswer:
	mov	r6,#HIGH(ExternTempBuffer)
	mov	r7,#LOW(ExternTempBuffer)
	lcall	_CombFramePro
	ljmp	DownLoadLoop
;========================================================================;
;void CommWriteFlash(void)
;-------------------------------;
;Description:	Download program then write into FLASH
;	  IN:	No
;        OUT:	R7==0 Success
;		R7==0x13 Write error
;		R7==0x14 Erase error
;        USE:	A,R4,R5,R6,(A,B,R1,R2,R3,R7,DPTR)
;		Format: SEQ+TAG+LEN1+LEN2+Data+LRC
;-------------------------------;
CommWriteFlash:
	movx	a,@dptr							;read in LEN2
	inc	dptr
	clr	c
	subb	a,#3							;subb write address and operation control byte
	mov	r5,a							;length(LSB)
	mov	R4,#0							;length(MSB)
	movx	a,@dptr
	inc	dptr
	mov	PublicVariable2,a					;Destaddress(MSB)
	movx	a,@dptr							;read in LEN2
	inc	dptr
	mov	PublicVariable3,a					;Destaddress(LSB)
	movx	a,@dptr							;read in attribute byte
	push	acc
	inc	dptr
	mov	r3,dpl
	mov	r2,dph
	anl	a,#0eh
	clr	c
	rrc	a
	mov	r7,a							;page
	mov	FlashWriteEnable,FlashLatch
	pop	acc
	jnb	acc.0,CommWriteToFlash
	mov	r5,PublicVariable2
	lcall	_EraseBlockPro
	ret
CommWriteToFlash:
	lcall	_ExternalWriteFlashPro
	ret
;========================================================================;
;Description:	Peripheral selfcheck(keyboard、LCD、RTC、SRAM、Buzzer、Encryptro)
;	  IN:	No
;        OUT:	No
;        USE:	
;-------------------------------;
SelfCheck:
	push	Index
	mov	Index,#Key1
SelfCheckLoop:
	mov	a,Index						;now focus
	mov	b,#NoKey					;history focus
	mov	dptr,#SelfCheckMenu
	lcall	_DisplayWindow
	mov	Index,r7					;save now focus
KeyBoardCheck:
	cjne	r7,#Key1,LCD_Check
	lcall	KeyBoardSelfCheck				;keyboard selfcheck
	ljmp	SelfCheckLoop
LCD_Check:
	cjne	r7,#Key2,Others
	lcall	LCD_SelfCheck					;LCD selfcheck
	ljmp	SelfCheckLoop
Others:
	cjne	r7,#Key3,ReturnCheck
	lcall	OthersCheck					;LCD selfcheck
	ljmp	SelfCheckLoop
ReturnCheck:
	cjne	r7,#KeyClear,SelfCheckLoop
	pop	Index
	ret
;========================================================================;
;Description:	Real time clock selfcheck
;	  IN:	No
;        OUT:	R7==0 RTC ok
;		  ==1 RTC error
;        USE:	
;-------------------------------;
RTC_SelfCheck:
	mov	r7,#RTC_ReadStatus
	mov	r5,#TempBuffer
	lcall	_ReadRTclockPro					;read in status register

	mov	r7,#RTC_Read2
	mov	r5,#TempBuffer
	lcall	_ReadRTclockPro					;read hour,minute,second
	mov	p2,#ReleasePeripheral
	mov	r7,#30						;1.5 seconds limited
	push	ie
	mov  	ie,#82h						;EA=1,ET0=1
RTC_Delay:
        mov	th0,#04bh
        mov	tl0,#03ah					;50ms for 11.0592Mhz
	setb	tr0						;start timer0
	mov	p0,#00h						;save power
	mov	pcon,IDLEvalue					;enter idle mode for key scan 
	djnz	r7,RTC_Delay
	pop	ie
	mov	p2,#00h						;enable SRAM 256 bytes
	mov	r7,#RTC_Read2
	mov	r5,#(TempBuffer+3)				;read in real time from RTC
	lcall	_ReadRTclockPro					;read hour,minute,second
	mov	r0,#(TempBuffer+5)				;get from CPU
	mov	a,@r0
	mov	r6,a
	mov	r1,#(TempBuffer+2)
	mov	r7,#2
RTC_Check:
	mov	a,@r1
	add	a,#01h
	da	a
	mov	@r1,a
	mov	b,#60h
	div	ab						;second
	mov	a,b
	cjne	a,AR6,RTC_CheckAgain
	mov	r7,#0						;check succes
	ret
RTC_CheckAgain:
	djnz	r7,RTC_Check
	mov	r7,#1						;checkerror
	ret
;========================================================================;
;Description:	Keyboard selfcheck
;	  IN:	No
;        OUT:	No
;        USE:	R7,(A,)
;-------------------------------;
KeyBoardSelfCheck:
	mov	r7,#0						;for exit flag
	mov	NowFocus,#NULL
	mov	HistoryFocus,#NULL
	lcall	DrawKeyBoard
	push	SubMenuNumber
	mov	SubMenuNumber,#0
KeyCheckLoop:
	mov	HistoryFocus,NowFocus
	mov	r6,#HIGH(AutoOffTime)
	mov	r7,#LOW(AutoOffTime)					;3 minute limited
	mov	r5,#1							;buzzer enable

⌨️ 快捷键说明

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