📄 section8.c
字号:
#include <MSP430X14X.h>
#include "SPI.h"
#include "ISD4004.h"
//定义全局变量
static char nPlay;//PLAY按键
static char nRec;//REC按键
static char nPlay_count;//PLAY按键次数
static char nRec_count;//REC按键次数
static char nVOF;//ISD4004 INT中断标志
//定义串口操作变量
char nRev_UART0;//串口 0 的接收标志
unsigned char UART0_TX_BUF[20];// 串口 0 的发送缓冲区
unsigned char UART0_RX_BUF[20];// 串口 0 的接收缓冲区
static int nTX0_Len;//发送数据长度
static int nRX0_Len;//接收数据长度
int nRX0_Len_temp;
static char nTX0_Flag;//发送完成标志
int nSend_TX0;//发送记数器
void main()
{
int nRec_Row;
int nPlay_Row;
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
_DINT();//关闭中断
// 初始化
Init_CLK();
PORT_Init();
SPI_Init();
nPlay = 0;
nRec = 0;
nPlay_count = 0;
nRec_count = 0;
nRec_Row = 0;
nPlay_Row = 0;
_EINT();//打开中断
for(;;)
{
// 放音的处理
if((nPlay == 1) && (nPlay_count == 1))
{
// 放音
Play(nPlay_Row);
nPlay_Row += 1;
if(nPlay_Row >= 2400) nPlay_Row = 0;
}
// 录音的处理
if((nRec == 1) && (nRec_count == 1))
{
// 录音
Record(nRec_Row);
nRec_Row += 1;
if(nRec_Row >= 2400) nRec_Row = 0;
}
Delay_us(10);
}
}
// 字节的比特顺序高低交换
unsigned char ByteSwap(unsigned char chrIn)
{
unsigned char chrTemp;
unsigned char chrOut;
int i;
chrOut = 0;
for(i = 0;i < 8;i++)
{
chrTemp = (chrIn & 0x80) >> 7;
chrIn <<= 1;
if(chrTemp == 1)
{
chrOut |= (chrTemp << i);
}
}
return chrOut;
}
//片选信号置低
void SS_Enable(void)
{
// 置低电平
P3OUT &= ~(BIT0);
_NOP();
_NOP();
return;
}
//片选信号置高
void SS_Disable(void)
{
// 置高电平
P3OUT |= BIT0;
_NOP();
_NOP();
return;
}
// 发送上电指令
void PowerUp(void)
{
unsigned char code;
//上电命令
code = 0x04;
// 发送命令码
SendOpCode(code);
return;
}
// 发送掉电指令
int PowerDown(void)
{
unsigned char code;
//掉电命令
code = 0x08;
// 发送命令码
SendOpCode(code);
return;
}
// 发送停止命令
void Stop(void)
{
unsigned char code;
//停止命令
code = 0x0C;
// 发送命令码
SendOpCode(code);
return;
}
// 放音操作
void Play(int nAddr)
{
int i;
unsigned char code;
// 发送加电指令
PowerUp();
// 延时25ms以上
Delay_ms(30);
// 发送地址信息
SendAddr(nAddr);
// 发送SETPLAY命令
code = 0x07;
SendOpCode(code);
// 发送PLAY命令
code = 0x0F;
SendOpCode(code);
// 处理结束
for(;;)
{
// 如果发生溢出的时候则结束录音
if(nOVF == 1)
{
nOVF = 0;//清除中断标志变量
// 发送停止命令
Stop();
// 延迟一点时间
for(i = 0;i < 100;i++) ;
break;
}
// 如果第2次按下放音键,则结束录音
if((nPlay == 0) && (nPlay_count == 2))
{
nPlay_count = 0;//清除按键次数记录变量
// 发送停止命令
Stop();
// 延迟一点时间
for(i = 0;i < 100;i++) ;
break;
}
}
// 发送掉电指令
PowerDown();
// 延迟一段时间
Delay_ms(30);
nPlay_count = 0;//清除按键次数记录变量
return;
}
// 录音操作
void Record(int nAddr)
{
int i;
unsigned char code;
// 发送加电指令
PowerUp();
// 延时25ms以上
Delay_ms(30);
// 再次发送加电指令
PowerUp();
// 延时25ms以上
Delay_ms(30);
// 延时25ms以上
Delay_ms(30);
// 发送地址信息
SendAddr(nAddr);
// 发送SETREC命令
code = 0x05;
SendOpCode(code);
// 发送REC命令
code = 0x0D;
SendOpCode(code);
// 处理结束
for(;;)
{
// 如果发生溢出的时候则结束录音
if(nOVF == 1)
{
nOVF = 0;//清除中断标志变量
// 发送停止命令
Stop();
// 延迟一点时间
for(i = 0;i < 100;i++) ;
break;
}
// 如果第2次按下录音键,则结束录音
if((nRec == 0) && (nRec_count == 2))
{
nRec_count = 0;//清除按键次数记录变量
// 发送停止命令
Stop();
// 延迟一点时间
for(i = 0;i < 100;i++) ;
break;
}
}
// 发送掉电指令
PowerDown();
// 延迟一段时间
Delay_ms(30);
nRec_count = 0;//清除按键次数记录变量
return;
}
// 发送地址信息
void SendAddr(int nAddr)
{
int i;
unsigned char chrHi;
unsigned char chrLow;
// 片选使能
SS_Enable();
// 分别取出高、低字节
chrHi = (unsigned char)((nAddr & 0xff00) >> 8);
chrLow = (unsigned char)(nAddr & 0x00ff);
for(i = 100;i > 0;i--) ; //延迟一点时间
//字节的高低顺序变换
chrHi = ByteSwap(chrHi);
//字节的高低顺序变换
chrLow = ByteSwap(chrLow);
UART0_TX_BUF[0] = chrLow;//低地址字节
UART0_TX_BUF[1] = chrHi;//高地址字节
nTX0_Len = 2;
IFG1 |= UTXIFG0; // 设置中断标志,进入发送中断程序
for(i = 100;i > 0;i--) ; //延迟一点时间
while(1)// 等待缓冲区里的数据发送完毕
{
if(nTX0_Flag == 1) break;
}
// 片选禁止
SS_Disable();
return;
}
// 发送命令码
void SendOpCode(unsigned char code)
{
// 片选使能
SS_Enable();
for(i = 100;i > 0;i--) ; //延迟一点时间
UART0_TX_BUF[0] = code;//发送命令
nTX0_Len = 1;
IFG1 |= UTXIFG0; // 设置中断标志,进入发送中断程序
for(i = 100;i > 0;i--) ; //延迟一点时间
while(1)// 等待缓冲区里的数据发送完毕
{
if(nTX0_Flag == 1) break;
}
// 片选禁止
SS_Disable();
}
////////////////////////////////////////
// 处理来自串口 0 的接收中断
interrupt [UART0RX_VECTOR] void SPI0_RX_ISR(void)
{
UART0_RX_BUF[nRX0_Len_temp] = RXBUF0;//接收来自的数据
nRX0_Len_temp += 1;
//接收满10个设置标志
if(nRX0_Len_temp >= 10)
{
nRX0_Len = nRX0_Len_temp;
nRev_UART0 = 1;
nRX0_Len_temp = 0;
}
}
////////////////////////////////////////
// 处理来自串口 0 的发送中断
interrupt [UART0TX_VECTOR] void SPI0_TX_ISR(void)
{
if(nTX0_Len != 0)
{
nTX0_Flag = 0; // 表示缓冲区里的数据没有发送完
TXBUF0 = UART0_TX_BUF[nSend_TX0];
nSend_TX0 += 1;
Delay_us(5);
if(nSend_TX0 >= nTX0_Len)
{
nSend_TX0 = 0;
nTX0_Len = 0;
nTX0_Flag = 1;
}
}
}
///////////////////////////////////////
// 处理来自端口 1 的中断
interrupt [PORT1_VECTOR] void R_B_ISR(void)
{
// 处理INT中断
if(P1IFG & BIT0)
{
nVOF = 1;//设置标志
P1IFG &= ~(BIT0);//清除中断标志
Delay_us(100);
}
// 处理录音按钮
if(P1IFG & BIT5)
{
if(nRec == 1)
{
nRec = 0;
nRec_count += 1;
}
else if(nRec == 0)
{
nRec = 1;
nRec_count += 1;
}
P1IFG &= ~(BIT5); // 清除中断标志位
Delay_us(100);
}
// 处理放音按钮
if(P1IFG & BIT4)
{
if(nPlay == 1)
{
nPlay = 0;
nPlay_count += 1;
}
else if(nPlay == 0)
{
nPlay = 1;
nPlay_count += 1;
}
P1IFG &= ~(BIT4); // 清除中断标志位
Delay_us(100);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -