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

📄 rmbscr.asm

📁 8051单片机汇编语言编写的银行汇率屏程序。使用红外遥控器修改利率。
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;** 人民币汇率屏程序 *************************************************
	r2864dph   equ	20h	;2864 DPTR保存单元
	r2864dpl   equ	21h
	ledydph    equ	22h	;LED DPTR保存单元
	ledydpl    equ	23h

	ledlight   equ	24h	;一行LED点亮延时时间
	leddark    equ	25h	;一行LED熄灭延时时间
	ddotflash  equ	26h	;秒闪标志: 00h--亮, 0ffh--黑
	t0times	   equ	27h	;T0中断次数
	int1times  equ	28h	;INT1中断次数
	numchar    equ	29h	;当前修改字符在块中的顺序号
	data4	   equ	2ah
	data3	   equ	2bh
	data2	   equ	2ch
	data1	   equ	2dh
	data0	   equ	2eh
	manualtime equ	2fh

	minute	   equ	30h	;分
	hour	   equ	31h	;时
	week	   equ	32h	;星期
	day	   equ	33h	;日
	month	   equ	34h	;月
	year	   equ	35h	;年
	yearh	   equ	36h	;年高位
	
	modify	   equ	37h	;遥控修改标志: 00h--正常显示状态,0ffh--修改状态
	flashmark  equ	38h	;显示闪烁标志: 00h--亮; 0ffh--暗
	adjtime    equ	39h	;时间校准标志: 00h--未处于时间校准状态, 0ffh--处于时间校准状态
	switch	   equ	3ah	;定时开关机标志: 00h--处于开机状态, 0ffh--处于关机状态
	modiline   equ	3bh	;修改数据所在行数
	modicolu   equ 	3ch	;修改数据所在列数	
	modi2864l  equ	3dh	;修改数据所在2864单元地址(低位)
	modi2864h  equ	3eh	;修改数据所在2864单元地址(高位)
		
	coderam0   equ	40h	;输入遥控码1
	coderam1   equ	41h     ;输入遥控码2
	coderam2   equ	42h	;输入遥控码3
	coderam3   equ	43h	;输入遥控码4

	tmp0	   equ	48h	;临时单元
	tmp1	   equ	49h	;临时单元
	tmp2	   equ	4ah	;临时单元
	tmp3	   equ	4bh	;临时单元
	tmp4	   equ	4ch	;临时单元
	tmp5	   equ	4dh	;临时单元
	tmp6	   equ	4eh	;临时单元
	tmp7	   equ	4fh	;临时单元
	tmp8	   equ	50h	;临时单元
	tmp9	   equ	51h	;临时单元
	tmpa	   equ	52h	;临时单元
	tmpb	   equ	53h	;临时单元
	tmpc	   equ	54h	;临时单元
	tmpd	   equ	55h	;临时单元
	tmpe	   equ	56h	;临时单元
	tmpf	   equ	57h	;临时单元
	
	tmpth1	   equ	58h	
	tmptl1	   equ	59h	

	ram2864add equ	6000h	;2864起始地址
	ledadd	   equ	0ff00h	;LED 列起始地址

	usercode   equ	00h	;用户码
	code0	   equ	10h	;"0"的遥控码
	code1	   equ	0c0h	;"1"的遥控码
	code2	   equ	18h	;"2"的遥控码
	code3	   equ	60h	;"3"的遥控码
	code4	   equ	0e0h	;"4"的遥控码		
	code5	   equ	20h	;"5"的遥控码
	code6	   equ	08h	;"6"的遥控码
	code7	   equ	0f0h	;"7"的遥控码
	code8	   equ	28h	;"8"的遥控码
	code9	   equ	38h	;"9"的遥控码
	codedot	   equ	78h	;"."的遥控码
	codedark   equ	50h	;dark
	codeleft   equ	30h	;"←"的遥控码
	coderight  equ	58h	;"→"的遥控码
	codeup     equ	70h	;"↑"的遥控码
	codedown   equ	0b8h	;"↓"的遥控码
	codestart  equ	80h	;"复位"的遥控码
	codeltinc  equ	0b0h	;"亮度调整+"的遥控码
	codeltdec  equ	98h	;"亮度调整-"的遥控码
	codetime   equ	0d8h	;"时间校准"的遥控码
	codeonoff  equ	00h	;"开/关机"的遥控码
;*********************************************************************
	org	0000h
	ljmp	0100h
	
	org	0003h
	ljmp	timeint
	
	org	000bh
	ljmp	timer0
	
	org	0013h
	ljmp	remote

	org	001bh
	ljmp	timer1
	
;*********************** 人民币汇率显示屏程序 ************************
;*********************************************************************
;** INIT: 程序初始化 *************************************************
		org	0100h
init:		mov	sp,#60h		
		mov	psw,#0
		mov	ie,#00001010b		;允许T0,T1,EX0,EX1中断
		mov	ip,#00000100b		;EX1为最高级中断
		mov	tcon,#00000101b		;设置EX0,EX1为负沿触发
		mov	tmod,#00010001b		;T0,T1为定时方式1
		setb	p1.4			;禁止行译码
		mov	modify,#00h		;遥控修改标志: 00h--正常显示状态, 0ffh--修改状态
		mov	flashmark,#00h	  	;显示闪烁标志: 00h--亮, 0ffh--暗
		mov	modiline,#0 		;修改数据所在行数--0行
		mov	modicolu,#0  		;修改数据所在列数--0列	
		mov	ledlight,#130		;初始化LED 亮延时--2ms
		mov	leddark,#75		;初始化LED 暗延时--0.9ms(+0.5ms)
		mov	adjtime,#00h
		mov	t0times,#0		;初始化T0中断次数
		mov	int1times,#0		;初始化INT1中断次数
		mov	numchar,#0		;当前修改字符在块中的顺序号置0
		mov	switch,#00		;开机
		mov	manualtime,#00h
		mov	coderam0,#0
		mov	coderam1,#0
		mov	coderam2,#0
		mov	coderam3,#0
		
		mov	dptr,#800ah		;初始化12887寄存器A,B
		mov	a,#00101111b		;打开12887晶振,允许周期中断
		movx	@dptr,a	
		inc	dptr
		mov	a,#01100010b		;允许周期中断,每分钟定闹中断,24小时模式,BCD码
		movx	@dptr,a
		mov	dptr,#8001h		;每分钟产生1次定闹中断
		mov	a,#0			
		movx	@dptr,a
		mov	a,#0ffh
		inc	dptr
		inc	dptr
		movx	@dptr,a
		inc	dptr
		inc	dptr
		movx	@dptr,a
		mov	dptr,#800ch		;读寄存器C
		movx	a,@dptr
		lcall	readtime
		lcall	disptime

		setb	ea			;开中断
		setb	ex0
		setb	ex1

;** DISPLAYLED: 显示有关数据 *****************************************
displayled:	mov	dptr,#ram2864add	;2864初始地址
		mov	r2864dph,dph
		mov	r2864dpl,dpl
		setb	p1.4
		anl	p1,#11110000b		;行译码初始地址
		mov	r6,#0			;初始化当前显示的块数
		mov	r7,#0			;初始化当前显示的行数
		mov	r3,#11			;总显示行数--11行
showled0:	mov	dptr,#ledadd		;列译码初始地址
		mov	ledydph,dph
		mov	ledydpl,dpl
		mov	r4,#3			;显示块数--3块
showled1:	mov	r5,#5			;显示列数,每块5列
if_modify:	mov	a,modify		;是否处于修改状态
		cjne	a,#00h,modidata
		ljmp	displed0		;处于正常显示状态
modidata:	mov	a,adjtime		;是否处于时间校准状态
		cjne	a,#00h,displed0
		mov	a,r7			;修改数据
		cjne	a,modiline,displed0	;当前行是否闪烁行
		mov	a,r6
		cjne	a,modicolu,displed0	;当前列是否闪烁列
		mov	a,numchar
		cjne	a,#0,getmodidata
		mov	a,r5
		cjne	a,#1,displed0
		mov	a,flashmark
		cjne	a,#0ffh,displed0	;比较闪烁标志
		mov	a,#01h
		ljmp	modidptr
getmodidata:	mov	a,r5
		cjne	a,#5,ifmoda1
		mov	a,data4
		ljmp	modidptr
ifmoda1:	cjne	a,#4,ifmoda2
		mov	a,data3
		ljmp	modidptr
ifmoda2:	cjne	a,#3,ifmoda3
		mov	a,data2
		ljmp	modidptr
ifmoda3:	cjne	a,#2,moda4
		mov	a,data1
		ljmp	modidptr
moda4:		mov	a,flashmark
		cjne	a,#00h,datadark
		mov	a,data0
		ljmp	modidptr
datadark:	mov	a,#01h
modidptr:	mov	dph,r2864dph		;2864数据送显
		mov	dpl,r2864dpl
		inc	dptr
		mov	r2864dph,dph		;保存2864的DPTR
		mov	r2864dpl,dpl
		ljmp	displed1
displed0:	mov	dph,r2864dph		;2864数据送显
		mov	dpl,r2864dpl
		movx	a,@dptr			
		inc	dpl
		mov	r2864dph,dph		;保存2864的DPTR
		mov	r2864dpl,dpl
displed1:	mov	dph,ledydph
		mov	dpl,ledydpl
		movx	@dptr,a
		inc	dpl
		mov	ledydph,dph		;保存LED的DPTR
		mov	ledydpl,dpl
		djnz	r5,jmpif_modify		;是否1块已送数完毕
		ljmp	end_colu
jmpif_modify:	ljmp	if_modify		
end_colu:	inc	r6			;块数加1
		inc	dptr			;修改下一块LED的DPTR
		inc	dptr
		inc	dptr
		mov	ledydph,dph		;保存LED的DPTR
		mov	ledydpl,dpl
		djnz	r4,jmpshowled1		;是否一行已送数完毕
		ljmp	oeline
jmpshowled1:	ljmp	showled1		
oeline:		lcall	darkdelay
no_darkled:	clr	p1.4			;行译码选通,点亮LED
		lcall	lightdelay		;亮延时
		setb	p1.4			;熄灭LED
		inc	p1			;行地址指向下一行
		mov	r6,#0			
		inc	r7			;行数加1
		djnz	r3,jmpshowled0
		ljmp	checkswitch
jmpshowled0:	ljmp	showled0
checkswitch:	mov	a,switch
		cjne	a,#00h,offled
		setb	p3.1
		nop
		clr	p3.1
		ljmp	displayled
offled:		clr	p1.7
		setb	p1.4
		clr	p3.1
		mov	r1,#13			;off time
		mov	r0,#tmp0
		mov	a,#0ah
offtimedata:	mov	@r0,a
		inc	r0
		djnz	r1,offtimedata
		mov	r1,#13			
		mov	r0,#tmp0
offtime:	mov	a,@r0
		lcall	shiftbit		
		inc	r0
		djnz	r1,offtime
		setb	p3.1
		mov	a,switch
		cjne	a,#00h,offled
		lcall	readtime
		lcall	disptime
		ljmp	displayled

;** DARKDELAY: 亮度调节子程序--LED熄灭********************************
;** 入口参数: leddark--亮度调节参数,在遥控中断中设置 *****************
darkdelay:	mov	47h,leddark
		mov	a,47h
		cjne	a,#0,darkloop
		ret
darkloop:	nop				;10us延时
		nop
		nop
		nop
		djnz	47h,darkloop
		ret

;** LIGHTDELAY: 亮度调节子程序--LED点亮 ******************************
;** 入口参数: ledlight--亮度调节参数,在遥控中断中设置 ****************
lightdelay:	mov	r0,ledlight
lightloop:	nop				;10us延时
		nop
		nop
		nop
		djnz	r0,lightloop
		ret
		
;** TIMER0: 定时器0中断--400ms中断一次,确定闪烁频率*******************
timer0:		push	acc
		push	dph
		push	dpl
		mov	th0,#94h
		mov	tl0,#94h
		mov	a,t0times
		cjne	a,#10,midtime
		mov	t0times,#0
		mov	a,flashmark
		cjne	a,#00h,rstflash
		mov	flashmark,#0ffh
		ljmp	exittimer0
rstflash:	mov	flashmark,#00h
		ljmp	exittimer0
midtime:	inc	t0times
exittimer0:	pop	dpl
		pop	dph
		pop	acc
		reti

;** TIMEINT: 时钟中断程序 ********************************************
timeint:	push	acc			;保护现场
		push	psw
		push	dph
		push	dpl
		push	b
		setb	rs0			;选择寄存器区1
		clr	rs1
		mov	dptr,#800ch		;读寄存器C
		movx	a,@dptr
		mov	r7,a			
		mov	a,adjtime
		cjne	a,#0ffh,no_adjust
		ljmp	renewtime
no_adjust:	lcall	readtime
		mov	a,hour			;是否6:30分(开机时间)
		cjne	a,#06h,if_21h
		mov	a,minute
		cjne	a,#30h,next
		mov	switch,#00h
		ljmp	next
if_21h:		cjne	a,#21h,next
		mov	a,minute
		cjne	a,#30h,next
		mov	switch,#0ffh
next:		mov	a,switch
		cjne	a,#0ffh,next1
		ljmp	exitclock
next1:		mov	a,r7
		jnb	acc.5,cycleint		;判断是定闹中断还是周期中断
		jnb	acc.6,renewtime		;是否还有周期(500ms)中断
		lcall	flashdot		;秒闪
renewtime:	lcall	disptime		;时间,日期更新
		ljmp	exitclock
cycleint:	lcall	flashdot		;秒闪
exitclock:	pop	b
		pop	dpl
		pop	dph
		pop	psw
		pop	acc
		reti

;** flashdot: 秒闪子程序 *********************************************
flashdot:	mov	a,ddotflash
		cjne	a,#00h,dotdark
		mov	ddotflash,#0ffh
		setb	p1.7
		ret
dotdark:	mov	ddotflash,#00h
		clr	p1.7
		ret
		

;** DISPTIME: 时间显示子程序 *****************************************
disptime:	mov	a,week
		cjne	a,#7,no_sunday		;是否星期日
		mov	week,#8
no_sunday:	mov	a,year
		cjne	a,#97h,if_2000		;是否21世纪
cen21s:		mov	yearh,#20h
		ljmp	changebcd
if_2000:	jc	cen21s
		mov	yearh,#19h
changebcd:	mov	a,minute		;分钟压缩bcd码转换成bcd码
		mov	r0,#tmp0
		lcall	cbcd_bcd
		mov	a,hour			;小时压缩bcd码转换成bcd码
		lcall	cbcd_bcd
		mov	a,week
		mov	@r0,a
		inc	r0
		mov	a,day			;日期压缩bcd码转换成bcd码
		lcall	cbcd_bcd
		mov	a,month			;月份压缩bcd码转换成bcd码
		lcall	cbcd_bcd
		mov	a,year			;年压缩bcd码转换成bcd码
		lcall	cbcd_bcd
		mov	a,yearh			;年高位压缩bcd码转换成bcd码
		lcall	cbcd_bcd		
		mov	a,adjtime
		cjne	a,#0ffh,nordisp		;是否处于调整状态
		mov	a,ddotflash
		cjne	a,#0ffh,ledladj
		mov	ddotflash,#0
		mov	a,modicolu
		cjne	a,#0,if_tcolu1		
		mov	tmpa,#0ah		;年份闪烁		
		mov	tmp9,#0ah
		ljmp	nordisp
if_tcolu1:	cjne	a,#1,if_tcolu2
		mov	tmp8,#0ah		;月份闪烁
		mov	tmp7,#0ah
		ljmp	nordisp
if_tcolu2:	cjne	a,#2,if_tcolu3
		mov	tmp6,#0ah		;日期闪烁
		mov	tmp5,#0ah
		ljmp	nordisp

⌨️ 快捷键说明

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