十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
从C语言到单片机的汇编(或者说是机器代码)是需要编译的,这个编译的过程本身是需要最早开发的人做大量的基础工作,比如要让电脑知道C语言中的if是“如果”的意思,编译时要根据情况、适当的转为汇编中的判断或跳转指令。
在镇坪等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供做网站、成都做网站 网站设计制作按需开发网站,公司网站建设,企业网站建设,成都品牌网站建设,营销型网站,成都外贸网站建设,镇坪网站建设费用合理。
所以,简单说,就是没有人做基于JAVA的单片机开发环境。但是单片机的BASIC语言的开发环境却不少,像主流的PIC、AVR都有好几种。我用过PIC的,写起来很有意思,拿来做单片机入门不错。复杂程序不行。
你能问出这个问题,说明你还是没有理解编程语言的本质和他们的关系。
#include REG52.H
#include "SoundPlay.h"
void Delay1ms(unsigned int count)
{
unsigned int i,j;
for(i=0;icount;i++)
for(j=0;j120;j++);
}
unsigned char code Music_Two[] ={ 0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03,
0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02,
0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03,
0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x16,0x03,
0x17,0x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01,
0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03,
0x16,0x03, 0x15,0x03, 0x10,0x03, 0x15,0x03, 0x16,0x01,
0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03,
0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02,
0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03,
0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x19,0x03,
0x19,0x01, 0x19,0x03, 0x1A,0x03, 0x19,0x03, 0x17,0x01,
0x16,0x03, 0x16,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03,
0x16,0x03, 0x15,0x03, 0x10,0x03, 0x10,0x0D, 0x15,0x00,
0x19,0x03, 0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03,
0x1B,0x03, 0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03,
0x16,0x0D, 0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03,
0x1A,0x02, 0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03,
0x16,0x01, 0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03,
0x19,0x02, 0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E,
0x1B,0x04, 0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E,
0x1B,0x04, 0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03,
0x17,0x0D, 0x16,0x03, 0x17,0x03, 0x19,0x01, 0x19,0x03,
0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03, 0x1B,0x03,
0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03, 0x16,0x03,
0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03, 0x1A,0x02,
0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x01,
0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03, 0x19,0x03,
0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,
0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,
0x17,0x16, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,
0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03, 0x0F,0x02,
0x10,0x03, 0x15,0x00, 0x00,0x00 };
//***********************************************************************************
main()
{
InitialSound();
while(1)
{
Play(Music_Girl,0,3,360);
Delay1ms(500);
Play(Music_Same,0,3,360);
Delay1ms(500);
Play(Music_Two,0,3,360);
Delay1ms(500);
}
}
/**************************************************************************
SOUND PLAY FOR 51MCU
COPYRIGHT (c) 2005 BY JJJ.
-- ALL RIGHTS RESERVED --
File Name: SoundPlay.h
Author: Jiang Jian Jun
Created: 2005/5/16
Modified: NO
Revision: 1.0
*******************************************************************************/
/*说明**************************************************************************
曲谱存贮格式 unsigned char code MusicName{音高,音长,音高,音长...., 0,0}; 末尾:0,0 表示结束(Important)
音高由三位数字组成:
个位是表示 1~7 这七个音符
十位是表示音符所在的音区:1-低音,2-中音,3-高音;
百位表示这个音符是否要升半音: 0-不升,1-升半音。
音长最多由三位数字组成:
个位表示音符的时值,其对应关系是:
|数值(n): |0 |1 |2 |3 | 4 | 5 | 6
|几分音符: |1 |2 |4 |8 |16 |32 |64 音符=2^n
十位表示音符的演奏效果(0-2): 0-普通,1-连音,2-顿音
百位是符点位: 0-无符点,1-有符点
调用演奏子程序的格式
Play(乐曲名,调号,升降八度,演奏速度);
|乐曲名 : 要播放的乐曲指针,结尾以(0,0)结束;
|调号(0-11) : 是指乐曲升多少个半音演奏;
|升降八度(1-3) : 1:降八度, 2:不升不降, 3:升八度;
|演奏速度(1-12000): 值越大速度越快;
***************************************************************************/
#ifndef __SOUNDPLAY_H_REVISION_FIRST__
#define __SOUNDPLAY_H_REVISION_FIRST__
//**************************************************************************
#define SYSTEM_OSC 12000000 //定义晶振频率12000000HZ
#define SOUND_SPACE 4/5 //定义普通音符演奏的长度分率,//每4分音符间隔
sbit BeepIO = P3^7; //定义输出管脚
unsigned int code FreTab[12] = { 262,277,294,311,330,349,369,392,415,440,466,494 }; //原始频率表
unsigned char code SignTab[7] = { 0,2,4,5,7,9,11 }; //1~7在频率表中的位置
unsigned char code LengthTab[7]= { 1,2,4,8,16,32,64 };
unsigned char Sound_Temp_TH0,Sound_Temp_TL0; //音符定时器初值暂存
unsigned char Sound_Temp_TH1,Sound_Temp_TL1; //音长定时器初值暂存
//**************************************************************************
void InitialSound(void)
{
BeepIO = 0;
Sound_Temp_TH1 = (65535-(1/1200)*SYSTEM_OSC)/256; // 计算TL1应装入的初值 (10ms的初装值)
Sound_Temp_TL1 = (65535-(1/1200)*SYSTEM_OSC)%256; // 计算TH1应装入的初值
TH1 = Sound_Temp_TH1;
TL1 = Sound_Temp_TL1;
TMOD |= 0x11;
ET0 = 1;
ET1 = 0;
TR0 = 0;
TR1 = 0;
EA = 1;
}
void BeepTimer0(void) interrupt 1 //音符发生中断
{
BeepIO = !BeepIO;
TH0 = Sound_Temp_TH0;
TL0 = Sound_Temp_TL0;
}
//**************************************************************************
void Play(unsigned char *Sound,unsigned char Signature,unsigned Octachord,unsigned int Speed)
{
unsigned int NewFreTab[12]; //新的频率表
unsigned char i,j;
unsigned int Point,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength;
unsigned char Tone,Length,SL,SH,SM,SLen,XG,FD;
for(i=0;i12;i++) // 根据调号及升降八度来生成新的频率表
{
j = i + Signature;
if(j 11)
{
j = j-12;
NewFreTab[i] = FreTab[j]*2;
}
else
NewFreTab[i] = FreTab[j];
if(Octachord == 1)
NewFreTab[i]=2;
else if(Octachord == 3)
NewFreTab[i]=2;
}
SoundLength = 0;
while(Sound[SoundLength] != 0x00) //计算歌曲长度
{
SoundLength+=2;
}
Point = 0;
Tone = Sound[Point];
Length = Sound[Point+1]; // 读出第一个音符和它时时值
LDiv0 = 12000/Speed; // 算出1分音符的长度(几个10ms)
LDiv4 = LDiv0/4; // 算出4分音符的长度
LDiv4 = LDiv4-LDiv4*SOUND_SPACE; // 普通音最长间隔标准
TR0 = 0;
TR1 = 1;
while(Point SoundLength)
{
SL=Tone%10; //计算出音符
SM=Tone/10%10; //计算出高低音
SH=Tone/100; //计算出是否升半
CurrentFre = NewFreTab[SignTab[SL-1]+SH]; //查出对应音符的频率
if(SL!=0)
{
if (SM==1) CurrentFre = 2; //低音
if (SM==3) CurrentFre = 2; //高音
Temp_T = 65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC);//计算计数器初值
Sound_Temp_TH0 = Temp_T/256;
Sound_Temp_TL0 = Temp_T%256;
TH0 = Sound_Temp_TH0;
TL0 = Sound_Temp_TL0 + 12; //加12是对中断延时的补偿
}
SLen=LengthTab[Length%10]; //算出是几分音符
XG=Length/10%10; //算出音符类型(0普通1连音2顿音)
FD=Length/100;
LDiv=LDiv0/SLen; //算出连音音符演奏的长度(多少个10ms)
if (FD==1)
LDiv=LDiv+LDiv/2;
if(XG!=1)
if(XG==0) //算出普通音符的演奏长度
if (SLen=4)
LDiv1=LDiv-LDiv4;
else
LDiv1=LDiv*SOUND_SPACE;
else
LDiv1=LDiv/2; //算出顿音的演奏长度
else
LDiv1=LDiv;
if(SL==0) LDiv1=0;
LDiv2=LDiv-LDiv1; //算出不发音的长度
if (SL!=0)
{
TR0=1;
for(i=LDiv1;i0;i--) //发规定长度的音
{
while(TF1==0);
TH1 = Sound_Temp_TH1;
TL1 = Sound_Temp_TL1;
TF1=0;
}
}
if(LDiv2!=0)
{
TR0=0; BeepIO=0;
for(i=LDiv2;i0;i--) //音符间的间隔
{
while(TF1==0);
TH1 = Sound_Temp_TH1;
TL1 = Sound_Temp_TL1;
TF1=0;
}
}
Point+=2;
Tone=Sound[Point];
Length=Sound[Point+1];
}
BeepIO = 0;
}
//**************************************************************************
#endif
/ /项目名称:Car_Demo
/ /说明:参与实施汽车语音控制
/ /库:CMacro1016.lib
/ / bsrv222SDL.lib
/ / sacmv26e。库
/ /组成文件:main.c中
/ / Flash.asm,hardware.asm,ISR.asm
/ /的hardware.h,s480.h,hardware.inc
/ /硬件连接:IOA0 ----- KEY1
/ / IOA1 ----- KEY2
/ / IOA2 ----- KEY3
/ / IOB8 ---- - 远期
/ / IOB9 -----倒车
/ / IOB10 ----左
/ / IOB11 ----右转
/ /保养纪录:2005年-12-12 V1.0
/ / ===================================== ===================
#包括“s480.h”
#包括“bsrsd.h”
BR /#定义P_IOA_Data(挥发性无符号整数*)0x7000处
#定义P_IOA_Dir(挥发性无符号整数*)0x7002
#定义P_IOA_Attrib(挥发性无符号整数*)0x7003
#定义P_IOB_Data(挥发性无符号整型*)0x7005
#定义P_IOB_Dir(挥发性无符号整数*)0x7007
#定义P_IOB_Attrib(挥发性无符号整数*)0x7008
#定义P_TimerA_Data(挥发性无符号整数*)0x700A
#定义P_TimerA_Ctrl(挥发性无符号整数*)0x700B
#定义P_TimerB_Data(挥发性无符号整数*)0x700C
#定义P_TimerB_Ctrl(挥发性无符号整数*)0x700D
#定义P_Watchdog_Clear(挥发性无符号整型*)0x7012
#定义P_INT_Mask(挥发性无符号整数*)0x702D
#定义P_INT_Clear(挥发性无符号整数*)0x7011
#定义名_ID量0x100
#定义COMMAND_GO_ID 0x101
#定义COMMAND_BACK_ID 0x102
#定义COMMAND_LEFT_ID #定义COMMAND_RIGHT_ID量0x104
#定义S_NAME 0 / /给我一个名字吧
#定义S_ACT1 1 / /前进
#定义S_ACT2 2 / /倒车,请注意
#定义S_ACT3 3 / /左
#定义S_ACT4 4 / /右转
#定义S_RDY 5 / /是啊
#定义S_AGAIN 6 / /请重复
#定义S_NOVOICE 7 / /没有听到任何声音
#定义S_CMDDIFF 8 / /代码字说啊
#定义S_NOISY 8 / /说什么暗语呀
#定义S_START 9 / /准备开始识别
#定义S_GJG 10 / /诱拐绑架
#定义S_DCZY 11 / /倒车,请注意
的extern unsigned int类型BSR_SDModel [100]; / /外部变量BSR_SDModel [100],读者自带
外部无效F_FlashWrite1Word(unsigned int类型地址,无符号整型值);
外部无效F_FlashErase(无符号整数部门);
无符号整型uiTimeset = 3; / /运行时间定时器,调节参数控制运行时间
无符号整型uiTimecont; / /运行时定时
/ / ================================== ===========================
/ /语法:无效延迟();
/ /功能:延时
/ /参数:无
/ /返回值:无
/ / ================ =============================================
无效延迟()
{
无符号整数I;
就(i = 0; I 0X3FFF,我+ +)
{
* P_Watchdog_Clear = 0X0001;
/ / ============================== ===============================
/ /语法:无效PlaySnd(无符号SndIndex,无符号DAC_Channel);
/ /功能:语音播放功能
/ /参数:SndIndex播放语音资源索引号
/ / DAC_Channel播放通道选择
/ /返回值:无
/ / =============================================== ============== 无效PlaySnd(无符号SndIndex,无符号DAC_Channel)
{
BSR_StopRecognizer(); / /停止识别
SACM_S480_Initial(1); / /初始化为自动
SACM_S480_Play玩(SndIndex,DAC_Channel,3); / /开始播放语音
同时(!(SACM_S480_Status()&0X0001)= 0)/ /如果播放完毕?
SACM_S480_ServiceLoop(); / /解码,并填补了队列
* P_Watchdog_Clear = 0X0001; / /清除看门狗
}
SACM_S480_Stop(); / /停止播放
BSR_InitRecognizer(BSR_MIC); / /初始化识别器
}
/ / ============================== ===============================
/ /语法:INT TrainWord(INT的wordID,诠释SndID);
/ /功能:训练命令
/ /参数:
/ / SndID命令语气指数
/ /返回值的wordID指令编码:无
/ / ================================================= ============
整数TrainWord(无符号整数的wordID,无符号整型SndID)
{
int结果;
PlaySnd(SndID,3); / /导游培训,打相应的动作
指令,而(1)
{
结果= BSR_Train(的wordID,BSR_TRAIN_TWICE); / /训练两次,得到训练成绩
如果(结果== 0)打破;
开关(结果)
{
案例-1:/ /未检测到声音
PlaySnd(S_NOVOICE,3);
返回-1;
案例-2:/ /要培养第二
PlaySnd(S_AGAIN,3);
突破;
案例-3:/ /环境嘈杂
PlaySnd(S_NOISY,3);
返回-3;
案例-4:/ /数据库全
回报-4;
情况-5:/ /检测声音不同
PlaySnd(S_CMDDIFF,3);
返回-5;
情况-6:/ /错误号
回报-6;
默认:
突破;
返回0;
/ / =================================== ==========================
/ /语法:无效TrainSD();
/ /功能:训练功能
/ /参数:无
/ /返回值:无
/ / =============== ==============================================
无效TrainSD()
{
同时(TrainWord(名_ID,S_NAME)= 0!); / /培训名称
而(TrainWord(COMMAND_GO_ID,S_ACT1)= 0);! / /训练第1节动作
同时(TrainWord(COMMAND_BACK_ID,S_ACT2)= 0);! / /培训前两个动作
同时(TrainWord(COMMAND_LEFT_ID,S_ACT3)= 0!); / /训练第3节动作
同时(TrainWord(COMMAND_RIGHT_ID,S_ACT4)= 0!); / /培训4的动作
}
/ / ============================= ================================
/ /语法:无效StoreSD();
/ /实现功能:存储语音模型功能
/ /参数:无
/ /返回值:无
/ / ============ ================================================= BR /无效StoreSD() {unsigned int类型ulAddr,我,命令号,g_Ret;
F_FlashWrite1Word(0xef00,加上0xAAAA);
F_FlashErase(0xe000);
F_FlashErase(0xe100);
F_FlashErase(0xe200);
ulAddr = 0xe000 ;/ / ********
为(命令号= 0x100的;命令号0x105;命令号+ +)
{
g_Ret = BSR_ExportSDWord(命令号);
而(g_Ret! = 0)/ /导出模型成功?
g_Ret = BSR_ExportSDWord(命令号);
就(i = 0; I 100; i + +)/ /保存语音模型SD1(0xe000 --- 0xe063)
{
F_FlashWrite1Word(ulAddr,BSR_SDModel [I]) ;
ulAddr + = 1;
/ / ========================= ====================================
/ /语法:无效StoreSD();
/ /功能:承载语音模型函数
/ /参数:无
/ /返回值:无 / / ============= ================================================ 无效LoadSD()
{unsigned int类型* P,K,JK,惩戒,g_Ret;
P =(INT *)0xe000;
为(JK = 0; JK 5; JK + +)
{
为(K = 0,K 100,K +)
{
RET = * P;
BSR_SDModel [K] = RET; / /加载语音模型
P + = 1;
g_Ret = BSR_ImportSDWord();
而(g_Ret! = 0)/ /加载成功的模式?
g_Ret = BSR_ImportSDWord();
/ / ============================== ===============================
/ /语法:无效的GoAhead();
/ /功能:正向功能
/ /参数:无
/ /返回值:无
/ / =============== ==============================================
无效的GoAhead()/ /向前
PlaySnd(S_ACT1,3); / /提示
* P_IOB_Data = 0X0100; / /前进
* P_INT_Mask | = 0X0004; / /以下为中断定时器操作
__ asm的(“INT FIQ,IRQ”);
uiTimecont = 0;
/ / ======================================= ======================
/ /语法:无效的备份();
/ /功能:返回函数
/ /参数:无
/ /返回值:无
/ / =============== ==============================================
无效的备份()/ /向后
PlaySnd(S_DCZY,3); / /提示 * P_IOB_Data = 0x0200; / /向后
* P_INT_Mask | = 0X0004; / /以下为中断定时器操作
__ asm的(“INT FIQ,IRQ”);
uiTimecont = 0;
/ / =================================== ==========================
/ /语法:无效TurnLeft();
/ /功能:打开左侧的功能
/ /参数:无
/ /返回值:无
/ / ============== ===============================================
无效TurnLeft()/ /左转
PlaySnd(S_GJG,3);
* P_IOB_Data = 0x0900; / /右转
延迟(); / /延迟
* P_IOB_Data =成0x0500; / /左转
* P_INT_Mask | = 0X0004; / /以下为中断定时器操作
__ asm的(“INT FIQ,IRQ”);
uiTimecont = 0;
/ / ======================================= ======================
/ /语法:无效TurnRight();
/ /功能:右转子程序
/ /参数:无
/ /返回值:无
/ / ============== ===============================================
无效TurnRight()/ /右转
PlaySnd(S_GJG,3); / /语音提示
* P_IOB_Data =成0x0500; / /左转
延迟(); / /延迟
* P_IOB_Data = 0x0900; / /右转
* P_INT_Mask | = 0X0004; / /以下为中断定时器操作
__ asm的(“INT FIQ,IRQ”);
uiTimecont = 0;
/ / =================================== ==========================
/ /语法:无效停止();
/ /功能:停车功能
/ /参数:无
/ /返回值:无
/ / =============== ==============================================
无效停止()/ /停止
{
* P_IOB_Data值= 0x0000; / /停车
PlaySnd(S_RDY,3); / /语音提示
}
/ / =============================== ==============================
/ /语法:BSR无效(无效);
/ /功能:识别功能
/ /参数:无
/ /返回值:无
/ / =============== ==============================================
BSR无效(无效)
{
int结果; / /识别结果存储
结果= BSR_GetResult(); / /得到识别结果
如果(结果 0)/ /语音触发?
* P_IOB_Data值= 0x0000; / /临时停车
开关(结果)
{
案名_ID:/ /识别命令
停止(名称); / /停机位
突破;
情况COMMAND_GO_ID:/ /找出第一个命令
的GoAhead(); / /执行一个动作:直
突破; 案例COMMAND_BACK_ID:/ /找出第二个命令
备份(); / /执行动作二:倒车
突破;
情况COMMAND_LEFT_ID:/ /找出第三个命令
TurnLeft(); / /执行三个动作:向左转
突破;
情况COMMAND_RIGHT_ID:/ /找出第四个命令
TurnRight(); / /执行动作四:右转
突破;
默认:
突破;
/ / ============================= ================================
/ /语法:IRQ5无效(无效);
/ /功能:中断服务子程序
/ /参数:无
/ /返回值:无
/ / ============== ===============================================
IRQ5无效(无效)的__attribute__((ISR)); / /运动定时控制
IRQ5无效(无效)
{
如果(uiTimecont + + == uiTimeset)
{
* P_IOB_Data值= 0x0000;
* P_INT_Clear = 0X0004;
/ / =================================== ==========================
/ /语法:INT主要(无效);
/ /功能:主要功能
/ /参数:无
/ /返回值:无
/ / ============== ===============================================
国际主要(无效)
{unsigned int类型BS_Flag; / /火车标志
* P_IOA_Dir =为0xFF00; / /初始化IOA,IOA07下拉输入
* P_IOA_Attrib =为0xFF00;
* P_IOA_Data值= 0x0000;
* P_IOB_Dir = 0x0f00; / /初始化IOB,IOB811与输出
* P_IOB_Attrib = 0x0f00;
* P_IOB_Data值= 0x0000;
BSR_DeleteSDGroup(0); / /初始化存储器RAM
BS_Flag = *(unsigned int类型*)0xe000; / /读取内存单元0xe000
如果(BS_Flag == 0xFFFF的)/ /没有受过训练(0xe000内容0xFFFF的)
{
TrainSD(); / /培训
StoreSD(); / /存储的训练结果(语音模式)
其他/ /训练(0xe000内容0x0055)
{
LoadSD(); / /语音识别模型加载
}
PlaySnd(S_START,3); / /开始识别
BSR_InitRecognizer(BSR_MIC)提示; / /初始化识别器
同时(1)
{
BSR();
如果((* P_IOA_Data)&0X0004)/ /如果再培训
{
F_FlashErase(0xe000);
而(1);
/ / ========================= ===================================
/ /文件名:flash.asm
/ /实现功能:SPCE061 32K闪存读卡器
/ /保养纪录:2003-6-9 V1 .0
/ / ================= ===========================================
。 INCLUDE hardware.inc
。 DEFINE C_FLASH_SIZE为0x8000
。 DEFINE C_FLASH_BLOCK_SIZE量0x100
。 DEFINE C_FLASH_MATCH加上0xAAAA
。 DEFINE C_FLASH_PAGE_ERASE 0x5511 / /擦除一个
。 DEFINE C_FLASH_MASS_ERASE 0x5522 / /
。 DEFINE C_FLASH_1WORD_PGM 0x5533 / /写一个字
。 DEFINE C_FLASH_SEQUENT_PGM 0x5544 / /写多个字
。 DEFINE C_FLASH_MAIN_BLOCK为0x5555
。 DEFINE C_FLASH_INFORM_BLOCK 0x5566
。代码
/ / =========================================== ================================================= BR / / /语法:无效F_FlashWrite1Word(INT地址,int值)
/ /描述:写一个字到FLASH
/ /参数:要写入的地址内存中的数据写入值地址数据
/ /返回:无
/ / ================================== ================================================== ===========
。公众_F_FlashWrite1Word
DEFINE P_Flash_Ctrl 0x7555
_F_FlashWrite1Word:.. PROC
推基点至[SP]
BP = SP +1
R1 = C_FLASH_MATCH / / AAAA
[P_Flash_Ctrl] = R1
R1 = C_FLASH_1WORD_PGM / / 5533
[P_Flash_Ctrl] = R1
R1 = [BP +4] / / flash地址
R2 = [BP + 4 ] / /数据
[R1 = R2
流行BP从[SP]
。 ENDP
/ / ======================================= ================================================== ====
/ /语法:F_FlashWrite(INT部门,诠释及次数,int的大小)
/ /说明:顺序写更多的字
/ /参数:扇区是起始地址将数据写入写入和NUM-大小的写入数据数
/ /返回的数据:无
/ / ================== ================================================== =========================
公众_F_FlashWrite
_F_FlashWrite:.. PROC
推基点至[SP]
BP = SP +1
R1 = [BP +4] / / flash基地址
R2 =
/数据/ R3 = [BP +5] / /多字节
R4 = C_FLASH_MATCH / / AAAA
[P_Flash_Ctrl] = R4
L_FlashWriteLoop:
R4 = C_FLASH_SEQUENT_PGM / / 5544
[P_Flash_Ctrl] = R4 R4 = [R2 +]
[R1 + +] = R4
R3 - = 1
JNZ L_FlashWriteLoop
[P_Flash_Ctrl] = R3 / /写从最终
弹出基点[SP]
RETF 。 ENDP
/ / ======================================= ================================================== ===
/ /语法:无效F_FlashErase(部门)
/ /说明:擦除256字节
/ /参数:起始地址扇区擦除页
/ /返回:无
/ / ============================================ ================================================ 公共_F_FlashErase
_F_FlashErase:.. PROC
推基点至[SP]
BP = SP + 1
R1 = C_FLASH_MATCH / / AAAA
[P_Flash_Ctrl] = R1
R1 = C_FLASH_PAGE_ERASE / / 5511
[P_Flash_Ctrl] = R1
R1 = [BP +4] / /擦除一个
[R1] = R1
从[SP]
。 ENDP
。完
/ / ======================================= =====================
/ /文件名:ISR.asm
/ /功能:语音播放/识别中断服务
/ /保养纪录:2003-9-9 V1.0
/ / ============================== ==============================
包括hardware.inc
公共_FIQ;。 ..
外部_BSR_FIQ_Routine
外部F_FIQ_Service_SACM_S480
_FIQ:..
推R1,R5为[SP]; / /注册推来保护
R1 = C_FIQ_TMA;
[P_INT_Clear] = R1;
致电_BSR_FIQ_Routine / /语音识别中断服务
致电F_FIQ_Service_SACM_S480; / /语音播放中断服务
流行R1,R5从[SP];
RETI;