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

📄 disp.asm

📁 51单片机时钟 和18B20 温度的 LED显示
💻 ASM
字号:
//================================================================
//功能:	数码管动态显示驱动
//函数:F_Disp_Drv(unsigned int Content,unsigned int StartBit)
//参数:Content--要显示的内容;StartBit--显示的开始位
//设计:ZM
//日期:07/1/*
//注意:连接时位选低位接数码管低位,高位位选接数码管的高位
//连接说明:IOB0~7连接数码管段选,IOB8~11连接数码管的位选
//================================================================
//NOTICE:
//	如自己用万能版焊接,则位选信号为"低电平"选中相应数码管
//	如果使用陵阳的键盘显示模组,则位选信号高电平选中相应的数码管
//================================================================
.include SPCE061A.inc
//================================================================
.define Bit 		0x0f00	//设定数码管的位选(8 ~ 11位)
.define Segment		0x00ff	//设定数码管的段选(0 ~ 7位)
//================================================================
.define DispData	P_IOB_Data
.define DispDir		P_IOB_Dir
.define DispAttrib	P_IOB_Attrib
.define DispBuffer	P_IOB_Buffer
//================================================================
//共阴字符表
.ram
  .var H_bit,L_bit

.data
 DispTable: .DW 0x003F,0x0006,0x005B,0x004F,0x0066 			//0、1、2、3、4
			.DW 0x006D,0x007D,0x0007,0x007F,0x006F,0x0000 	//5、6、7、8、9,全灭

.code
//==================================================
//功能:显示I/O初始化
//调用:F_DispIO_Initial()
//参数:无
//设计:ZM
//日期:07/5/26
//==================================================
.public _F_DispIO_Initial
_F_DispIO_Initial:
	r1=[DispDir]
	r1=r1|(Bit|Segment)
	[DispDir]=r1
	r1=[DispAttrib]
	r1=r1|Segment
.ifdef KeyDispMode		//如果使用键盘显示模组,则定义位选为同向输出
	r1=r1|Bit
.endif
	r1=r1&(~Bit)		//如果没有使用模组,则定义位选为反向输出
	[DispAttrib]=r1
	r1=[DispBuffer]
	r1=r1&(~(Segment|Bit))	//全部数码管都熄灭
	[DispData]=r1
	retf
//===================================
//r1=要显示的数值
//r2=要显示的第一位所连接的位置
//可以显示两位
//==================================
.Public _F_Disp_Drv
_F_Disp_Drv:
	push r1 to [sp]
	push bp to [sp]
	bp=sp+2
	r1=[bp+3] 
	r2=[bp+4]
	r3=1
	cmp r2,0xffff	//如果要显示的内容是0xffff,表示要让数码管无显示
	je ?NoDisp
	call BCD_Convert
	call Search_Table
	jmp ?loop
?NoDisp:
	r4=0x0000
	[L_bit]=r4
	[H_bit]=r4
?loop:	
	cmp r3,2	//当count(r3)的值为1,r2为低位的位选;当count(r3)为2,r2为高位的位选
	je	?H
	r1=r2|[L_bit]		//低位数码管的位选(r2)+要显示的内容(L_bit)
	jmp ?XS
?H:
	r1=r2|[H_bit]		//高位数码管的位选(r2)+要显示的内容(H_bit)
?XS:	
	r4=[P_IOB_Buffer]
	r4=r4&(~(Bit|Segment))	//让原来显示的内容全部都清除
	r4=r4|r1
	[P_IOB_Data]=r4			//显示新的内容
	r2=r2 lsl 1
	r3+=1
	cmp r3,2
	jna ?loop
	pop bp from [sp]
	pop r1 from [sp]
	retf

//=======================================
//功能:	BCD码转换
//入口参数:R1要转换的数值
//=======================================
.public BCD_Convert
BCD_Convert:
	push r2 to [sp]
	r2=0
?loop:
	r1-=10					//十位
	r2+=1
	cmp r1,10		
	jae ?loop				//如果仍然大于10,继续减
	[H_bit]=r2				//r2存放十位
	[L_bit]=r1				//r1剩下的数,小于10,为个位
	pop r2 from [sp]
	retf
	
.public Search_Table
Search_Table:
	push r2 to [sp]
	bp=DispTable			//bp指向显示表
	bp+=[L_bit]				//查个位
	r2=[bp]
	[L_bit]=r2				//[L_bit]现在内容为转换后的段显码
	bp=DispTable			//bp指向显示表
	bp+=[H_bit]				//查十位
	r2=[bp]				
	[H_bit]=r2				//[H_bit]现在的内容为转换后的段显码
	pop r2 from [sp]
	retf	

⌨️ 快捷键说明

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