?? section8.c
字號:
#include <MSP430X14X.h>
#include "SPI.h"
#include "ISD4004.h"
//定義全局變量
static char nPlay;//PLAY按鍵
static char nRec;//REC按鍵
static char nPlay_count;//PLAY按鍵次數(shù)
static char nRec_count;//REC按鍵次數(shù)
static char nVOF;//ISD4004 INT中斷標志
//定義串口操作變量
char nRev_UART0;//串口 0 的接收標志
unsigned char UART0_TX_BUF[20];// 串口 0 的發(fā)送緩沖區(qū)
unsigned char UART0_RX_BUF[20];// 串口 0 的接收緩沖區(qū)
static int nTX0_Len;//發(fā)送數(shù)據(jù)長度
static int nRX0_Len;//接收數(shù)據(jù)長度
int nRX0_Len_temp;
static char nTX0_Flag;//發(fā)送完成標志
int nSend_TX0;//發(fā)送記數(shù)器
void main()
{
int nRec_Row;
int nPlay_Row;
WDTCTL = WDTPW + WDTHOLD; // 關(guān)閉看門狗
_DINT();//關(guān)閉中斷
// 初始化
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);
}
}
// 字節(jié)的比特順序高低交換
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;
}
// 發(fā)送上電指令
void PowerUp(void)
{
unsigned char code;
//上電命令
code = 0x04;
// 發(fā)送命令碼
SendOpCode(code);
return;
}
// 發(fā)送掉電指令
int PowerDown(void)
{
unsigned char code;
//掉電命令
code = 0x08;
// 發(fā)送命令碼
SendOpCode(code);
return;
}
// 發(fā)送停止命令
void Stop(void)
{
unsigned char code;
//停止命令
code = 0x0C;
// 發(fā)送命令碼
SendOpCode(code);
return;
}
// 放音操作
void Play(int nAddr)
{
int i;
unsigned char code;
// 發(fā)送加電指令
PowerUp();
// 延時25ms以上
Delay_ms(30);
// 發(fā)送地址信息
SendAddr(nAddr);
// 發(fā)送SETPLAY命令
code = 0x07;
SendOpCode(code);
// 發(fā)送PLAY命令
code = 0x0F;
SendOpCode(code);
// 處理結(jié)束
for(;;)
{
// 如果發(fā)生溢出的時候則結(jié)束錄音
if(nOVF == 1)
{
nOVF = 0;//清除中斷標志變量
// 發(fā)送停止命令
Stop();
// 延遲一點時間
for(i = 0;i < 100;i++) ;
break;
}
// 如果第2次按下放音鍵,則結(jié)束錄音
if((nPlay == 0) && (nPlay_count == 2))
{
nPlay_count = 0;//清除按鍵次數(shù)記錄變量
// 發(fā)送停止命令
Stop();
// 延遲一點時間
for(i = 0;i < 100;i++) ;
break;
}
}
// 發(fā)送掉電指令
PowerDown();
// 延遲一段時間
Delay_ms(30);
nPlay_count = 0;//清除按鍵次數(shù)記錄變量
return;
}
// 錄音操作
void Record(int nAddr)
{
int i;
unsigned char code;
// 發(fā)送加電指令
PowerUp();
// 延時25ms以上
Delay_ms(30);
// 再次發(fā)送加電指令
PowerUp();
// 延時25ms以上
Delay_ms(30);
// 延時25ms以上
Delay_ms(30);
// 發(fā)送地址信息
SendAddr(nAddr);
// 發(fā)送SETREC命令
code = 0x05;
SendOpCode(code);
// 發(fā)送REC命令
code = 0x0D;
SendOpCode(code);
// 處理結(jié)束
for(;;)
{
// 如果發(fā)生溢出的時候則結(jié)束錄音
if(nOVF == 1)
{
nOVF = 0;//清除中斷標志變量
// 發(fā)送停止命令
Stop();
// 延遲一點時間
for(i = 0;i < 100;i++) ;
break;
}
// 如果第2次按下錄音鍵,則結(jié)束錄音
if((nRec == 0) && (nRec_count == 2))
{
nRec_count = 0;//清除按鍵次數(shù)記錄變量
// 發(fā)送停止命令
Stop();
// 延遲一點時間
for(i = 0;i < 100;i++) ;
break;
}
}
// 發(fā)送掉電指令
PowerDown();
// 延遲一段時間
Delay_ms(30);
nRec_count = 0;//清除按鍵次數(shù)記錄變量
return;
}
// 發(fā)送地址信息
void SendAddr(int nAddr)
{
int i;
unsigned char chrHi;
unsigned char chrLow;
// 片選使能
SS_Enable();
// 分別取出高、低字節(jié)
chrHi = (unsigned char)((nAddr & 0xff00) >> 8);
chrLow = (unsigned char)(nAddr & 0x00ff);
for(i = 100;i > 0;i--) ; //延遲一點時間
//字節(jié)的高低順序變換
chrHi = ByteSwap(chrHi);
//字節(jié)的高低順序變換
chrLow = ByteSwap(chrLow);
UART0_TX_BUF[0] = chrLow;//低地址字節(jié)
UART0_TX_BUF[1] = chrHi;//高地址字節(jié)
nTX0_Len = 2;
IFG1 |= UTXIFG0; // 設(shè)置中斷標志,進入發(fā)送中斷程序
for(i = 100;i > 0;i--) ; //延遲一點時間
while(1)// 等待緩沖區(qū)里的數(shù)據(jù)發(fā)送完畢
{
if(nTX0_Flag == 1) break;
}
// 片選禁止
SS_Disable();
return;
}
// 發(fā)送命令碼
void SendOpCode(unsigned char code)
{
// 片選使能
SS_Enable();
for(i = 100;i > 0;i--) ; //延遲一點時間
UART0_TX_BUF[0] = code;//發(fā)送命令
nTX0_Len = 1;
IFG1 |= UTXIFG0; // 設(shè)置中斷標志,進入發(fā)送中斷程序
for(i = 100;i > 0;i--) ; //延遲一點時間
while(1)// 等待緩沖區(qū)里的數(shù)據(jù)發(fā)送完畢
{
if(nTX0_Flag == 1) break;
}
// 片選禁止
SS_Disable();
}
////////////////////////////////////////
// 處理來自串口 0 的接收中斷
interrupt [UART0RX_VECTOR] void SPI0_RX_ISR(void)
{
UART0_RX_BUF[nRX0_Len_temp] = RXBUF0;//接收來自的數(shù)據(jù)
nRX0_Len_temp += 1;
//接收滿10個設(shè)置標志
if(nRX0_Len_temp >= 10)
{
nRX0_Len = nRX0_Len_temp;
nRev_UART0 = 1;
nRX0_Len_temp = 0;
}
}
////////////////////////////////////////
// 處理來自串口 0 的發(fā)送中斷
interrupt [UART0TX_VECTOR] void SPI0_TX_ISR(void)
{
if(nTX0_Len != 0)
{
nTX0_Flag = 0; // 表示緩沖區(qū)里的數(shù)據(jù)沒有發(fā)送完
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;//設(shè)置標志
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 + -