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

📄 test22.asm

📁 试验仪自检程序
💻 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 + -