main.c
来自「基于凌阳单片机数字电子钟开发源代码」· C语言 代码 · 共 463 行
C
463 行
//======================================================
// 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.
//========================================================
//============================================================
// 工程名称:LCD_DynamicGraphicMusic.spj
// 功能描述: 超级电子表
// IDE环境: SUNPLUS u'nSPTM IDE 1.8.0
//
// 硬件连接:把A口的低八位接八个按键开关和八个发光二极管
//
// 组成文件:
// SPLC501hardware.asm/SPLC501sys.asm/SPLC501var.asm
// splc501c.inc/splc501c_io.inc/hardware.inc/lab_parameter.h
// sacmv32.asm/spce.asm/sacm_user.asm/sp_lib.asm/isr.asm
// a2000.inc/spce.inc/sacmv32.h/sacmv32.inc
// 日期: 2006/8/23
//===============================================
//============================================================
// 文件名称:main.c
// 实现功能:超级电子表
// 日期: 2006/8/23
//============================================================
#include "lab_parameter.h"
#include "sacmv32.h"
#include "SPCE061V004.H"
#define Timera_data (0xffff-8192)
unsigned int hour1=0,hour2=0;
unsigned int minit1=0,minit2=0;
unsigned int second1=0,second2=0;
unsigned int h1=0,h2=0,h3=0,h4=0;
unsigned int m1=0,m2=0,m3=0,m4=0;
unsigned int miaobiao[3][6]=
{
{0,0,0,0,0,0},
{0,0,0,0,0,0},
{0,0,0,0,0,0},
}
;
unsigned int flag1=0,flag2=0,flag4=0;
unsigned int flag3=0,flag5=0,flag6=0,flag7=0; //miaobiao
unsigned int key_mb=0;//miaobiao
unsigned int temp=0;
//*************************************************************
// void delay() 延时子程序
//*************************************************************
void delay()
{
unsigned int i,j;
for(j=0;j<=1;j++)
for(i=0;i<0xffff;i++)
Clear_Watch_Dog();
}
void delay0()
{
unsigned int i=0xffff;
while(i--);
Clear_Watch_Dog();
}
//*************************************************************
// void naozhong() 设定闹钟
//*************************************************************
void naozhong()
{
if(*P_IOA_Data==0x0002)
{
flag4=1;
h1=hour1;h2=hour2;h3=minit1;h4=minit2;
hour1=m1;hour2=m2;minit1=m3;minit2=m4;
while(1)
{
if(*P_IOA_Data==0x0004) //设定闹钟的小时
{
if(hour1+10*hour2==23) {hour1=0;hour2=0;}
else
{
if(hour1<9) hour1++;
else{hour1=0;hour2++;}
}
}
delay0();
if(*P_IOA_Data==0x0008) //设定闹钟的分钟
{
if(minit1<9) minit1++;
else
{
minit1=0;
if(minit2<5) minit2++;
else minit2=0;
}
}
cir_play();
if(*P_IOA_Data==0x0080) {delay0();flag4=0;break;}
}
m1=hour1;m2=hour2;m3=minit1;m4=minit2;
hour1=h1;hour2=h2;minit1=h3;minit2=h4;
}
}
//*************************************************************
// void set_time() 设定时间
//*************************************************************
void set_time()
{
if(*P_IOA_Data==0x0001)
{
flag4=2;
while(1)
{
if(*P_IOA_Data==0x0004) //小时
{
if(hour1+10*hour2==23) {hour1=0;hour2=0;}
else
{
if(hour1<9) hour1++;
else{hour1=0;hour2++;}
}
}
delay0();
if(*P_IOA_Data==0x0008) //分钟
{
if(minit1<9) minit1++;
else
{
minit1=0;
if(minit2<5) minit2++;
else minit2=0;
}
}
cir_play();
if(*P_IOA_Data==0x0080) {delay();flag4=0;break;}
}
}
}
//*************************************************************
//void Play_num(int i,int j) 显示数字
//*************************************************************
void Play_num(int i,int j,int k)
{
switch(i)
{
case 0:FG_PutStr("0",3,40+j,40+k);break; //显示0
case 1:FG_PutStr("1",3,40+j,40+k);break; //显示1
case 2:FG_PutStr("2",3,40+j,40+k);break; //显示2
case 3:FG_PutStr("3",3,40+j,40+k);break; //显示3
case 4:FG_PutStr("4",3,40+j,40+k);break; //显示4
case 5:FG_PutStr("5",3,40+j,40+k);break; //显示5
case 6:FG_PutStr("6",3,40+j,40+k);break; //显示6
case 7:FG_PutStr("7",3,40+j,40+k);break; //显示7
case 8:FG_PutStr("8",3,40+j,40+k);break; //显示8
case 9:FG_PutStr("9",3,40+j,40+k);break; //显示9
}
}
//*************************************************************
//void play_music() 时间到脑钟响
//*************************************************************
void play_music()
{
unsigned int i,j;
while(1)
{
SACM_A2000_Initial(Auto); //A2000播放初始化 函数包含在Sacmv32.lib
SACM_A2000_Play(0,DAC1+DAC2,Ramp_Up_On+Ramp_Dn_On); //A2000语音播放 函数包含在Sacmv32.lib
if((SACM_A2000_Status()&0x01) == 0) //判断语音是否播放结束 函数包含在Sacmv32.lib
SACM_A2000_Play(0,DAC1+DAC2,Ramp_Up_On+Ramp_Dn_On); //语音播放 函数包含在Sacmv32.lib
if(*P_IOA_Data==0x0080)
{
SACM_A2000_Stop();
flag1=0;
break;
}
for(j=0;j<=7;j++) //延时 保持整个显示屏点亮
for(i=0;i<0xffff;i++)
Clear_Watch_Dog();
}
}
//*************************************************************
//int cir_play() 显示时间
//*************************************************************
int cir_play()
{
delay();
FG_ClearScreen(0);
if(10*hour2+hour1<12) FG_PutStr("AM",3,125,40);
else FG_PutStr("PM",3,125,40);
Play_num(second1,0,0);
Play_num(second2,10,0);
FG_PutStr(":",3,55,40);
Play_num(minit1,25,0);
Play_num(minit2,35,0);
FG_PutStr(":",3,80,40);
Play_num(hour1,50,0);
Play_num(hour2,60,0);
if(flag2) FG_PutStr("ON",3,30,40);
else FG_PutStr("OFF",3,30,40);
switch(flag4)
{
case 0: FG_PutStr("The Time Is:",3,125,60);break;
case 1: FG_PutStr("Set Clock:",3,125,60);break;
case 2: FG_PutStr("Set Time:",3,125,60);break;
}
return 1;
}
//////////////////////////////////////////////////////////////////////
int cir_play0()
{
unsigned int i;
delay();
FG_ClearScreen(0);
for(i=0;i<3;i++)
{
Play_num(miaobiao[i][0],0,10*(2-i));
Play_num(miaobiao[i][1],10,10*(2-i));
FG_PutStr(":",3,55,40+10*(2-i));
Play_num(miaobiao[i][2],25,10*(2-i));
Play_num(miaobiao[i][3],35,10*(2-i));
FG_PutStr(":",3,80,40+10*(2-i));
Play_num(miaobiao[i][4],50,10*(2-i));
Play_num(miaobiao[i][5],60,10*(2-i));
}
return 1;
}
//////////////////////////////////////////////////////////////////////
// void pao_biao(int i1) 跑秒子程序 //
//////////////////////////////////////////////////////////////////////
void pao_biao(int i1)
{
unsigned int k;
flag6=0;
key_mb=0;
if(temp!=i1) flag7=1;
if((i1>0)&&flag7)
{
for(k=0;k<6;k++) miaobiao[i1][k]=miaobiao[i1-1][k];
temp=i1;flag7=0;
}
if(miaobiao[i1][0]<9) miaobiao[i1][0]++;
else
{
miaobiao[i1][0]=0;
if(miaobiao[i1][1]<9)miaobiao[i1][1]++;
else
{
miaobiao[i1][1]=0;
if(miaobiao[i1][2]<9)miaobiao[i1][2]++;
else
{
miaobiao[i1][2]=0;
if(miaobiao[i1][3]<5)miaobiao[i1][3]++;
else
{
miaobiao[i1][3]=0;
if(miaobiao[i1][4]<9)miaobiao[i1][4]++;
else
{
miaobiao[i1][4]=0;
if(miaobiao[i1][5]<5)miaobiao[i1][5]++;
else miaobiao[i1][5]=0;
}
}
}
}
}
}
//*************************************************************
//main() 主程序
//*************************************************************
main()
{
unsigned int j1,j2
asm("INT OFF");
*P_IOA_Dir=0x0000; //IOA0~IOA7 output
*P_IOA_Attrib=0x0000;
*P_IOA_Data=0x0000;
Init_sys(); //初始化字库 函数定义在Splc501sys.asm
FG_InitGraphic(); //初始化LCDIO口 函数定义在Splc501sys.asm
*P_TimerA_Ctrl=0x0033; //4096HZ
*P_TimerA_Data=Timera_data;
*P_INT_Ctrl=C_IRQ4_4KHz|C_IRQ1_TMA;
asm("INT IRQ");
while(1)
{
if(*P_IOA_Data==0x0010) {flag3=1;FG_ClearScreen(0);}
while(flag3)
{
if(*P_IOA_Data==0x0020)
{
switch(flag5)
{
case 0:flag5=1;break;
case 1:flag5=2;break;
case 2:flag5=3;break;
default:flag5=0;break;
}
delay();
}
if(*P_IOA_Data==0x0010)
{
for(j1=0;j1<3;j1++)
for(j2=0;j2<6;j2++)
miaobiao[j1][j2]=0;
flag5=0;
}
if(*P_IOA_Data==0x0080){flag5=0;flag3=0;break;}
cir_play0();
}
if(*P_IOA_Data==0x0040&&flag2==1){flag2=0;}
else if(*P_IOA_Data==0x0040&&flag2==0){flag2=1;}
if(flag1==1&&flag2==1) play_music();
naozhong();
set_time();
cir_play();
}
}
//*************************************************************
// 中断程序
//*************************************************************
void BREAK(void) __attribute__ ((ISR));
void BREAK(void)
{
}
void IRQ0(void) __attribute__ ((ISR));
void IRQ0(void)
{
}
void IRQ1(void) __attribute__ ((ISR));
void IRQ1(void)
{
if(*P_INT_Ctrl&C_IRQ1_TMA)
{
*P_INT_Clear=C_IRQ1_TMA;
if(second1<9) second1++;
else
{
second1=0;
if(second2<5) second2++;
else
{
second2=0;
if(minit1<9) minit1++;
else
{
minit1=0;
if(minit2<5) minit2++;
else
{
minit2=0;
if(hour2*10+hour1==23) {hour1=0;hour2=0;}
else
{
if(hour1<9) hour1++;
else {hour1=0;hour2++;}
}
}
}
}
}
if(flag2)
{
if(m1==hour1&&m2==hour2&&m3==minit1&&m4==minit2&&second2==0&&second1==0) flag1=1;
}
}
}
void IRQ2(void) __attribute__ ((ISR));
void IRQ2(void)
{
}
void IRQ3(void) __attribute__ ((ISR));
void IRQ3(void)
{
}
void IRQ4(void) __attribute__ ((ISR));
void IRQ4(void)
{
if(*P_INT_Ctrl&&C_IRQ4_4KHz)
{
*P_INT_Clear=C_IRQ4_4KHz;
if(flag5)
{
if(key_mb==40)flag6=1;
else key_mb++;
}
switch(flag6)
{
case 1:
switch(flag5)
{
case 1:pao_biao(0);break;
case 2:pao_biao(1);break;
case 3:pao_biao(2);break;
case 0:break;
}
case 0:break;
}
}
}
void IRQ5(void) __attribute__ ((ISR));
void IRQ5(void)
{
}
void IRQ6(void) __attribute__ ((ISR));
void IRQ6(void)
{
}
void IRQ7(void) __attribute__ ((ISR));
void IRQ7(void)
{
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?