📄 main.c
字号:
#include "a2000.h"
#define SPEECH_1 1
#define DAC1 1
#define DAC2 2
#define Ramp_UpDn_Off 0
#define Ramp_UpDn_On 3
#define Manual 0
#define Auto 1
#define Full 1
#define Empty 2
#include"bit.h"
#include"hardware.h"
#define P_INT_Ctrl_New (volatile unsigned int *)0x702D
#define P_INT_Ctrl (volatile unsigned int *)0x7010
#define P_INT_Clear (volatile unsigned int *)0x7011
#define P_IOA_RL (volatile unsigned int *)0x7004
#define P_SystemClock (volatile unsigned int *)0x7013
#define P_Timebase_Setup (volatile unsigned int *)0x700e
//声明子函数
void change(void);
void show(void);
void delay(void);
int music(void);
//定义全局变量
int hour; //后台数据存储单元
int hourbcd1,hourbcd2; //数码管编码
int shang,yushu; //定义商,余数寄存器,及时保存结果,以避免重复做除法浪费资源。
int bianma[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管编码
//主函数
//****************************************************************************************************************
int main()
{
// *P_SystemClock=0x98;
*P_Timebase_Setup=0x04; // 0x04_256hz
//初始化端口
p1_dir_highbyte=0xff; //数码管的片选端口初始化
p1_attrib_highbyte=0xff;
p1_highbyte=0x00;
p1_dir_lowbyte=0xff; //初始化数码管编码输出口,无数据反相器输出
p1_attrib_lowbyte=0xff;
p1_lowbyte=0x00;
//初始化数值
hour=0;
change();
*P_INT_Ctrl=0x0005;
__asm("irq on");
music();
*P_SystemClock=0x3;//恢复初始化
*P_INT_Ctrl=0x0005;
__asm("irq on");
while(1)
{
watchdog_clear=1;
}
}
void IRQ5(void) __attribute__ ((ISR)); //计时
void IRQ5(void)
{
__asm("irq off");
if(*P_INT_Ctrl==0x0004)
{*P_INT_Clear=0x0004;
hour++;
if(hour==100) hour=00;
watchdog_clear=1;//
change();
watchdog_clear=1;
}
if(*P_INT_Ctrl==0x0008)
{*P_INT_Clear=0x0008;
}
__asm("irq on");
}
void IRQ6(void) __attribute__ ((ISR));
void IRQ6(void)
{
__asm("irq off");
if(*P_INT_Ctrl==0x0001)
{*P_INT_Clear=0x0001;
show();watchdog_clear=1;}
if(*P_INT_Ctrl==0x0002)
{*P_INT_Clear=0x0002;}
__asm("irq on");
}
//**********************************子函数****************************************
void change() //译码
{
watchdog_clear=1;
shang=hour/10,yushu=hour%10;
hourbcd1=bianma[shang],hourbcd2=bianma[yushu];
}
void show()
{
p1_highbyte=0x04; //片选第3位数码管
p1_lowbyte=hourbcd1;//扫描编码
delay(); //延时
p1_highbyte=0x08; //片选第4位数码管
p1_lowbyte=hourbcd2;//扫描编码
delay(); //延时
p1_lowbyte=0; //清屏
}
void delay()
{int i;
for(i=0;i<0x24;i++)
watchdog_clear=1;
}
extern RES_A32_16K_A20_SA;//首地址
extern RES_A32_16K_A20_EA;
int music(){
int iMode;
int iAddr;
int iRet;
iMode = Manual;
iAddr = RES_A32_16K_A20_SA; //送入语音队列的首址
if(iMode == Manual) //采用非自动方式播放
{
SACM_A2000_Initial(iMode); //非自动方式播放的初始化,来自sacmv25.lib
SACM_A2000_InitDecoder(DAC1); //开始对A2000的语音数据以非自动方式解码 ,来自sacmv25.lib
while(1)
{
if(SACM_A2000_TestQueue()!=Full) //测试并获取语音队列的状态,来自sacmv25.lib
{
iRet =SP_GetResource(iAddr); //从资源文件里获取一个字型语音数据,来自sacmv25.lib
SACM_A2000_FillQueue(iRet); //获取语音编码数据并填入语音队列等候解码,来自sacmv25.lib
iAddr++;
}
if(iAddr< RES_A32_16K_A20_EA ) //如果该段语音未播完,即未到达末地址时
SACM_A2000_Decoder(); //获取资源并进行解码,再通过中断服务子程序送入DAC通道播放,来自sacmv25.lib
else{
SACM_A2000_InitDecoder(DAC1); //否则,开始对A2000的语音数据以非自动方式解码 , 来自sacmv25.lib
iAddr = RES_A32_16K_A20_SA; //送入语音队列的首址
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -