MSP430f149驱动12864液晶

莫回头   2011-8-19 14:07 楼主

各位高手好,帮忙解决一个msp430f149控制12864的问题吗,如何根据12864的时序实现用430来控制,程序该怎么写?有哪位大侠有这方面的程序,详细解答一下,不胜感激!

回复评论 (3)

typedef unsigned char uint8 ;
typedef unsigned int  uint16;
typedef unsigned long uint32;

#define BIT(x)        (1 << (x))

/***************************************
*         液晶控制IO的宏定义
***************************************/
#define cyCS      3      // P2.3,片选信号
#define cySID     4      // P2.4,串行数据  
#define cyCLK     5      // P2.5,同步时钟
#define cyPORT    P2OUT  
#define cyDDR     P2DIR

/*******************************************
*功    能:延时 t us
********************************************/
void Delay_Nus(uint16 t)
{
  while (t--)
  {
    _NOP();
  }
}

/*******************************************
*功    能:延时 1 ms
********************************************/
void Delay_1ms(void)
{
  uint16 i;
  for (i=1000; i>0; i--)       
  {
    _NOP();
  }
}  

/*******************************************
*功    能:延时 t ms
********************************************/  
void Delay_Nms(uint16 t)
{
  while (t--)
  {
    Delay_1ms();
  }
}

void Write_Com(uint8 com) // Write one byte command to LCD12864
{
  uint8 FirstByte = 0xF8;
  uint8 temp = 0;
  uint8 i = 0;
  uint8 j = 3;

  cyPORT |= BIT(cyCS);                        
  cyPORT &= ~BIT(cyCLK);               
  while (j > 0)
  {
    if (j == 3)
    {
      temp = FirstByte;
    }
    else if (j == 2)
    {
      temp = com & 0xf0;
    }
    else  
    {
      temp = (com<<4) & 0xf0;
    }
    for (i=8; i>0; i--)
    {
      if (temp & 0x80)
      {       
        cyPORT |= BIT(cySID);
      }
      else       
      {
        cyPORT &= ~BIT(cySID);               
      }       
      cyPORT |= BIT(cyCLK);                               
      temp <<= 1;
      cyPORT &= ~BIT(cyCLK);
    }
    if (j == 3)
    {
      Delay_Nus(600);            //三个字节之间一定要有足够的延时,否则易出现时序问题
    }
    else      
    {
      Delay_Nus(200);
    }
    j--;
  }
  cyPORT &= ~BIT(cySID);      
  cyPORT &= ~BIT(cyCS);               
}

void Write_Data(uint8 dat) // Write one byte data to LCD12864
{
  uint8 FirstByte = 0xFA;
  uint8 temp = 0;
  uint8 i = 0;
  uint8 j = 3;

  cyPORT |= BIT(cyCS);                        
  cyPORT &= ~BIT(cyCLK);               
  while (j > 0)
  {
    if (j == 3)
    {
      temp = FirstByte;
    }
    else if (j == 2)
    {
      temp = dat & 0xf0;
    }
    else  
    {
      temp = (dat<<4) & 0xf0;
    }
    for (i=8; i>0; i--)
    {
      if (temp & 0x80)
      {       
        cyPORT |= BIT(cySID);
      }
      else       
      {
        cyPORT &= ~BIT(cySID);               
      }       
      cyPORT |= BIT(cyCLK);                               
      temp <<= 1;
      cyPORT &= ~BIT(cyCLK);
    }
    if (j == 3)
    {
      Delay_Nus(600);            //三个字节之间一定要有足够的延时,否则易出现时序问题
    }
    else      
    {
      Delay_Nus(200);
    }
    j--;
  }
  cyPORT &= ~BIT(cySID);      
  cyPORT &= ~BIT(cyCS);               
}

void SET_XY(uint8 x, uint8 y)
{
  uint8 Add = 0;
  if (x == 1)      // 第一行
  {
    Add = 0x80 + y;
  }
  else if (x == 2) // 第二行
  {
    Add = 0x90 + y;
  }
  else if (x == 3) // 第三行
  {
    Add = 0x88 + y;
  }
  else if (x == 4) // 第四行
  {
    Add = 0x98 + y;
  }
  
  Write_Com(Add);
}

/********************************************************************
*功    能:MCU向液晶模块发送1一个字节的数据
*参    数:type--数据类型:0--控制命令,1--显示数据,,data--发送的数据
********************************************************************/
void WriteOneChar(uint8 x, uint8 y, uint8 dat)
{
  SET_XY(x, y);       
  Write_Data(dat);
}

/******************************************************************************
*功    能:显示字符串
*参    数:addr--显示位置的首地址,pt--指向显示字符串的首地址(指针)
*******************************************************************************/
void Write_String(uint8 x, uint8 y, uint8 *pt)
{
  SET_XY(x, y);
  while (*pt != '\0')
  {
    Write_Data(*pt++);
  }
}

/******************************************************************************
*功    能:显示汉字程序
*参    数:x,y--显示位置的首地址,pt--指向显示数据的指针,n--显示汉字的个数
*******************************************************************************/
void WriteChineseCharacters(uint8 x, uint8 y, uint8 *pt, uint8 n)
{
  uint8 i;
  SET_XY(x, y);         
  for (i=0; i<(n*2); i++)
  {
    Write_Data(*pt++);
  }
}

/************************************************************
*功    能:显示一个四位数
*参    数:x,y--显示地址,数字--显示的数字
*************************************************************/
void Write_Number(uint8 x, uint8 y, uint16 Num)
{
    uint8 temp[4];
    temp[0] = Num / 1000;
    temp[1] = Num % 1000 / 100;
    temp[2] = Num % 100 / 10;
    temp[3] = Num % 10;
   
    SET_XY(x, y);
    Write_Data('0' + temp[0]);
    Write_Data('0' + temp[1]);
    Write_Data('0' + temp[2]);
    Write_Data('0' + temp[3]);
}

/************************************************************
*功    能:显示一个由四位数字(含三位小数)表示的电压幅值,单位V
*参    数:addr--显示地址,数字--显示的数字
*************************************************************/
void DisVoltage(uint8 x, uint8 y, uint16 Vol)
{
    uint8 temp[5];
    temp[0] = Vol / 10000;
    temp[1] = Vol % 10000 / 1000;
    temp[2] = Vol % 1000 / 100;
    temp[3] = Vol % 100 / 10;
    temp[4] = Vol % 10;
   
    SET_XY(x, y);
    Write_Data('0' + temp[0]);
    Write_Data('0' + temp[1]);
    Write_Data('.');
    Write_Data('0' + temp[2]);
    Write_Data('0' + temp[3]);
    Write_Data('V');
}

/*******************************************
*功    能:初始化液晶模块
********************************************/
void LCD12864_Init(void)
{
  cyDDR |= BIT(cyCLK) + BIT(cySID) + BIT(cyCS);   //相应的位端口设置为输出
  Delay_Nms(100);                                 //延时等待液晶完成复位
  Write_Com(0x30);  /*功能设置:一次送8位数据,基本指令集*/
  Delay_Nus(50);
  Write_Com(0x02);  /*DDRAM地址归位*/
  Delay_Nus(50);
  Write_Com(0x0C);  /*显示设定:开显示,不显示光标,不做当前显示位反白闪动*/
  Delay_Nus(50);
  Write_Com(0x01);  /*清屏,将DDRAM的位址计数器调整为“00H”*/
  Delay_Nus(50);
  Write_Com(0x06);  /*功能设置,点设定:显示字符/光标从左到右移位,DDRAM地址加1*/
  Delay_Nus(50);               
  
  //Write_String(1, 2, "重邮信科");
  //Write_String(2, 0, "abcd");
  //Write_String(3, 0, "123456");
  //Write_String(4, 0, "gh");
  //WriteChineseCharacters(4, 2, "逸夫楼", 3);
  Write_String(1, 0, " Us = 60.00V");
  Write_String(2, 0, " Ud = ");
  WriteChineseCharacters(3, 0, "输入电压:", 5);
  WriteChineseCharacters(4, 0, "系统负载:", 5);
}

这个是3线控制的程序,时钟为1MHz,这个是我在LaunchPad上跑过的程序,IO随便接三个就行,只要是1MHz的时钟其他型号的430都是可以用的,如果用不同时钟频率修改下延时函数就OK了~
点赞  2013-7-25 19:21
430不是还需要配置时钟吗?我用的是msp430f5438A
点赞  2018-5-28 16:42
这个帖子都过去五年了
点赞  2018-5-28 16:43
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复