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

📄 sji.asm

📁 出租车记费器
💻 ASM
字号:
	ORG	0000H
	LJMP	MAIN				;上电跳主程序
	ORG	000BH				;T0中断入口
    LJMP	IT0P				; 跳T0中断服务入口
	ORG	001BH				;T1中断入口
	LJMP	IT1P				;跳T1中断服务入口
	ORG	0030H
MAIN:
	MOV	TMOD,#00010101B			;设T1为方式1定时,T0为方式1计数
	MOV	TH1,#3CH			;给T1装入定时初值
	MOV	TL1,#0B2H			
	
	MOV	TH0,#0FEH			;给T0装入计数初值
	MOV	TL0,#0C8H
	
	SETB	ET1				;允许T1申请中断
	SETB	TR1				;启动T1
	SETB	ET0				;允许T0申请中断
	SETB	PT0				;计数器T0定义为高优先级中断		
	CLR	PT1				;定时器T1定义为低优先级中断
	SETB	EA				;CPU开中断
	MOV	50H, #16H			;单价初始化
	MOV	20H, #20			;中断次数为20H单元
	MOV	30H,#15H			;时钟显示单元初始化
	MOV	31H,#00H			
	MOV	32H,#00H
	MOV	40H, #00H			;总金额初始化
	MOV	41H, 60H
	
	
AGAIN:	
	JB	P1.1, BUTIAO			;判断是否S2键按下了,没按下,就转入BUTIAO
	LCALL 	SHOW				;否则调显示
	LCALL 	SHOW
	LCALL 	SHOW
	LCALL 	SHOW
	LCALL 	SHOW
	LCALL  	SHOW
	LCALL 	SHOW

	JB	P1.1, BUTIAO			;再次判断S2是否按下了,否则就转入BUTIAO
	CLR	TR0				;S2真的按下了,关计数器T0中断
	MOV	A, #01H				;单价加0.1
	ADD	A, 50H				
	DA 	A				;单价单元十进制调整
	MOV	50H, A				;单价单元的BCD码存回单价单元
	CJNE	A, #99H, CHECK			;是否到9.9元,不到则转入键检查程序
	MOV	50H, #00H			;计满9.9元,单价单元清零
CHECK:	JB	P1.1, CHECK			;S2没按下,则继续检查
	LCALL 	SHOW				;S2按下,继续调用显示
	LCALL	  SHOW
	LCALL 	SHOW
	LCALL	 SHOW
	LCALL 	SHOW
	LCALL 	SHOW
	LCALL 	SHOW
	JB	P1.1, CHECK			;S2没按下吗? 继续检查
	SETB	TR0				;启动T0
	LJMP	BUTIAO				;跳到BUTIAO,判断S1是否按下
				
BUTIAO:	
	JB	P1.0, CLOCK			;S1没按下,转入时钟子程序
	SETB	TR0				;S1按下,启动T0中断
	LCALL	 CHAI2				;调用金额单价拆分子程序
	LJMP	GOON				;返回继续判键
CLOCK:	
	LCALL 	CHAI1				;调用时钟拆分子程序
	CLR	TR0				;停止T0计数
	MOV	41H, #60H			;重新给总金额赋初值
	MOV	40H, #00H
GOON:	
	LCALL 	SHOW				;调用显示子程序
	LJMP	AGAIN				;返回继续判键
	
	
	
CHAI2:	
	PUSH	PSW				;保护现场
	PUSH	ACC
	MOV	A,41H				;41H赋给A  
	ANL	A,#0F0H				;取41H单元的高位赋给A
	SWAP	A				
	MOV	DPTR,#TAB			;查段码表
	MOVC	A,@A+DPTR		        ;取字形码
	INC	A				;加上小数点位
	MOV	34H,A				;把累加器中的值赋给34H
	
	
	MOV	A,41H				;取41H的低位赋给35H
	ANL	A,#0FH
	MOV	DPTR,#TAB
	MOVC	A,@A+DPTR
	MOV	35H,A
	
	MOV	A, 40H				;取40H的低位赋给33H
	ANL	A, #0FH
	MOV	DPTR, #TAB
	MOVC	A, @A+DPTR
	MOV	33H, A
	

	MOV	36H, #02H			;36H单元送一“-”
	
	MOV	A, 50H				;取50H单元的高位给累加器
	ANL	A, #0F0H
	SWAP	A
	MOVC	A, @A+DPTR
	INC	A				;累加器值加1,即加上小数点
	MOV	37H, A				;带小数点的累加器的值赋给37H
	MOV	A, 50H				;将50H低位赋给38H
	ANL	A, #0FH
	MOVC	A, @A+DPTR
	
	MOV	38H, A  
	POP	ACC				;恢复现场,
	POP	PSW	
	RET					;单价金额拆分子程序返回
	
			
CHAI1:
	PUSH	PSW				;保护现场
	PUSH	ACC
	MOV	A,30H				;30H的高位赋给33H
	ANL	A,#0F0H
	SWAP	A
	MOV	DPTR,#TAB
	MOVC	A,@A+DPTR
	MOV	33H,A
	
	MOV	A,30H				;30H的低位赋给34H
	ANL	A,#0FH
	MOV	DPTR,#TAB
	MOVC	A,@A+DPTR
	MOV	34H,A
	
	
	
	MOV	A,31H				;31H的高位赋给35H 
	ANL	A,#0F0H	
	SWAP	A
	MOV	DPTR,#TAB
	MOVC	A,@A+DPTR
	MOV	35H,A
	
	MOV	A,31H				;31H的低位赋给36H
	ANL	A,#0FH
	MOV	DPTR,#TAB
	MOVC	A,@A+DPTR
	MOV	36H,A
	
	
	
	MOV	A,32H				;32H的高位赋给37H
	ANL	A,#0F0H
	SWAP	A
	MOV	DPTR,#TAB
	MOVC	A,@A+DPTR
	MOV	37H,A
	
	MOV	A,32H				;32H的低位赋给38H
	ANL	A,#0FH
	MOV	DPTR,#TAB
	MOVC	A,@A+DPTR
	MOV	38H,A
	POP	ACC				;恢复现场
	POP	PSW
	RET					;时钟拆分子程序返回


IT1P:	
	PUSH	PSW				;T1中断服务程序入口,保护现场
	PUSH	ACC
	MOV	TH1,#3CH			;重新给T1装入初值
	MOV	TL1,#0B0H
	DJNZ	20H,RETURN		        ;1秒未到,返回
	MOV	20H,#20				;1秒时间到,重置中断次数
	MOV	A,#01H				;秒单元加1
	ADD	A,32H					
	DA	A				;秒单元十进制调整
	MOV	32H,A				;秒的BCD码存入秒单元
	CJNE	A,#60H,RETURN 	 		;是否到60秒,未到则返回
	MOV	32H,#00H			;计满60秒,妙单元清零
	
	MOV	A,#01H				;分单元加1
	ADD	A,31H				
	DA	A				;分单元十进制调整
	MOV	31H,A				;分的BCD码存入分单元
	CJNE	A,#60H,RETURN			;是否到60分,未到则返回
	MOV	31H,#00H			;计满60分,分单元清0
	
	MOV	A,#01H				;小时单元加1
	ADD	A,#30H				
	DA	A				;小时单元十进制调整
	MOV	30H,A				;小时单元的BCD码存入小时单元
	CJNE	A,#24H,RETURN			;是否到24时,未到则返回
	MOV	30H,#00H			;计满24时,小时单元清零
RETURN:
	POP	ACC    				;恢复现场
	POP	PSW
	RETI					;中断返回
	
IT0P:	PUSH	PSW				;T0中断服务程序入口
	PUSH	ACC				
	CLR	TR0				;停止T0计数
	MOV	TH0,#0FEH			;T0置初值
	MOV	TL0,#0B2H
	MOV	A, 50H				;把单价放入累加器
	ADD	A, 41H				;跟总金额相加
	DA	A					;总金额进行十进制调整
	MOV	41H, A				;总金额的BCD码存入41H
	JC	JINWEI				;有进位则转入进位子程序
	LJMP	NO				;否则,返回继续
JINWEI:
	MOV	A, #01H				;40H单元加1	
	ADD	A, 40H			
	DA	A				;十进制调整
	MOV	40H, A				;再存入40H单元
	CJNE	A, #10H, NO			;判断是否等于10,不等则恢复现场,中断返回
	MOV	40H, #00H			;相等则清零
	LJMP	NO	
NO:	
	POP	ACC      			;恢复现场
	POP	PSW	
	RETI					;中断返回

	
		
	
SHOW:	
	PUSH	PSW				;保护现场
	PUSH	ACC				
	CLR	P1.6				;选择LED第一位
	SETB	P1.5
	CLR	P1.4
	MOV	DPTR, #0FD00H			;扫描模式置初值
	MOV	A, 38H				;取第一位显示收据
	MOVX	@DPTR, A			;段数据送P0口
	LCALL 	DELAY				; 调用延时子程序
	
	CLR	P1.4				
	SETB	P1.5
	SETB	P1.6
	MOV	A,37H				;取第二位显示数据
	MOVX    @DPTR,A				;段数据送P0 口
	LCALL 	DELAY				;调用延时子程序 
	
	
	SETB	P1.4
	CLR	P1.5
	CLR	P1.6
	MOV	A,36H				;取第三位显示数据
	MOVX	@DPTR,A				;段数据送P0口
	LCALL 	DELAY				;调用延时子程序
	
	
	SETB	P1.4
	CLR	P1.5
	SETB	P1.6
	MOV	A,35H				;取第四位显示数据
	MOVX	@DPTR,A				;段数据送P0口
	LCALL	 DELAY				;调用延时子程序
	
	
	SETB	P1.4
	SETB	P1.5
	CLR	P1.6
	MOV	A,34H				;取第五位显示数据
	MOVX	@DPTR,A				;段数据送P0口
	LCALL	 DELAY				;调用延时子程序

	SETB	P1.4
	SETB	P1.5
	SETB	P1.6
	MOV	A,33H				;取第六位显示数据
	MOVX	@DPTR,A				;段数据送P0 口
	LCALL 	DELAY				;调用延时子程序

	POP	ACC
	POP	PSW	
	RET
	
	
DELAY:	MOV	R3,#02H				;0.5MS延时子程序
DELAY2: MOV    	R4,#0FFH
        DJNZ	R4,$
	DJNZ	R3,DELAY2
	RET
TAB:						;共阴极LED段码表
	DB	0FCH,60H,0DAH,0F2H,66H			
	DB	0B6H,0BEH,0E0H,0FEH,0F6H
end


 

⌨️ 快捷键说明

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