MSP430串口通信

#include "msp430x14x.h"
#include "Cry12864.h"
#include "Cry12864.C"

int add;
char data[16];
char flash_data[16];
char hang1[16];

void write_SegA(void);
void Copy_A2B(void);
void Read_SegB(void);

int t = 0;//流水灯判断标志位
unsigned char a;
void main( void )
{
  P3DIR = 0XFF;P3OUT = 0XFF;//12864液晶屏启用代码
  P4DIR = 0XFF;P4OUT = 0XFF;
  P5DIR = 0XFF;P5OUT = 0XFF;
  P6DIR = 0XFF;P6OUT = 0XFF;
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;//关闭看门狗
 
  P6DIR |= BIT2;P6OUT |= BIT2; //关闭电平转换
  FCTL2 = FWKEY + FSSEL0 + FN0;
  data[0]='M';data[1]='Y';
  data[2]=' ';data[3]='L';
  data[4]='O';data[5]='V';
  data[6]='E';data[7]=' ';
  data[8]='L';data[9]='i';
  data[10]='t';data[11]='t';
  data[12]='l';data[13]='e';
  data[14]=' ';data[15]='Q';
  add = 16;
  for(int i = 0; i <= 10000; i++);
  Ini_Lcd();

  write_SegA();
  Copy_A2B();
  Read_SegB();
  
  hang1[0]=flash_data[0];//将字符送进缓冲区,使之在屏幕显示
  hang1[1]=flash_data[1];
  hang1[2]=flash_data[2];
  hang1[3]=flash_data[3];
  hang1[4]=flash_data[4];
  hang1[5]=flash_data[5];
  hang1[6]=flash_data[6];
  hang1[7]=flash_data[7];
  hang1[8]=flash_data[8];
  hang1[9]=flash_data[9];
  hang1[10]=flash_data[10];
  hang1[11]=flash_data[11];
  hang1[12]=flash_data[12];
  hang1[13]=flash_data[13];
  hang1[14]=flash_data[14];
  hang1[15]=flash_data[15];
  Disp_HZ(0x80,hang1,16);
  
  P3SEL |= 0X30;//0011 0000 选择p3.4和p3.5做UART通信接口
  P2DIR = 0XFF;
  P2OUT=0x7f;
  
  UCTL0 |= CHAR;//选择8位字符char(8位数据,一位停止位) 
  UTCTL0 |= SSEL0;// UCLK=ACLK UTCTL0同步异步通信传输模块 SSEL0选择时钟源
  UBR00 = 0x03;//波特率9600
  UBR10 = 0x00;
  UMCTL0 = 0x4A;

  
  ME1 |= UTXE0 + URXE0;//使能USART0的发送和接收
  UCTL0 &=~ SWRST;//初始化UARI状态机
  IE1 |= URXIE0;//使能USART0的接收中断,IE是中断使能寄存器
   _EINT();//打开全局中断
  while(1)
  {
    if(t == 1)//流水灯代码
    {
    a=P2OUT&0x01;
    P2OUT>>=1;//小灯右移
    a<<=7;
    P2OUT|=a;
    for(int i=0;i<=30000;i++);//软延时
    }
  }
}

#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx(void)
{
  unsigned char n;
  while((IFG1 & UTXIFG0)==0);   //等待以前的字符发送完毕,IFG是中断标志寄存器      
  TXBUF0=RXBUF0;//接收到的字符发送出去
  n = RXBUF0; //标志位
  if(n=='1')//点亮第一个小灯
  {
    P2OUT=0xFE;
    
  }
  if(n=='2')//熄灭第一个小灯
    P2OUT=0xFF;
  if(n=='3')//开启蜂鸣器
  {
    P6SEL = 0X00;
    P6DIR = 0XFF;
    P6OUT = 0X00;
  }
  if(n=='4')//关闭蜂蜜器
  {
    P6DIR = 0x00;
  }
  if(n=='5')//流水灯标志位置1
  {
    t=1;
  }
  if(n=='6')//流水灯标志位复位
  {
    t=0;
  }
}

void write_SegA(void)
{
  char *Flash_data_ptr;
  unsigned int *Flash_int_ptr;
  unsigned int i;
  
  Flash_data_ptr = (char *)0x1080;
  FCTL1 = FWKEY + ERASE;
  FCTL3 = FWKEY;
  *Flash_data_ptr = 0;
  FCTL1 = FWKEY + WRT;
  for(i = 0; i < 16; i++)
  {
    *Flash_data_ptr++ = data[i];
  }
  Flash_int_ptr = (unsigned int *)Flash_data_ptr;
  *Flash_int_ptr = add;
  
  FCTL1 = FWKEY;
  FCTL3 = FWKEY + LOCK;
}

void Copy_A2B(void)
{
  char *Flash_data_ptrA;
  char *Flash_data_ptrB;
  unsigned int *Flash_int_ptrA;
  unsigned int *Flash_int_ptrB;
  unsigned int i;
  
  Flash_data_ptrA = (char *)0x1080;
  Flash_data_ptrB = (char *)0x1000;
  
  FCTL1 = FWKEY + ERASE;
  FCTL3 = FWKEY;
  *Flash_data_ptrB = 0;
  FCTL1 = FWKEY + WRT;
  
  for(i = 0; i < 16; i++)
  {
    *Flash_data_ptrB++ = *Flash_data_ptrA++;
  }
  
  Flash_int_ptrA = (unsigned int *)Flash_data_ptrA;
  Flash_int_ptrB = (unsigned int *)Flash_data_ptrB;
  *Flash_int_ptrB = *Flash_int_ptrA;
  
  FCTL1 = FWKEY;
  FCTL3 = FWKEY + LOCK;
}

void Read_SegB(void)
{
  char *Flash_data_ptr1;
  unsigned int j;
  
  Flash_data_ptr1=(char *)0x1000;
  for(j = 0; j < 16; j++)
  {
    flash_data[j]= *Flash_data_ptr1++;
  }
}

Cry12864.C

#include <msp430x14x.h>
typedef unsigned char uchar;
typedef unsigned int  uint;

extern const unsigned char shuzi_table[];

#define LCD_DataIn    P4DIR=0x00    //数据口方向设置为输入
#define LCD_DataOut   P4DIR=0xff    //数据口方向设置为输出
#define LCD2MCU_Data  P4IN
#define MCU2LCD_Data  P4OUT
#define LCD_CMDOut    P3DIR|=0x07     //P3口的低三位设置为输出
#define LCD_RS_H      P3OUT|=BIT0      //P3.0
#define LCD_RS_L      P3OUT&=~BIT0     //P3.0
#define LCD_RW_H      P3OUT|=BIT1      //P3.1
#define LCD_RW_L      P3OUT&=~BIT1     //P3.1
#define LCD_EN_H      P3OUT|=BIT2      //P3.2
#define LCD_EN_L      P3OUT&=~BIT2     //P3.2

/*******************************************
函数名称:Delay_1ms
功    能:延时约1ms的时间
参    数:无
返回值  :无
********************************************/
void Delay_1ms(void)
{
	uchar i;
    
	for(i = 150;i > 0;i--)  _NOP();
} 
/*******************************************
函数名称:Delay_Nms
功    能:延时N个1ms的时间
参    数:n--延时长度
返回值  :无
********************************************/
void Delay_Nms(uint n)
{
    uint i;
    
    for(i = n;i > 0;i--)    Delay_1ms();
}
/*******************************************
函数名称:Write_Cmd
功    能:向液晶中写控制命令
参    数:cmd--控制命令
返回值  :无
********************************************/
void Write_Cmd(uchar cmd)
{
    uchar lcdtemp = 0;
			
    LCD_RS_L;
    LCD_RW_H;
    LCD_DataIn;  
    do                       //判忙
    {    
        LCD_EN_H;
       	_NOP();					
       	lcdtemp = LCD2MCU_Data; 
       	LCD_EN_L;
        
    }
    while(lcdtemp & 0x80); 
    
    LCD_DataOut;    
    LCD_RW_L;  		
    MCU2LCD_Data = cmd; 
    LCD_EN_H;
    _NOP();						  			
    LCD_EN_L;
}

/*******************************************
函数名称:Write_Data
功    能:向液晶中写显示数据
参    数:dat--显示数据
返回值  :无
********************************************/
void  Write_Data(uchar dat)
{
    uchar lcdtemp = 0;   
        
    LCD_RS_L;
    LCD_RW_H;  
    LCD_DataIn;   
    do                       //判忙
    {    
        LCD_EN_H;
        _NOP();						
        lcdtemp = LCD2MCU_Data; 
        LCD_EN_L;      
    }
    while(lcdtemp & 0x80);  
    
    LCD_DataOut; 
    LCD_RS_H;
    LCD_RW_L;  
        
    MCU2LCD_Data = dat;
    LCD_EN_H;
    _NOP();
    LCD_EN_L;
}

/*******************************************
函数名称:Ini_Lcd
功    能:初始化液晶模块
参    数:无
返回值  :无
********************************************/
void Ini_Lcd(void)
{                  
    LCD_CMDOut;    //液晶控制端口设置为输出
    
    Delay_Nms(500);
    Write_Cmd(0x30);   //基本指令集
    Delay_1ms();
    Write_Cmd(0x02);   // 地址归位
    Delay_1ms();
	Write_Cmd(0x0c);   //整体显示打开,游标关闭
    Delay_1ms();
	Write_Cmd(0x01);   //清除显示
    Delay_1ms();
	Write_Cmd(0x06);   //游标右移
    Delay_1ms();
	Write_Cmd(0x80);   //设定显示的起始地址
}

/*******************************************
函数名称:Disp_HZ
功    能:控制液晶显示汉字
参    数:addr--显示位置的首地址
          pt--指向显示数据的指针
          num--显示字符个数
返回值  :无
********************************************/
void Disp_HZ(char addr,char * pt,char num)
{
    char i;
		
    Write_Cmd(addr); 
      for(i = 0;i<num;i++) 
      Write_Data(*(pt++)); 
}

Cry12864.h

void Delay_1ms(void);
void Delay(unsigned int n);
void Write_Cmd(unsigned char cod);
void Write_Data(unsigned char dat);
void Ini_Lcd(void);
void Disp_HZ(char addr,char * pt,char num);
void Disp_ND(unsigned char addr,unsigned int  thickness);
void Draw_TX(unsigned char Yaddr,unsigned char Xaddr,const unsigned char * dp) ; 
void Draw_PM(const unsigned char *ptr);

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MSP430是一种微控制器,可以通过串口通信与其他设备进行通信。串口通信是通过发送和接收数据位来进行通信的,通常使用UART协议来进行通信。 以下是使用MSP430进行串口通信的一般步骤: 1. 配置MSP430串口模块,包括波特率、数据位、停止位和校验位等参数。 2. 编写发送和接收数据的程序。 3. 在发送数据时,将数据写入串口缓冲区,并等待传输完成。 4. 在接收数据时,检查串口缓冲区是否有数据可读,如果有,则读取数据并进行处理。 下面是一个简单的MSP430串口通信示例代码: ```c #include <msp430.h> void uart_init() { // 配置UART参数 UCA0CTL1 |= UCSWRST; // 复位UART UCA0CTL1 |= UCSSEL_2; // 时钟源为SMCLK UCA0BR0 = 104; // 波特率设置为9600 UCA0BR1 = 0; UCA0MCTL |= UCBRS_1 + UCBRF_0; // 小数分频器设置 UCA0CTL1 &= ~UCSWRST; // 启动UART } void uart_send(char c) { while (!(UCA0IFG & UCTXIFG)); // 等待传输完成 UCA0TXBUF = c; // 将字符写入缓冲区 } char uart_recv() { while (!(UCA0IFG & UCRXIFG)); // 等待数据接收 return UCA0RXBUF; // 读取接收的数据 } int main(void) { WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗定时器 uart_init(); // 初始化UART char data[] = "Hello, world!"; // 要发送的数据 int len = sizeof(data) / sizeof(char); int i; for (i = 0; i < len; i++) { uart_send(data[i]); // 发送数据 } while (1) { char c = uart_recv(); // 接收数据 uart_send(c); // 回显数据 } return 0; } ``` 这个例子演示了如何使用MSP430与其他设备进行串口通信。在这个例子中,我们使用UART协议来进行通信,并且实现了发送和接收数据的功能。您可以根据您的具体需求修改代码,以便更好地满足您的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值