求凌阳61单片机电子音乐闹钟时间在2位片选的4位数码管上显示的程序,并能帮忙标注下具体每段的作用。

作者&投稿:虞芸 (若有异议请与网页底部的电邮联系)
主函数是c写的,但是系统函数和按键程序是用汇编写的,4*4键盘按键显示,四位八段共阴数码管,希望能帮到你

// 工程名称: led_Show_Key.scs;led_Show_Key.spj "在LED上显示按键"
// 功能描述: 按键在LED数码管上显示
// 文件来源: 4*4键盘输入在LED数码管上的显示"
// IDE环境: SUNPLUS u'nSPTM IDE 1.8.0(or later)
// 硬件连接: A0---A6接LED a--g;A8--A14 接LED CS1--4
// B口的低8位接键盘
// 涉及的库: (a) C-Lib: (CMacro.lib);
//
// 组成文件:
// main.c
typedef unsigned char uchar;
#define HaveKey 1
#define NoKey 0
unsigned int KeyVal;
unsigned int KeyDownTimes; //保存按键次数
unsigned int KeycodeLED[4]; //保存显示的LED数字
unsigned int i;
unsigned int KeyFlag; //按键标识

//===============================================================================================
// 函数: main()
// 描述:主函数
//============================================================================================
int main()
{
SP_Init_IOA(); //带数据缓存器的高电平输出 初始化A口为输出口
SP_Init_IOB(); //初始化B口低字节的高四位带数据缓存器的高电平为输出口
KeyDownTimes = 0; //低四位为带下拉电阻的输入端
KeyFlag = NoKey;
SP_INT_128Hz(); //key scan
while(1)
{
while(KeyFlag == HaveKey)
{
KeyVal=F_Get_Key();
KeyFlag = NoKey;
switch(KeyVal)
{
case 11: //删除键处理
if(KeyDownTimes>0)KeyDownTimes--;
if(KeyDownTimes==0) TurnOffLed(); //熄灭所有的灯;
break;
case 0: //错误键处理
break;
default: //数字键处理
if(KeyDownTimes<4)
{
if(KeyVal==10) KeyVal = 0;
KeycodeLED[KeyDownTimes] = KeyVal; //将键值保存到数组中去
KeyDownTimes++;
}
break;
}
}
for(i=0;i<KeyDownTimes;i++) //显示所有键值
F_Show(i,KeycodeLED[i]);
F_ClearWatchdog(); //清看门狗
}
}

//*******************************************************************************************/
// void SP_Init_IOA(int A,int B,int C); 来自于Hardware.asm,API接口函数。IOA初始化。A,方向向
// 量单元,B数据单元,C属性向量单元
// void SP_Init_IOB(int A,int B,int C); 来自于Hardware.asm,API接口函数。IOB初始化。A,方向向
// 量单元,B数据单元,C属性向量单元
// void SP_INT_128Hz(); 来自于SYSTEM.asm,.TMB2选择128Hz
// void F_Get_Key();来自于key.asm,取键值函数
// void F_Show(int A,int B);点亮LED;A,LED的位数(C_Dig),B,LED的显示值
// main.c 结束
//*************************************************************************************************

//===============================================================
//system,asm
//==================================================================
.INCLUDE hardware.inc
.RAM
.DATA
C_Address: .DW 0x00bf,0x0086,0x00db,0x00cf, 0x00e6,0x00ed,0x00fc,0x0087,0x00ff,0x00ef;//'0''1''2''3''4''5''6''7''8''9'的代码
C_Dig: .DW 0x0100,0x0200,0x0400,0x0800;//选中LED管
.EXTERNAL _KeycodeLED
.EXTERNAL _KeyDownTimes
.CODE

//============================================================================================
//函数: SP_Init_IOA()
//语法:void SP_Init_IOA(int A,int B,int C)
//描述:初始化A口
//参数:A,方向向量单元,B数据单元,C属性向量单元
//返回:无
//=============================================================================================
.PUBLIC _SP_Init_IOA; //初始化A口为同相高电平输出口
_SP_Init_IOA: .PROC
r1 = 0xffff;
[P_IOA_Attrib] = r1;
[P_IOA_Dir] = r1;
[P_IOA_Data] = r1;
RETF
.ENDP;
//============================================================================================
//函数: SP_Init_IOB()
//语法:void SP_Init_IOB(int A,int B,int C)
//描述:初始化B口
//参数:A,方向向量单元,B数据单元,C属性向量单元
//返回:无
//=============================================================================================
.PUBLIC _SP_Init_IOB;
_SP_Init_IOB: .PROC
r1 = 0x00f0;
[P_IOB_Attrib] = r1;
[P_IOB_Dir] = r1;
[P_IOB_Data] = r1;
RETF
.ENDP;

//============================================================================================
//函数: TurnOffLed()
//语法:void TurnOffLed()
//描述:关闭所有LED函数
//参数:无
//返回:无
//=============================================================================================
.PUBLIC _TurnOffLed;
_TurnOffLed: .PROC
r1 = 0x0000
[P_IOA_Data] = r1
RETF
.ENDP

//============================================================================================
//函数: SP_INT_128Hz()
//语法:void SP_INT_128Hz()
//描述:TMB2选择128Hz
//参数:无
//返回:无
//=============================================================================================
.public _SP_INT_128Hz;
_SP_INT_128Hz:
r1 = 0x0000;
[P_TimeBase_Setup]=r1 // TMB2选择128Hz //TMB1选择8Hz,但不起作用
r1 = 0x0001 //开中断IRQ6_TMB2
[P_INT_Ctrl]= r1
INT IRQ
RETF;

//============================================================================================
//函数: F_Show()
//语法:void F_Show(int A,int B)
//描述:点亮LED
//参数:A,LED的位数(C_Dig),B,LED的显示值
//返回:无
//============================================================================================
.PUBLIC _F_Show;
_F_Show: .PROC
PUSH BP TO [SP]; //弹出入口参数共两个入口参数
BP = SP + 1
L_Loop:
r1 = [BP+3] //取出第一个入口参数
r3 = [BP+4] //取出第二个入口参数
r2 = r1 + C_Dig; //取LED管的片选地址
r2 = [r2]
r4 = r3 + C_Address //取显示数据的地址
r4 = [r4]
r2 |= r4
[P_IOA_Data] = r2; //显示数据
POP BP FROM [SP]
RETF;
.ENDP
//============================================================================================
//函数: F_ClearWatchdog()
//语法:void F_ClearWatchdog(void)
//描述:清看门狗
//参数:无
//返回:无
//============================================================================================
.PUBLIC _F_ClearWatchdog;
_F_ClearWatchdog: .PROC
r1 = 1;
[P_Watchdog_Clear] = r1;
RETF;
.ENDP

//===================================================================
//system.asm结束
//=====================================================================

//=======================================================================
//key.asm
//=========================================================================
.INCLUDE hardware.inc
.IRAM
.VAR I_KeyBuf = 0 //保存键值
.VAR I_Key_Delay = 0 //扫描有键按下的次数
.EXTERNAL _KeyFlag //有键按下标识符
.CODE

//============================================================================================
//函数: F_Key_Scan()
//语法:void F_Key_Scan()
//描述:键盘扫描函数
//参数:无
//返回:无
//=============================================================================================
.PUBLIC F_Key_Scan;
F_Key_Scan: .PROC
r1 = 0x00F0 //扫描键盘
[P_IOB_Data] = r1
r1 = 0x000f
r1 &= [P_IOB_Data]
JNZ L_Have_Key_Pressed
L_NoKey_Press: //无键按下
r1 = 0
[I_KeyBuf] = r1 //清键盘缓冲区
[_KeyFlag] = r1
[I_Key_Delay]=r1;
RETF
L_Have_Key_Pressed: //有键按下处理
CALL F_Key_Scaning //行扫描确定键
CALL Enter_Key; //确认有键按下
RETF
.ENDP
//============================================================================================
//函数: unsigned F_Key_Scaning()
//语法:void unsigned F_Key_Scaning()
//描述:行扫描函数
//参数:无
//返回:扫描键值
//=============================================================================================
.PUBLIC F_Key_Scaning;
F_Key_Scaning:
F_Key_Scan_B7:
r2=0x0080 //扫描第一行//changed by abin 扫描第四列
[P_IOB_Data] = r2
r1 = 0x000f
r1& =[P_IOB_Data]
CMP r1,0x0000 //是否该行有键按下
JNZ F_Key_Pressed
F_Key_Scan_B6:
r2=0x0040 //扫描第二行
[P_IOB_Data] = r2
r1 = 0x000f
r1& =[P_IOB_Data]
CMP r1,0x0000 //是否该行有键按下
JNZ F_Key_Pressed
F_Key_Scan_B5:
r2=0x0020 //扫描第三行
[P_IOB_Data] = r2
r1 = 0x000f
r1& =[P_IOB_Data]
CMP r1,0x0000 //是否该行有键按下
JNZ F_Key_Pressed
F_Key_Scan_B4:
r2=0x0010 //扫描第四行
[P_IOB_Data] = r2
r1 = 0x000f
r1& =[P_IOB_Data]
CMP r1,0x0000 //是否该行有键按下
JNZ F_Key_Pressed
RETF
F_Key_Pressed:
r2|=r1 //r2--B11~B8:输出 r1--B0~B7,输入
RETF

//============================================================================================
//函数: Enter_Key()
//语法:Enter_Key()
//描述:确定有键按下函数
//参数:无
//返回:无
//============================================================================================
Enter_Key:
Scan_first:
r3 = [I_Key_Delay]
CMP r3,0x0000
JNZ L_Scan_many;
[I_KeyBuf] = r2;
r3 += 1;
[I_Key_Delay] = r3;
RETF;
L_Scan_many: //去抖
r1 = [I_KeyBuf]
CMP r1,r2
JNE L_Error_Key_pro;
r3 = [I_Key_Delay]
r3 += 1;
[I_Key_Delay] = r3;
CMP r3, 0x0010;
JE L_Enter_Have_KeyDown;
RETF;
L_Enter_Have_KeyDown:
r1 = 1;
[_KeyFlag] = r1
r3 = 0;
[I_Key_Delay]=r3
RETF
L_Error_Key_pro:
r3 = 0;
[I_Key_Delay]=r3
[I_KeyBuf] = r3
RETF;

//============================================================================================
//函数: unsigned F_Get_Key()
//语法:unsigned F_Get_Key()
//描述:取键值函数
//参数:无
//返回:键值
//============================================================================================
.PUBLIC _F_Get_Key;
_F_Get_Key: .PROC
r3 = 1
r2 = [I_KeyBuf]
L_Key_value_Loop:
bp = r3 + Key_Table
r1 = [bp]
CMP r1,r2
JE L_KeyCode_Return
r3 += 1
CMP r3,11
JBE L_Key_value_Loop
r3=0
L_KeyCode_Return:
r1 = 0;
[I_KeyBuf] = r1;
r1=r3
RETF //清键盘缓冲区
.ENDP

Key_Table:
.DW 0x0000,0x0014,0x0024,0x0044
.DW 0x0012,0x0022,0x0042,0x0011
.DW 0x0021,0x0041,0x0028,0x0018
.DW 0x0081,0x0082,0x0084,0x0048
//===============================================================
//key.asm结束
//=================================================================

没用过

写这个得需要电路图的,没电路图程序没法写……

不懂。

这个题目看起来不是很难,估计我可以用51做出来,不过凌阳61确实没接触过。

谁能写一个凌阳61单片机的程序给我。要能实现计时功能(60秒)用两个数码管显示。 各位高手谢谢了~

去北阳电子网站上找吧,那里有点儿,如果不行,可以打电话给他们的技术支持工程师 李键,他人很好,会回答你的。

这种问题是和硬件有关的,最好自己使用万用表测一下,就清楚了。

求凌阳61单片机电子音乐闹钟时间在2位片选的4位数码管上显示的程序,并...
答:主函数是c写的,但是系统函数和按键程序是用汇编写的,4*4键盘按键显示,四位八段共阴数码管,希望能帮到你 // 工程名称: led_Show_Key.scs;led_Show_Key.spj "在LED上显示按键"// 功能描述: 按键在LED数码管上显示 // 文件来源: 4*4键盘输入在LED数码管上的显示"// ...

毕业论文资料收集(采纳追加1000分)
答:·基于单片机的可编程多功能电子定时器·单片机的数字温度计设计·红外遥控密码锁的设计·基于61单片机的语音识别系统设计·家用可燃气体报警器的设计·基于数字温度计的多点温度检测系统·基于凌阳单片机的语音实时采集系统设计·基于单片机的数字频率计的设计·基于单片机的数字电子钟设计·设施环境中温度测量电路设计·汽车倒...

电子信息工程毕业论文
答:932.智能音乐闹钟设计 933.防盗门密码锁的设计 934.多功能时钟打点系统设计 935.多功能倒计时显示牌 936.程控滤波器的设计 937.多功能程控电源设计 938.电子秤的设计 939.电红外线感应自动门的设计 940.单片机控制的语音录放系统的设计 941.超声波测距仪 942.MP3的设计与实现 943.±5V直流稳压电源的设计 944....

关于D类放大器的毕业论文
答:830. 基于凌阳单片机的语音实时采集系统设计 831. 简单语音识别算法研究 832. 基于数字温度计的多点温度检测系统 833. 家用可燃气体报警器的设计 834. 基于61单片机的语音识别系统设计 835. 红外遥控密码锁的设计 836. 简易无线对讲机电路设计 837. 基于单片机的数字温度计的设计 838. 甲醛气体浓度检测与报警电路的设...