📄 example34.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 + -