📄 main.asm
字号:
//======================================================
// The information contained herein is the exclusive property of
// Sunnnorth Technology Co. And shall not be distributed, reproduced,
// or disclosed in whole in part without prior written permission.
// (C) COPYRIGHT 2003 SUNNORTH TECHNOLOGY CO.
// ALL RIGHTS RESERVED
// The entire notice above must be reproduced on all authorized copies.
//=======================================================
//============================================================
// 工程名称: led9_asm.scs
// 功能描述: 用汇编实现发光二极管循回点亮并数码管计数
// 文件来源:《61板实验教程》"实验九 发光二极管循回点亮并数码管计数“
// 硬件连接: IOA低8位接至SEG接口控制LED的导通
// IOB低8位连至DIG通过ULN2003A控制8个LED的共阴极电平状态和数码管驱动
// IDE环境: SUNPLUS u'nSPTM IDE 1.8.0
//
// 涉及的库:
// 组成文件:
// main.asm
//
// 日期: 2004/8/19
//===============================================
//*****************************************************************************/
// 文件名称: main.asm
// 实现功能: 用汇编实现发光二极管循回点亮并数码管计数
// LED巡回闪烁,同时数码管从左至右显示0~8,全部显示完成后,LED停止闪烁,数码管全亮
// 日期: 2004/8/19
//*****************************************************************************/
.define P_IOA_Data 0x7000
.define P_IOA_Dir 0x7002
.define P_IOA_Attrib 0x7003
.define P_IOB_Data 0x7005
.define P_IOB_Dir 0x7007
.define P_IOB_Attrib 0x7008
.define P_Watchdog_Clear 0x7012
.data
//显示段码存放区
DispTbl:.DW 0x003F,0x0006,0x005B,0x004F,0x0066 //0,1,2,3,4
.DW 0x006D,0x007D,0x0007,0x007F,0x00FF //5,6,7,8,全亮
.ram
.var R_Led = 0x0000 //存储数码管位驱动信息
.code
.public _main
//=============================================================
// 函数名称: _main
// 日期: 20040819
// 功能描述: 发光二极管循回点亮并数码管计数
// LED巡回闪烁,同时数码管从左至右显示0~8,全部显示完成后,LED停止闪烁,数码管全亮
// 语法格式: _main
// 入口参数: 无
// 出口参数: 无
// 注意事项: 仅为用户模型
//=============================================================
_main:
r1 = 0x00FF //设置A0~A7口为同相低电平输出
[P_IOA_Dir] = r1
[P_IOA_Attrib] = r1
[P_IOB_Dir]=r1 //设置B0~B7口为同相低电平输出
[P_IOB_Attrib] = r1
r1 = 0x0000
[P_IOA_Data] = r1
[P_IOB_Data] = r1
r3 = 0x0001 //从第一个数码管开始
[R_Led] = r3 //数码管位驱动
L_Loop:
r2 = 0x0000 //防止误显示
[P_IOA_Data] = r2;
r1 = [R_Led] //得到数码管位驱动
[P_IOB_Data] = r1;
BP = DispTbl
r2 = [BP]
[P_IOA_Data] = r2; //数码管显示0
call F_Delay
call F_LedDisp //发光二极管循回点亮并数码管计数
r1 = [R_Led] //下一次的数码管位驱动
r1 = r1 LSL 0x0001
[R_Led] = r1
r3 += 0x0001
cmp r3,0x0007
jne L_Loop //数码管未全部显示完成,跳转到L_Loop循环
r2 = 0x0000 //防止误显示
[P_IOA_Data] = r2;
r2 = 0x003f; //数码管全亮
[P_IOB_Data] = r2;
BP = DispTbl
BP += 9
r2 = [BP]
[P_IOA_Data] = r2;
L_MainLoop:
call F_Delay
jmp L_MainLoop
//=============================================================
.public F_Delay;
.code
//=============================================================
// 函数名称: void F_Delay()
// 日期: 20040819
// 功能描述: 延时并清看门狗
//=============================================================
F_Delay:
push r2,r3 to [SP]
r3 = 0x8000
L_Delay:
r2 = 0x0001
[P_Watchdog_Clear] = r2
r3 -= 0x0001
jnz L_Delay
pop r2,r3 from [SP]
retf
//=============================================================
.public F_LedDisp;
.code
//=============================================================
// 函数名称: void F_LedDisp()
// 日期: 20040819
// 功能描述: 发光二极管点亮并数码管计数
//=============================================================
F_LedDisp:
push r3,r3 to [sp]
r1 = 0x0001
r3 = r1 //发光二极管状态
L_Led: //发光二极管一次循环点亮
r2 = 0x0000 //防止显示错误
[P_IOA_Data] = r2
r2 = 0x0040 //LED点亮位驱动
[P_IOB_Data] = r2
[P_IOA_Data] = r3 //LED新状态
r3 = r3 LSL 1 //下一次LED状态
call F_Delay
r2 = 0x0000 //防止显示错误
[P_IOA_Data] = r2
r2 = [R_Led] //LED点亮位驱动
[P_IOB_Data] = r2
BP = DispTbl //对应数字显示在数码管上
BP += r1
r2 = [BP]
[P_IOA_Data] = r2;
call F_Delay
r1 += 0x0001
cmp r1,0x0009
jne L_Led //LED未全部显示完成,跳转到L_Led循环
pop r3, r3 from [sp]
retf
//=============================================================
//main.asm 结束
//=============================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -