📄 disp.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 + -