📄 dig.asm
字号:
//====================================================================================
//文件名:DIG.asm
//功能描述:数码管显示及LED灯点亮驱动程序
//维护记录:2006年9月28 by hongyan.Feng
//====================================================================================
//------------------用户只需要修改下面定义即可改变控制端口---------------------------------------//
//===============================数码管及LED灯段选定义===========================//
//.DEFINE SEG_IO_Port 0 //若LED段选用IOA则采用该定义
.DEFINE SEG_IO_Port 1 //若LED段选用IOB则采用该定义
.DEFINE SEG_Data 0 //若LED段选用I/O口低8位则用该定义
//.DEFINE SEG_Data 1 //若LED段选用I/O口高8位则用该定义
//===============================数码管及LED灯位选定义===========================//
.DEFINE DIG_IO_Port 0 //若数码管及LED管位选选用IOA则采用该定义
//.DEFINE DIG_IO_Port 1 //若数码管及LED管位选选用IOB则采用该定义
//-------------------------------------------------------------------------------------------------//
//================================================================================
//数码管及LED段选I/O口定义
//================================================================================
.IF SEG_IO_Port==0
.DEFINE P_SEG_Data 0x7000
.DEFINE P_SEG_Buffer 0x7001
.DEFINE P_SEG_Dir 0x7002
.DEFINE P_SEG_Attrib 0x7003
.ELSE
.DEFINE P_SEG_Data 0x7005
.DEFINE P_SEG_Buffer 0x7006
.DEFINE P_SEG_Dir 0x7007
.DEFINE P_SEG_Attrib 0x7008
.ENDIF
.IF SEG_Data==0
.DEFINE P_SEG_Byte 0x00ff
.ELSE
.DEFINE P_SEG_Byte 0xff00
.ENDIF
//=================================================================================
//数码管及LED位选I/O口定义
//=================================================================================
.IF DIG_IO_Port==0
.DEFINE P_DIG_Data 0x7000
.DEFINE P_DIG_Buffer 0x7001
.DEFINE P_DIG_Dir 0x7002
.DEFINE P_DIG_Attrib 0x7003
.ELSE
.DEFINE P_DIG_Data 0x7005
.DEFINE P_DIG_Buffer 0x7006
.DEFINE P_DIG_Dir 0x7007
.DEFINE P_DIG_Attrib 0x7008
.ENDIF
//=================================================================================
//中断定义
//=================================================================================
.DEFINE P_INT_Ctrl_New 0x702d
.DEFINE C_IRQ4_1KHz 0x0010
//=================================================================================
//变量定义
//=================================================================================
.PUBLIC _R_DIG_Buf
.RAM
_R_DIG_Buf: .DW 16 DUP (?) // 数码管显示缓冲区
.VAR _Counter // 存储调用DIG_ScanDrive函数的次数
.CODE
//=================================================================================
// 函数名称: DIG_Initial
// C调用: void DIG_Initial(void)
// 汇编调用: F_DIG_Initial
// 实现功能: 数码管显示及LED灯点亮初始化,该函数将开启IRQ4_1KHz
// 入口参数: 无
// 出口参数: 无
// 破坏寄存器: 无
//=================================================================================
.PUBLIC _DIG_Initial
.PUBLIC F_DIG_Initial
_DIG_Initial:
F_DIG_Initial:
r1 = [P_SEG_Attrib]
r1 |= P_SEG_Byte
[P_SEG_Attrib] = r1
r1 = [P_SEG_Dir]
r1 |= P_SEG_Byte
[P_SEG_Dir] = r1
r1 = [P_SEG_Data]
r1 &= ~P_SEG_Byte
[P_SEG_Buffer] = r1
r1 = 0xffff
[P_DIG_Attrib] = r1
[P_DIG_Dir] = r1
r1 = 0x0001
[P_DIG_Buffer] = r1
r1 = [P_INT_Ctrl_New]
r1 |= C_IRQ4_1KHz
[P_INT_Ctrl_New] = r1
int fiq,irq
retf
//=================================================================================
// 函数名称: DIG_ScanDrive
// C调用: void DIG_ScanDrive(void)
// 汇编调用: F_DIG_ScanDrive
// 实现功能: 数码管及LED灯刷新点亮函数,该函数在IRQ4_1KHz中调用
// 入口参数: 无
// 出口参数: 无
// 破坏寄存器: 无
//=================================================================================
.PUBLIC _DIG_ScanDrive
.PUBLIC F_DIG_ScanDrive
_DIG_ScanDrive:
F_DIG_ScanDrive:
r1 = [P_DIG_Data]
cmp r1,0x8000
jnz ?LeftShift
r1 = 0x0001
r2 = 0
[_Counter] = r2
jmp ?ShiftOver
?LeftShift:
r1 = r1 lsl 1
?ShiftOver:
[P_DIG_Buffer] = r1
r1 = _R_DIG_Buf
r1 += [_Counter]
r2 = [r1]
r2 &= P_SEG_Byte
[P_SEG_Buffer] = r2
r1 = [_Counter]
r1 += 1
[_Counter] = r1
retf
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -