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

📄 example34.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.
//========================================================

//============================================================
//  工程名称: example34.spj
//  功能描述:  IRQ4的1KHz中断中扫描键盘,有键按下后,键码送入显示缓冲区,供显示子程序调用使用。
//  硬件连接: 从A0-A7输出段码,从B2-B5输出位码。A0~A7接键盘的8条列线,A8接键盘的行线。
//  文件来源:《实验仪实验指导书》"实验三十四   1*8键盘输入在LED数码管上的显示
//  IDE环境:   SUNPLUS u'nSPTM  IDE 1.8.4
//
//  涉及的库:
//  组成文件:
//    	example34.asm
//===============================================
//============================================================
// 文件名称:example34.asm
// 实现功能: IRQ4的1KHz中断中扫描键盘,有键按下后,键码送入显示缓冲区,供显示子程序调用使用。
//============================================================

		.include hardware.inc

		.define RUN_1KHz_TimeBase_INT 0x0010

		.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,全亮,全灭

KeyTbl:								        //键盘编码表
		.DW 0x007F,0x00BF,0x00DF,0x00EF		//K1,K2,K3,K4
		.DW 0x00F7,0x00FB,0x00FD,0x00FE		//K5,K6,K7,K8

		.ram
		.var NewKey

		.code
		.public _main
//============================================================= 
// 函数名称:  _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
		[NewKey]= r1
		BP=DisplayBuff					//设置显示缓冲区
		r1=0x0012						//第123位数码管全灭
		[BP++]= r1
		[BP++]= r1
		[BP++]= r1
		r1=0x0010						//第4位数码管显示P
		[BP++]= r1
		r1=RUN_1KHz_TimeBase_INT			//开放1KHz中断
		[P_INT_Ctrl]= r1
		int IRQ
Loop:
		r1=0x0001                    		//清看门狗
		[P_Watchdog_Clear]=r1
		CALL Display
		JMP Loop		

		.text	
		.public _IRQ4		
//============================================================= 
// 函数名称:  _IRQ4
// 功能描述:  IRQ4中断有三个中断源:1KHz、2KHz、4KHz,1KHz中断内扫描键盘
//入口参数:     无
// 出口参数:    DisplayBuff
// 注意事项:    仅为用户模型
//=================================================================
_IRQ4:
		PUSH R1,R5 to [SP]
		r1=0x0010 	
		TEST R1,[P_INT_Ctrl]				//是否为1KHz中断
		JNZ  IRQ4_1K		 		  		//1KHz中断
		r1=0x0020 	
		TEST r1,[P_INT_Ctrl] 	  			//是否为2KHz中断
		JNZ  IRQ4_2K 			 	    	//2KHz中断 
IRQ4_4K:					
		r1=0x0040
		[P_INT_Clear]=r1         
		POP r1,r5 FROM [SP]   
		RETI
IRQ4_2K:
		r1=0x0020
		[P_INT_Clear]=r1         
		POP r1, r5 FROM [SP]   
		RETI
IRQ4_1K:
		CALL CheckKeypad					//扫描键盘
		r1=0x01FF;						    //恢复A0~A7输出
		[P_IOA_Dir]= r1;
		[P_IOA_Attrib]= r1;
		r1=0x0100;						    //IOA8输出高电平,屏蔽键盘
		[P_IOA_Data]= r1;
		r1=0x0010
		[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
/////////////////////////////////////////////////////////////////////////////////		
//键盘扫描程序
//A0~A7接键盘的8条列线,A8接键盘的行线。当A0~A7置为上拉输入口、A8置为低电平输出口时,
//若无键按下,从A0~A7将输入FF;当有某个键按下,相应A0~A7某位将输入0,得到键码。8个
//按键对应8个键码:
//		.DW 0x007F,0x00BF,0x00DF,0x00EF	//K1,K2,K3,K4
//		.DW 0x00F7,0x00FB,0x00FD,0x00FE	//K5,K6,K7,K8
//将8位的键码做8-3编码,得到8个按键的键值:0-7
//入口:无
//出口:DisplayBuff
///////////////////////////////////////////////////////////////////////////////////
CheckKeypad:	.proc	
		R1=0x0000	
		[P_IOA_Data]=R1                 //数据清零,防止误显示					
		[P_IOB_Data]=R1                 //屏蔽数码管显示
		R1=0x0100						//A0-A7为上拉输入口,A8输出低电平
		[P_IOA_Dir]=R1
		[P_IOA_Attrib]=R1
		R1=0xfeff
		[P_IOA_Data]=R1
		NOP
		NOP
		NOP
		NOP
		NOP
		r1=[P_IOA_Data]					//读入键码
		r1&=0x00ff						//屏蔽高8位
		CMP R1,0x00ff
		JE NoKey							//无键处理
		CMP r1,[NewKey]					//是否是新键
		JE NoKey							//否
		[NewKey]= r1						//保存键码
		BP=KeyTbl						//对键码进行8-3编码,使K1~K7对应0~7键值
		r1=0x0000
Check:
		r3=[BP++]
		CMP r3,[NewKey]
		JE Key
		r1+=0x0001
		CMP r1,0x0008
		JE NoKey
		JMP Check
Key:
		BP=DisplayBuff					//修改显示缓冲区
		[BP+0x03]=r1
NoKey:
		RETF
		.endp

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -