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

📄 main.asm

📁 61板实验指导书源代码
💻 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.
//========================================================

//============================================================
//  工程名称: LED8_asm
//  功能描述:  
//			在数码管上显示按键的值,
//			按第一个键则显示"1",按第二个键显示"2",...,按第8个键显示"8"
//  硬件连接:
//			将LED键盘模组的"KEYTYPE"跳线跳到"1*8KEY"状态
//			将61板的IOA8~IOA15用排线连接到LED键盘模组的1*8KEY排针上;
//			IOB0-7连接到LED键盘模组的SEG排针上;
//			IOB8~IOB15连接到LED键盘模组的DIG排针上。
//  文件来源:《61板实验教程》,"实验八	按键显示数字"
//  IDE环境:   SUNPLUS u'nSPTM  IDE 1.8.4
//
//  涉及的库:
//  组成文件:
//    	main.asm
//  日期:          2004-8-19
//===============================================

//============================================================
// 文件名称:main.asm
// 实现功能: 
//			在数码管上显示按键的值,
//			按第一个键则显示"1",按第二个键显示"2",...,按第8个键显示"8"
// 日期: 2004/8/19
//============================================================
.include hardware.inc

.define LED_SEG 0x00ff		//IOB0~IOB7控制数码管或灯的状态
.define LED_DIG 0x3f00		//IOB8~IOB13分别控制6个数码管
.define LED_LIGHTS 0x4000	//IOB14控制LED灯
.define KEY_ALL 0xff00		//使用IOA8~IOA15作为键盘输入口

.ram
	.var Pos,Dig

.data
DigCode:
	.dw 0x3F,0x06,0x5B,0x4F,0x66
	.dw 0x6D,0x7D,0x07,0x7F,0x6F		//0~9十个数字的LED编码

.code
//============================================================= 
//	函数名称:   LedDispDig
//	功能描述:	在指定的数码管上显示数字
//	语法:		void LedDispDig(int Pos,int Dig)
//	输入:		Pos:	要显示数字的数码管位置,取值范围1~6
//				Dig:	要显示的数字,取值范围0~9
//	输出:		无
//=============================================================
.public LedDispDig
LedDispDig:
	push r1,r2 to [sp]

	r1=1
	[P_Watchdog_Clear]=r1
	//初始化IOB为同相输出
	r1=[P_IOB_Dir]
	r1|=LED_DIG+LED_SEG
	[P_IOB_Dir]=r1
	r1=[P_IOB_Attrib]
	r1|=LED_DIG+LED_SEG
	[P_IOB_Attrib]=r1
	
	//将数字的位置转换为IOB高8位值,选中相应数码管
	r1=0x0080
	r2=[Pos]			//将0x0080左移(Pos)位
L_SetIOBHigh:
	r1=r1 LSL 1
	r2-=1
	jnz	L_SetIOBHigh
	[P_IOB_Data]=r1
	
	//将数字转换为编码,作为IOB低8位输出
	r1=[Dig]
	r2=DigCode
	r2+=r1
	r1=[r2]
	r2=[P_IOB_Buffer]
	r2|=r1
	[P_IOB_Data]=r2
		
	pop r1,r2 from [sp]
	retf
	
//============================================================= 
//	函数名称:   GetKey
//	功能描述:	等待直到有键按下并抬起,返回键值,没有去抖处理
//	语法:		unsigned GetKey(void)
//	输入:		无
//	输出:		由r1返回16位键值
//=============================================================
.public GetKey;
.code
GetKey:
	push r2 to [sp]
	r1=[P_IOA_Dir]			//初始化IOA的相应端口为上拉输入
	r1&=~KEY_ALL
	[P_IOA_Dir]=r1
	r1=[P_IOA_Attrib]		
	r1&=~KEY_ALL
	[P_IOA_Attrib]=r1
	r1=[P_IOA_Buffer]
	r1|=KEY_ALL
	[P_IOA_Buffer]=r1
L_WaitKeyDown:				//等待有键按下,即有端口变为0
	r1=1
	[P_Watchdog_Clear]=r1	//喂狗
	r1=[P_IOA_Data]
	r1&=KEY_ALL
	r1^=KEY_ALL				//取反
	jz	L_WaitKeyDown		//如果r1为0说明没有键按下,继续等待
L_WaitKeyUp:				//如果有键按下则等待该键抬起
	r2=1
	[P_Watchdog_Clear]=r2
	r2=[P_IOA_Data]
	r2&=KEY_ALL
	r2^=KEY_ALL
	jnz L_WaitKeyUp
	pop r2 from [sp]
	retf

//============================================================= 
//	主函数
//=============================================================
.public _main
_main:
L_MainLoop:			//循环1:主循环
	call GetKey		//得到16位键值,保存在r1

	//将16位键值转换为1~8数值
	r2=1
	[Dig]=r2
	r3=0x0100
L_KeyLoop:			//循环2:从低到高依次检查IOB8~IOB15的每一位
	cmp r3,r1
	je L_KeyNum
	r2+=1
	[Dig]=r2
	r3=r3 lsl 1
	jz L_KeyError	//8位全部判断完,没有得到键值,则显示"0"表示出错
	jmp L_KeyLoop
L_KeyError:
	r2=0
	[Dig]=r2
L_KeyNum:
	r2=6			//在第六个数码管上显示键代表的数值(1~8)
	[Pos]=r2
	call LedDispDig	//送显示
	jmp L_MainLoop	//返回主循环
	retf

⌨️ 快捷键说明

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