📄 main.c
字号:
//字节的高低顺序变换
chrHi = ByteSwap(chrHi);
//字节的高低顺序变换
chrLow = ByteSwap(chrLow);
// chrLow = 0x00;
// chrHi = 0x00; //更换地址依然没有作用,
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(int i = 100;i > 0;i--) ; //延迟一点时间
// code = ByteSwap(code);
UART0_TX_BUF[0] = code;//发送命令
nTX0_Len = 1;
IFG1 |= UTXIFG0; // 设置中断标志,进入发送中断程序
for(int i = 100;i > 0;i--) ; //延迟一点时间
while(1)// 等待缓冲区里的数据发送完毕
{
if(nTX0_Flag == 1) break;
}
// 片选禁止
SS_Disable();
}
////////////////////////////////////////
// 处理来自串口 0 的接收中断
//interrupt [UART0RX_VECTOR] void SPI0_RX_ISR(void)
#pragma vector=UART0RX_VECTOR
__interrupt void SPI0_RX_ISR (void)
{
if (U0CTL & BIT2) //SYNC=1,同步SPI
{
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;
}
}
else //异步UART
{
UART0_RX_BUF[nRX0_Len_temp] = RXBUF0; //接收来自的数据
switch (UART0_RX_BUF[nRX0_Len_temp])
{
case 0x11:nPlay=1;nPlay_count=1;nPlay_cnt=0;break;
case 0x12:nPlay=1;nPlay_count=1;nPlay_cnt=1;break;
case 0x13:nPlay=1;nPlay_count=1;nPlay_cnt=2;break;
case 0x01:nRec=1;nRec_count=1;nPlay_cnt=0;break;
case 0x02:nRec=1;nRec_count=1;nPlay_cnt=1;break;
case 0x03:nRec=1;nRec_count=1;nPlay_cnt=2;break;
default:nRX0_Len_temp=0;
}
nRX0_Len_temp += 1;
if(UART0_RX_BUF[nRX0_Len_temp - 1] == 13) //??
{
nRX0_Len = nRX0_Len_temp;
nRev_UART0 = 1;
nRX0_Len_temp = 0;
}
}
}
////////////////////////////////////////
// 处理来自串口 0 的发送中断
//interrupt [UART0TX_VECTOR] void SPI0_TX_ISR(void)
#pragma vector=UART0TX_VECTOR
__interrupt 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)
#pragma vector=PORT1_VECTOR
__interrupt void R_B_ISR (void)
{
// 处理INT中断
if(P1IFG & BIT0)
{
nVOF = 1;//设置标志
P1IFG &= ~(BIT0);//清除中断标志
Delay_us(100);
}
if(P1IFG & BIT1)
{
RAC_count+=1;
}
AvodshekP();
AvodshekR();
// 处理录音按钮
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);
}
}
void SPI_Init(void)
{
P3SEL=BIT3+BIT2+BIT1;
P3DIR|=BIT1;
P3DIR|=BIT0;
P3DIR|=BIT3;
P3OUT|=BIT0;
P3OUT|=BIT1;
P3OUT|=BIT3;
U0CTL=0X00;
U0CTL|=CHAR+SYNC+MM;
U0TCTL=0X00;
U0TCTL=CKPH+SSEL1+SSEL0+STC;
UBR0_0=0X45;
UBR1_0=0X00;
UMCTL_0=0X49;
ME1=USPIE0;
IE1|=URXIE0;
IE1|=UTXIE0;
}
void PORT_Init(void)
{
//将P1口、P3口设置为输入方式
P1DIR = 0;
P3DIR = 0;
//将P1口、P3口设置为一般I/O口
P1SEL = 0;
// P3SEL = 0;
// 将P1.1和P1.2设置为输出方向
// P1DIR |= BIT1;
P1DIR |= BIT2;
// 将SS管脚先设置为高电平
P1OUT |= BIT2;
// 将RAC管脚先设置为高电平
// P1OUT |= BIT1; //这段不知道什么意思
// 将中断寄存器清零
P1IE = 0;
P1IES = 0;
P1IFG = 0;
// 管脚P1.4(Play)使能中断
P1IE |= BIT4;
// 对应的管脚由高到低电平跳变使相应的标志置位
P1IES |= BIT4;
// 管脚P1.5(Record)使能中断
P1IE |= BIT5;
// 对应的管脚由高到低电平跳变使相应的标志置位
P1IES |= BIT5;
// 管脚P1.0(INT)使能中断
P1IE |= BIT0;
// 对应的管脚由高到低电平跳变使相应的标志置位
P1IES |= BIT0;
// 管脚P1.2(RAC)使能中断
// P1IE |= BIT1; // RAC调整为输入之后,不受键盘控制 12.3 中断太频繁,无法读出play键值
// 对应的管脚由高到低电平跳变使相应的标志置位
// P1IES |= BIT1;
}
void Init_CLK(void)
{
unsigned int i;
BCSCTL1 = 0X00;//将寄存器的内容清零
//XT2震荡器开启
//LFTX1工作在低频模式
//ACLK的分频因子为1
do
{
IFG1 &= ~OFIFG; // 清除OSCFault标志
for (i = 0x20; i > 0; i--);
}
while ((IFG1 & OFIFG) == OFIFG); // 如果OSCFault =1
BCSCTL2 = 0X00; //将寄存器的内容清零
BCSCTL2 += SELM1; //MCLK的时钟源为TX2CLK,分频因子为1
BCSCTL2 += SELS; //SMCLK的时钟源为TX2CLK,分频因子为1
}
void Delay_us(unsigned long nValue)// 主时钟8M 微秒为单位
{
unsigned long nCount;
int i;
int j;
nCount=3;
for(i=nValue;i>0;i--)
{
for(j=nCount;j>0;j--);
}
return;
}
void Delay_ms(unsigned long nValue)// 主时钟8M 毫秒为单位
{
unsigned long nCount;
int i;
unsigned long j;
nCount=2667;
for(i=nValue;i>0;i--)
{
for(j=nCount;j>0;j--);
}
return;
}
void Init_UART0(void)
{
U0CTL = 0X00; //将寄存器的内容清零
U0CTL += CHAR; //数据位为8bit
U0TCTL = 0X00; //将寄存器的内容清零
U0TCTL += SSEL1; //波特率发生器选择SMCLK
UBR0_0 = 0X45; //波特率为115200
UBR1_0 = 0X00;
UMCTL_0 = 0X55; //调整寄存器
ME1 |= UTXE0 + URXE0; //使能UART0的TXD和RXD
IE1 |= URXIE0; //使能UART0的RX中断
IE1 |= UTXIE0; //使能UART0的TX中断
P3SEL |= BIT4; //设置P3.4为UART0的TXD
P3SEL |= BIT5; //设置P3.5为UART0的RXD
P3DIR |= BIT4; //P3.4为输出管脚
return;
}
/*
////////////////////////////////////////
// 处理来自串口 0 的发送中断
//interrupt [UART1TX_VECTOR] void UART1_TX_ISR(void)
#pragma vector=UART0TX_VECTOR
__interrupt void UART0_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;
}
}
}
///////////////////////////////////////
// 处理来自串口 0 的接收中断
//interrupt [UART0RX_VECTOR] void UART0_RX_ISR(void)
#pragma vector=UART0RX_VECTOR
__interrupt void UART0_RX_ISR (void)
{
UART0_RX_BUF[nRX0_Len_temp] = RXBUF0; //接收来自的数据
nRX0_Len_temp += 1;
if(UART0_RX_BUF[nRX0_Len_temp - 1] == 13)
{
nRX0_Len = nRX0_Len_temp;
nRev_UART0 = 1;
nRX0_Len_temp = 0;
}
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -