芯睿MK9M186P串口例程序

芯睿MK9M186P串口例程序

/*******************************************
MK9M186P Uart Test
Send Data:"\rPAx=?\n"
lcd ram當一般ram用有問題
TX:PD6:I/O設Input
RX:PD7:I/O設Input
*******************************************/


#include  "MK9M186P.h"
#include  "UartDef.h"
#include  "clib9m186p.h"

//-----------------------------------------
//2選1
#define _TxCode     //傳送碼
//#define _Rx_PC_Code   //接收碼/PC->IC

//-----------------------------------------
#if 1
uchar /*__at (0xA0)*/ CharCnt;
uchar /*__at (0x61)*/ CmdEnd;
uchar __at 0x0C0/*(0x062)*/ Cmd[10];//串口指令数组
uchar __at (0x040) lcdram[64]; //占用LCD Ram,不要拿來用
#else
uchar  CharCnt;
uchar  CmdEnd;
uchar  Cmd[10];
#endif
//-----------------------------------------

void INT(void) __interrupt
{
   if(IRQF2bits.RXF)//接收中断
   { 
      if(UART_RX_DATA == _CR)//清除串口接收到的数据
        CharCnt = 0;//串口数据地址清零
      else if(UART_RX_DATA == _LF)//指令
        CmdEnd = 1;
      Cmd[CharCnt] = UART_RX_DATA;//将接收到的数据存入数组
      //Test TX/RX Data
      #ifdef _Rx_PC_Code
      UART_TX_DATA = Cmd[CharCnt];//数组的数据发送出去
      UART_STATUSbits.TX_S = 1; //開始送Data
      #endif
      CharCnt++;
      PA_DATbits.PA3 ^= 1; //位取反
   }
   if(IRQF2bits.TXF)//发送中断
   {
     PA_DATbits.PA1 ^= 1;
   }
   IRQF = 0x00;
   IRQF2 = 0x00;
}
//-----------------------------------------

void Fast4MHz()
{
   SYS_CTL = 0x00;
   SYS_CTL1 = 0x01;
   SYS_CTL = 0x80;
   Nop();
   Nop();
}
void Fast1_2MHz()
{
   SYS_CTL = 0x20;
   SYS_CTL1 = 0x00;
   SYS_CTL |= 0x80;
   Nop();
   Nop();
}
//------------------------------------------------------------------------------

void DecodeUartCmd()
{
   if(CmdEnd)
   {
      if((Cmd[1] == 'P') && (Cmd[2] == 'A') && (Cmd[4] == '='))
      {
         switch(Cmd[3] - '0')
         {
            case 0: //PA0=0/1
                   PA_DATbits.PA0 = (Cmd[5] - '0'); //PA_DATbits 就是位控制
                 break;
            case 1: //PA1=0/1
                   PA_DATbits.PA1 = (Cmd[5] - '0');
                 break;
            case 2: //PA2=0/1
                   PA_DATbits.PA2 = (Cmd[5] - '0');
                 break;
            case 3: //PA3=0/1
                   PA_DATbits.PA3 = (Cmd[5] - '0');
                 break;
            case 4: //PA4=0/1
                   PA_DATbits.PA4 = (Cmd[5] - '0');
                 break;
            case 5: //PA5=0/1
                   PA_DATbits.PA5 = (Cmd[5] - '0');
                 break;
            case 6: //PA6=0/1
                   PA_DATbits.PA6 = (Cmd[5] - '0');
                 break;
         }
      }
      CmdEnd = 0;
      PA_DATbits.PA4 ^= 1; //資料全收完
   }
}
//------------------------------------------------------------------------------

void NopWait()
{
   Nop();
   Nop();
   Nop();
   Nop();
}
//------------------------------------------------------------------------------

void WaitCompleted()
{
   while(true)
   {
      if(!UART_STATUSbits.TX_S)//如果发送结束就退出
        break;
   }
}
//------------------------------------------------------------------------------

void delay()
{
 volatile unsigned char i, j, k;

   for(i = 0; i < 200; i++)
     for(j = 0; j < 100; j++)
       for(k = 0; k < 100; k++)
         Nop();
}
//------------------------------------------------------------------------------

void main()
{ 
   CharCnt = 0;
   CmdEnd = 0;
   IRQM = 0x00;
   IRQF = 0x00;
   IRQF2 = 0x00;
   WDT_CTL = 0x00;
   PA_DIR = 0x00;
   PA_DAT = 0x00;
   PD_DIR = 0xFF; //TX/RX:I/O設Input

   PAD_CTL1 = 0x00;   //Seg->I/O pin
   PAD_CTL10 = 0x02;  //I/O->Uart pin
   UART_STATUS = 0x00; //8bit,....
   UART_BAUD0 = (bps_9600 & 0x00FF);
   UART_BAUD1 = ((bps_9600 >> 8) & 0x00FF);
   Set_IRQM_CTL(IRQM_CTL_INTM_EN | IRQM_CTL_RXM_EN);
   Fast4MHz(); //Fast1_2MHz();不行,一定要4MHz 跑

   #ifdef _TxCode
   while(true)//串口发送 "PA0=1"
   {
      WaitCompleted();
      UART_TX_DATA = 0x0D;//_CR;
      UART_STATUSbits.TX_S = 1; //開始送Data

      WaitCompleted();
      UART_TX_DATA = 0x50;//'P';
      UART_STATUSbits.TX_S = 1; //開始送Data

      WaitCompleted();
      UART_TX_DATA = 0x41;//'A';
      UART_STATUSbits.TX_S = 1; //開始送Data

      WaitCompleted();
      UART_TX_DATA = 0x30;//'0';
      UART_STATUSbits.TX_S = 1; //開始送Data

      WaitCompleted();
      UART_TX_DATA = 0x3D;//'=';
      UART_STATUSbits.TX_S = 1; //開始送Data

      WaitCompleted();
      UART_TX_DATA = 0x31;//'1';
      UART_STATUSbits.TX_S = 1; //開始送Data

      WaitCompleted();
      UART_TX_DATA = 0x0A;//_LF;
      UART_STATUSbits.TX_S = 1; //開始送Data

      //全傳完等待一段時間再傳資料
      WaitCompleted();
      UART_STATUS = 0x00;
      PA_DATbits.PA2 ^= 1;
      delay();
   }
   #endif
   //===========================================================

   #ifdef _Rx_PC_Code
   while(true)
   {
      DecodeUartCmd();
      NopWait();
   }
   #endif

} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值