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

📄 calcmain.asm

📁 这是用台湾KingB 8位单片机开发的科学计算器程序
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;|---------------------------------------|
;|Program name : CalcMain.asm		 |
;|Use bady: 83137			 |
;|Programer: Alton			 |
;|					 |
;|---------------------------------------|

		.area	calcmain_date(data,abs)	
		.org	0xd0
				
.SetT1H		EQU	0x0c	;(32768/10)-1=0x0ccb	
.SetT1L 	EQU	0xcb
.SetT2H		EQU	0x68		;(4M/1.5/100)-1=0x682a
.SetT2L		EQU	0x2a
.DecM		EQU	0x7c
.HexM		EQU	0x7d
.BinM		EQU	0x7e
.OctM		EQU	0x7f
.INS		EQU	0x61
.DEL		EQU	0x65
.MODE		EQU	0xee
.LEFT		EQU	0xcc
.RIGHT		EQU	0xdd
.RND		EQU	0x60
.ANS		EQU	0xa2
.ENG		EQU	0xc2
.MADD		EQU	0xb5
.MSUB		EQU	0xdf
.CL		EQU	0xdf
.ShiftL		EQU	0x14
.ShiftR		EQU	0x15
.PercentEqu	EQU	0x77
.DT		EQU	0xb5
.Enter		EQU	0xa3
.DaltaX		EQU	0xbd
.DaltaY		EQU	0xbe
.StoCode	EQU	0x52
.RclCode	EQU	0x53
.CalcEqu	EQU	0x7b
.ON		EQU	0x66
.TimeOut	EQU	0xf0	;Time Out 6Min(69*16)/3=368sec
.RealseTime	EQU	0x32 
.KeyDown	EQU	0x02
.NoKey		EQU	0x00
.HaveKey	EQU	0x01
.TimeRels	EQU	0x08
.KBTest		EQU	0xc0	;PRTD76
.ATTest		EQU	0x0c 	;PRTD32
;.KeyC::		.ds		1
;.KeyD::		.ds		1
.TempA::	.ds		1
.PPTemp::	.ds		1
.OP1Temp::	.ds		1
.Sec::		.ds		1
.DataDP::	.ds		1
.FinFlag::	.ds		1

	.area	calcmain_date1(data,abs)	
		.org	0xdd
					

.KeyBuf1::	.ds		1				
.KeyBuf::	.ds		1
;.KeyCnt::	.ds		1
;.KeyCodeBuf::	.ds		1
.ModeFlag::	.ds		1
.StoFlag::	.ds		1
.KeyCodeBuf::	.ds		1
.KeyTimeCnt::	.ds		1
.TurboCnt:: 
.NumCnt::	.ds		1
.FormulaDP::	.ds		1			
.ForData::	.ds		1	
		.area   calcmain_code(code,abs)
     	 .org   0x00            		 ;program start
        	br	.Main   		 	
       	 .org   0x06            		 ;interrupt 1       	 	 		  
        	reti
       	 .org   0x09           			 ;timer 1
       	 	br	.InterruptT1       	 
         .org   0x0c          			 ;timer 2
       		br	.InterruptT2       		 
       	 .org   0x0f         			 ;interrupt 2		 	 			     	 
       		reti
    	 .org   0x12          			 ;TimeBase
    	 
        	reti
 
;===========================================
;		.Main
;=========================================== 
.Main:: 	
		
		lda	#0h
		sta	PRT17 
		lda	#0xFF
		sta	PRTD
		lda	PRTD
		anda	#.ATTest 
		cmpe	#0h
		brz	.ATTestMode				 		 
		lda	#0ffh
		sta	SP
		call	.Initial
		call	ModeIcom
		call	.EI
		br	.Start
.Sleep:: 	
		lda	#0ffh
		sta	SP		 	
		call	.IntoSleepMode		
		lda	#01h
		sta0	.KeyCnt		
		call	.EI						                 						
.Wakeup:	
				 							
		lda0	.KeyCnt	
		cmpe	#0h
		brnz	.Wakeup
		lda0	.KeyCodeBuf
		cmpe	#.ON
		brnz	.Sleep
.PowerOn:						
		call	.DI
		call	.ClrData							 		
		call	ModeIcom		;Disp Icom			
		call	.LcdcOn		
		call	.EI
		lda	#>.Count
		sta	PP	
		lda	#.KeyDown	
		sta 	.Count	
;-------------------------------------------		 
.Start:
		call	.IdleMode
.CheckCode:	
		lda0	.Sec		 
		cmpe	#.TimeOut		;(5.3)SEC*69(45h)=368sec=6Min
		brc	.Sleep			
		call	.KeyCheck		 
		lda	#>.Count
		sta	PP		
		lda 	.Count		
		cmpe	#.HaveKey		
		brz 	.ScanKey														 			
		call	T1chkblank		;Blankcheck			
		lda	#>t1count
		sta	PP
		lda	t1count
		cmpe	#0
		brnz	.CheckCode		 
		call	.IdleMode				
		lda	OP2
		anda	#40h
		brz	.CheckCode
		call	.NormalMode
		br	.CheckCode
;;;;;Show Icom and Blanking and judge have key press down		 
.ScanKey:							  	
		lda0	.KeyCodeBuf	
		cmpe	#0h
		brz	.CheckCode 		
		sta0	.KeyPos	
		lda	#>.Count
		sta	PP	
		lda	#02h
		sta 	.Count		
		lda	#>t1count
		sta	PP
		lda	#0h
		sta	t1count		
		sta0	.Sec		;reset time out clock
		call	.DI
;-------------------------------------------						
.InputKeyHandle:	
		lda	#>StateFlag
		sta	PP
		lda	StateFlag
		anda	#08h
		brz	.NormalGet
		call	BasenKeyCode		 
		cmpe	#01h
		brz	.NormalGet
		cmpe	#02h
		brz	.BaseNkey
		cmpe	#03h
		brz	.BaseNkey
		cmpe	#04h
		brz	.NormalGet
.NormalGet:				 				
		call	.GetKeyCode								
.BaseNkey:		
		lda0	ErrorFlag
		cmpe	#0h		
		brnz	.DispDotMatrix	
		call	BasenKeyChk		
		lda	#>.SetFlag
		sta	PP
		lda	StateFlag
		anda	#08h
		brnz	.BaseN
.NotBaseN:		
		lda	.SetFlag
		anda	#03h			;check	(Rnd Eng)
		cmpe	#01h
		brz	.DORnd
		cmpe	#02h		
		brz	.SetDRG
.EditModeInp:			
		lda0	.KeyPos
		cmpe	#.Mode
		brz	.FunctChoice
.MemCheck:		
		lda	.SFlag		 
		anda	#30h
		brnz	.MemoryCK												
;-------------------------------------------
;		Function Area
;-------------------------------------------
.FunctChoice:							
		lda0	.KeyPos
		cmpe	#0h
		cmpe	#.Mode			;Mode set
		brz	.Modeadd	
		lda0	.ModeFlag
		anda	#0f0h
		brnz	.DispDotMatrix	
		lda0	.KeyPos
		cmpe	#.MADD
		brz	.GetValue
		cmpe	#.MSUB
		brz	.GetValue		
		cmpe	#0f8h			;drg
		brz	.DRG
		cmpe	#.ENG			;eng
		brz	.DispDotMatrix
		cmpe	#41h		        ;shift eng 	
		brz	.DispDotMatrix
		cmpe	#.RND
		brz	.SetRND
		cmpe	#.Mode			;Mode set
		brz	.Modeadd	
		lda0	.ModeFlag
		anda	#0f0h
		brnz	.DispDotMatrix	
		lda0	.KeyPos
		cmpe	#.DEL			;del
		brz	.DispDotMatrix
		cmpe	#.INS
		brz	.INSck			;ck ins
		lda0	.KeyPos
		cmpe	#.LEFT
		brz	.CkLR			
		cmpe	#.RIGHT	
		brz	.CkLR	
		lda	#01h
		sta	PP		
		lda	.SetFlag
		anda	#20h			;check	(Point Fract Dms)
		brnz	.NoEquCalc		;.DislayMode		;.ModeDisp	 		
		br	.CKIns				
;===========================================
;		.CalcResoult
;===========================================	
;;;StateFlag 7	6   5	4   3	 2   1   0	
;;;	   Comp SD  D	R   G   (  LRMode )
.CalcResoult:	
					
		lda0	.KeyPos		 	
		cmpe	#0h
		brz	.EmitKeyD		
		;call	ChkDispAns		;stop blanking  
		lda	#>StateFlag		
		sta	PP
		lda	StateFlag		;c0 judge CMPE SD MODE
		anda	#0c0h	
		brz	.LrModeCk
.CompSDMod:												
		lda0	.KeyPos					
		cmpe	#.PercentEqu
		brz	.GetValue
		cmpe	#.Enter
		brz	.GetValue
		cmpe	#.DT
		brz	.GetValue
		cmpe	#.CL
		brz	.GetValue
		cmpe	#.CalcEqu
		brz	.GetValue	
		call	ChkDispAns			
		br	.SaveInputData
;;.CommaFlag=0 normal calc or .CommaFlag=ff data input (for SD REG Mode)		
.LrModeCk:	
		lda0	.CommaFlag		
		cmpe	#0h		 
		brz	.CompSDMod
		lda0	.KeyPos					
		cmpe	#.DT			;For SD REG Mode
		brz	.GetValue
		cmpe	#.CL
		brz	.GetValue
		cmpe	#.Enter
		brz	.EnterErr
		cmpe	#.PercentEqu
		brz	.EnterErr
		call	ChkDispAns		
		br	.SaveInputData 
;;;;;;;;;;judge press Enter or Ac or Percent Enter	
.GetValue::			
		lda	#>.SFlag		
		sta	PP		
		lda	.SFlag
		anda	#40h			;40=AC
		brnz	.EmitKeyD
		lda	.SFlag
		anda	#48h			;48=AC&EQU
		cmpe	#48h
		brz	.EmitKeyD
		cmpe	#08h
		brnz	1$
		lda	#>StateFlag		
		sta	PP
		lda	StateFlag		;c0 judge CMPE SD MODE		
		anda	#47h		;43h	
		brnz	.NoEquCalc		
		lda0	.KeyPos
		cmpe	#.MADD
		brz	2$
		cmpe	#.MSUB
		brnz	1$
2$:
		call	.I_trans_Z		
		br	.NodispFormul
1$:			
		call	ChkDispAns		 
.DoSdRegMode:
.NoEquCalc:	
		
;;;;set equ flag is 08h		
		lda	#>.SFlag		 
		sta	PP							
		lda 	.SFlag
		ora	#08h			;08=EQU
		sta 	.SFlag			
.DislayMode:	
		lda0	.keyPos
		cmpe	#0h
		brz	.EmitKeyD		

;Begin Calculate form Syntax->Posfix->PosValue->ChkDispAns->ShowAnschk						
					;.Close INT
		call	.AutoaddANS
;;;;;;.DispPari Choice Parity display (dms ,fract, normal)		
		call	.DispPari
		lda0	.keyPos
		cmpe	#0c3h			;c3=ab/c
		brz	.JudgeFract
		cmpe	#0b7h			;b7=dms
		brnz	.SyntaxFormula
		lda	#>.SFlag
		sta	PP
		lda	.SFlag
		anda	#30h			;30=RCL & STO
		brz	.Point2DMS		
.SyntaxFormula:			
;;FormulaMode
;-------------------------------------------
;;SyntaxFormula		
		lda0	.FormulaFlag
		cmpe	#01h
		brz	.GetMdata
		call	.FormulaCk		 
		lda0	ErrorFlag
		cmpe	#0h
		brnz	.CheckErrorFlag
		lda	#>.SFlag
		sta	PP
		lda	.SFlag
		anda	#80h			;80 =CALc MODE
		brz	.NormalSyntax
.GetMdata:		
		lda0	.StoFlag
		cmpe	#01h
		brz	.ChkInpData		;CHECK DATA IS EMPTY FOR FORMULA
		br	.Showformula
.ChkInpData:
		lda0	.DataDP
		cmpe	#0h
		brnz	.NormalSyntax
		lda	#0h			;stoflag 0 =input ok 1= need input
		sta0	.StoFlag	
		br 	.EmitKeyD 
.Showformula:		
		call	.GetMemData		;get Memory variable
		lda	#>.SFlag
		sta	PP
		lda	.SFlag
		anda	#80h			;80=Calc mdoe
		brz	.NormalSyntax	
		lda	#01h
		sta0	.StoFlag
		call	ChkDispAns
		call	ShowAnschk
		call	CalDispLib
		br	.EmitKeyD					
.NormalSyntax:	
;;;;Comp SD mode
;-------------------------------------------
		lda	#>StateFlag
		sta	PP
		lda	StateFlag
		anda	#08h
		brnz	.BasePosfix		
		call	.Syntax
		lda0	ErrorFlag
		cmpe	#0h
		brnz	.CheckErrorFlag		
		call	.Postfix		
		br	.ChkPSError
;;;;BaseN
;-------------------------------------------		
.BasePosfix:
		call	.Basensyntax
		lda0	ErrorFlag
		cmpe	#0h
		brnz	.CheckErrorFlag	
		call	.BaseNPosfix
		lda0	ErrorFlag
		cmpe	#0h
		brnz	.DispDotMatrix		
;-------------------------------------------		
.ChkPSError:	
		 
		lda0	ErrorFlag
		cmpe	#0h
		brnz	.DispDotMatrix		
		lda	#01h		;STO Check
		sta	PP				
		lda	.SetFlag	;SetFlag 20 is dispmode
		anda	#~20h
		sta	.SetFlag
		lda	T1Flag		;Set Flash underline off
		ora	#80h
		sta	T1Flag
		lda	#00h
		sta	t1count
		call	T1chkblank	;-----Blankcheck		
		lda	.SetFlag
		ora	#20h
		sta	.SetFlag	
;;;;;;;calc posfix data value  ;;;;;;;;;;;;;;;;;;;
			  				
		call	.PosValue		
.ModeDisp:		
		lda0	ErrorFlag
		cmpe	#0h
		brnz	.CheckErrorFlag
		lda	#>.SetFlag
		sta	PP
		lda	.SFlag
		anda	#80h
		brnz	.JudgeFract
		lda	#0h
		sta0	.ForMulaFlag
.JudgeFract:		
		lda	.SetFlag
		anda	#18h
		brz	.CheckCarryZ				
		call	.I_trans_X
		lda	#0h
		sta0	OperandX+7		
		call	Fract
		call	.TransFract
;;;;No calculate data only display OperandZ result
.CheckCarryZ:	
;;;;;;;;;Adjust	data value last bit carry
		lda	#01h
		sta	PP
		lda	.SetFlag
		anda	#0ch
		cmpe	#08h
		brz	.SetFractToPoint
		cmpe	#04h
		brz	.Point2DMS	 	
		br	.SetFractToPoint
.CheckErrorFlag:
		lda0	.FormulaFlag
		cmpe	#01h
		brnz	.DispDotMatrix
		lda	#0h
		sta0	.StoFlag
		sta0	.FormulaFlag
		lda	#>.SFlag
		sta	PP
		lda	.SFlag
		anda	#~80h
		sta	.SFlag	
		br	.DispDotMatrix			
.Point2DMS:
		call	.PointToDMS		 
.SetFractToPoint:				
		call	.Carry
		lda	#0h
		sta0	OperandZ+7						
.OnlyDisp:													
		call	ChkDispAns		
		lda0	ErrorFlag
		cmpe	#0h
		brnz	.CheckErrorFlag	
		lda0	.FormulaFlag
		cmpe	#01h
		brz	.NodispFormul
		call	ShowAnschk
.NodispFormul:					
		lda	#01h		;;;STO MemORY Check
		sta	PP		
		lda	.SetFlag
		ora	#20h
		sta	.SetFlag		
		lda	.SFlag
		anda	#30h				
		cmpe	#10h
		brz	.STOMemory			
		lda0	.KeyPos
		cmpe	#.MADD
		brz	.M_ADD
		cmpe	#.MSUB
		brz	.M_SUB
		cmpe	#0h		
		br 	.EmitKeyD
.EnterErr:
		lda0	.CommaFlag
		cmpe	#0h		 
		brz	.DoSdRegMode
		lda	#02h
		sta0	ErrorFlag
		br	.CheckErrorFlag		
 
;;;;;;;;;Save Input data to Ram				
.SaveInputData:		
		lda	#>.SetFlag
		sta	PP
		lda	.SetFlag
		anda	#80h
		brz	.Normalinput
		lda	.SetFlag
		anda	#~80h
		sta	.SetFlag
		lda0	.KeyPos			
		cmpe	#0a4h			;+
		brz	.OnlyDisp
		cmpe	#0a5h			;-
		brz	.OnlyDisp
;;;Store data
.Normalinput:	
		lda0	.SFDP
		cmpe	#0h
		brnz	.DispDotMatrix		
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAX input data is 79 step					
		lda0	.DataDP
		cmpe	#79			
		brc	.DispDotMatrix			
		lda0	.KeyPos
		sta	font		
		call	.StoData
		lda0	.keyPos
		cmpe	#.DaltaX		;For LR Mode
		brz	.CalcEstimateXY
		cmpe	#.DaltaY		;For LR Mode
		brz	.CalcEstimateXY
;;;;;;Display DotMatrix Font			 
.DispDotMatrix: 		
		call	CalDispLib		;,DispDotMatrix

⌨️ 快捷键说明

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