📄 test22.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.
//========================================================
//============================================================
// 工程名称: test22.spj
// 功能描述: 在IRQ5的2Hz中断中修改显示缓冲区内容,数码管以动态显示原理显示显示缓冲区内的内容。
// 硬件连接:A0-A7输出段码,B2-B5输出位码
// 文件来源:《实验仪实验指导书》"实验三十三 0.5s定时刷新数码管显示" 第118页
// IDE环境: SUNPLUS u'nSPTM IDE 1.8.4
//
// 涉及的库:
// 组成文件:
// test22.asm
//===============================================
//============================================================
// 文件名称:test22.asm
// 实现功能: 数码管动态显示.
// A0-A7输出控制数码管的段显示,B2-B5输出控制数码管的位显示,均为高电平有效
//============================================================
.include hardware.inc
.define RUN_2Hz_TimeBase_INT 0x0004
.RAM
DisplayBuff: .DW 4 DUP(0) //定义一个4存储单元的显示缓冲区,存入显示内容
.DATA
//显示段码存放区
DispTbl:
.DW 0x003F,0x0006,0x005B,0x004F,0x0066 //0,1,2,3,4
.DW 0x006D,0x007D,0x0007,0x007F,0x006F //5,6,7,8,9
.DW 0x0077,0x007C,0x0039,0x005E,0x0079 //A,b,C,d,E
.DW 0x0071,0x0073,0x00FF,0x0000 //F,P,全亮,全灭
.RAM
.VAR Char
.CODE
.PUBLIC _main;
//=============================================================
// 函数名称: _main
// 功能描述: 数码管动态显示.
// 语法格式: 无
//入口参数: 无
// 出口参数: 无
// 注意事项: 仅为用户模型
//=============================================================
_main:
R1=0x01FF; //初始化IOA0-IOA7为低电平输出
[P_IOA_Dir]=R1;
[P_IOA_Attrib]=R1;
R1=0x0100; //IOA8输出高电平,屏蔽按键
[P_IOA_Data]=R1;
R1=0x003C; //初始化IOB2-IOB5为低电平输出
[P_IOB_Dir]=R1;
[P_IOB_Attrib]=R1;
R1=0x0000;
[P_IOB_Data]=R1;
R1=0x0000
[Char]=R1
BP=DisplayBuff //设置显示缓冲区
R1=0x0012 //4位数码管全灭
[BP++]=R1
[BP++]=R1
[BP++]=R1
[BP++]=R1
R1=RUN_2Hz_TimeBase_INT //开放2Hz中断
[P_INT_Ctrl]=R1
int IRQ
Loop:
r1=0x0001 //清看门狗
[P_Watchdog_Clear]=r1
CALL Display
JMP Loop
.text
.public _IRQ5
//=============================================================
// 函数名称: _IRQ5
// 功能描述: IRQ5中断有两个中断源:2Hz和4Hz,2Hz中断内不断修改显示缓冲区内容
//入口参数: 无
// 出口参数: 无
// 注意事项: 仅为用户模型
//=================================================================
_IRQ5:
PUSH R1,R5 to [SP] //压栈保护
R1=0x0004
TEST R1,[P_INT_Ctrl] //比较是否为2Hz中断
JNZ IRQ_2Hz //是,则转至对应程序段
IRQ_4Hz:
R1=0x0008
[P_INT_Clear]=r1
POP R1,R5 FROM [SP]
RETI
IRQ_2Hz:
R1=[Char] //修改显示缓冲区
BP=DisplayBuff
[BP++]=R1
[BP++]=R1
[BP++]=R1
[BP++]=R1
R1+=1;
CMP R1,0x0013
JNE Store
R1=0x0000
Store:
[Char]=R1
R1=0x0004
[P_INT_Clear]=R1
POP R1,R5 FROM [SP]
RETI
//数码管显示程序
//原理:从A0-A7输出段码,从B2-B5输出位码,均为高电平有效
//入口:显示缓冲区DisplayBuff
//出口:无
Display: .proc
R3=0x0000; //初始化计数初值
R2=DisplayBuff; //R2指向显示缓冲区
R4=0x0004; //显示位码
Next:
R1=0x0000 //暂时关闭所有的数码管
[P_IOB_Data]=R1
BP=DispTbl; //BP指向段码表
R1=[R2++]; //从显示缓冲区内取显示内容(即偏移量)
BP+=R1; //段码表首地址加上偏移量
R1=[BP]; //从段码表中取出段码
R1|=0x0100
[P_IOA_Data]=R1; //送出段码
[P_IOB_Data]=R4; //送出位码
R4=R4 LSL 1; //修改位码,以便下一位显示
R3+=0x0001; //计数器加1
CMP R3,0x0004 //4位数据显示完否
JB Next //未显示完
RETF
.endp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -