码迷,mamicode.com
首页 > 其他好文 > 详细

msp430之lcd12864驱动

时间:2016-07-20 01:10:03      阅读:237      评论:0      收藏:0      [点我收藏+]

标签:

并行驱动代码:

#include "msp430g2553.h"  
#define uint unsigned int  
#define uchar unsigned char  
  
/***************************************** 
 RS--->>P2.0 
 RW--->>P2.1 
 E---->>P2.2    
 PSB-->>P2.3   
 PAUSE>>P2.4 
 RES-->>P2.5 
******************************************/  
#define DataPort P1OUT        //MCU P2<------> LCM  
  
/* 
void DelayMs(uint x) 
{ 
    uint a,b; 
    for(a=0;a<x;a++) 
      for(b=0;b<1000;b++); 
} 
*/  
  
  
void DelayUs2x(unsigned char t)  
{     
 while(--t);  
}  
  
void DelayMs(unsigned char t)  
{  
       
 while(t--)  
 {  
     //大致延时1mS  
     DelayUs2x(245);  
     DelayUs2x(245);  
 }  
}  
  
  
void DelayUs(uint x)  
{  
    uint a,b;  
    for(a=0;a<x;a++)  
      for(b=0;b<2;b++);  
}  
//检测忙位  
void Check_Busy()  
{    
    P2OUT&=0xFE;     //RS=0  
    P2OUT |=0x02;    //RW=1  
    P2OUT |=0x04;    //E=1  
    DataPort=0xFF;   //  
    P1DIR=0x00;     //数据端口设为输入状态  
    while((P2IN&0x80)==0x80);//忙则等待  
    P1DIR=0xFF;    //数据端口还原为输出状态  
    P2OUT&=0xFB;  
}  
  
/*---------------------写命令------------------------*/  
void Write_Cmd(unsigned char Cmd)  
{  
    Check_Busy();  
    P2OUT&=0xFE;   //RS=0;  
    P2OUT&=0xFD;  //RW=0;  
    P2OUT |=0x04;  //E=1;  
    DataPort=Cmd;  
    DelayUs(5);  
    P2OUT&=0xFB;  //E=0;  
    DelayUs(5);  
}  
/*------------------------------------------------ 
                    写数据 
------------------------------------------------*/  
void Write_Data(unsigned char Data)  
{  
    Check_Busy();  
    P2OUT |=0x01;     //RS=1;  
    P2OUT&=0xFD;      //RW=0;  
    P2OUT |=0x04;      //E=1;  
    DataPort=Data;  
    DelayUs(5);  
    P2OUT&=0xFB;      //E=0;  
    DelayUs(5);  
}  
  
void Init_ST7920()  
{    
   DelayMs(40);           //大于40MS的延时程序  
   P2OUT |=0x08;         //PSB=1;  设置为8BIT并口工作模式  
   DelayMs(1);            //延时  
   P2OUT&=0xDF;           //RES=0;  复位  
   DelayMs(1);            //延时  
   P2OUT |=0x20;          //RES=1;    复位置高  
   DelayMs(10);  
   Write_Cmd(0x30);       //选择基本指令集  
   DelayUs(50);         //延时大于100us  
   Write_Cmd(0x30);       //选择8bit数据流  
   DelayUs(20);         //延时大于37us  
   Write_Cmd(0x0c);       //开显示(无游标、不反白)  
   DelayUs(50);         //延时大于100us  
   Write_Cmd(0x01);       //清除显示,并且设定地址指针为00H  
   DelayMs(15);           //延时大于10ms  
   Write_Cmd(0x06);       //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位,光标从右向左加1位移动  
   DelayUs(50);         //延时大于100us  
}  
  
/*------------------------------------------------ 
                   显示字符串 
x:横坐标值,范围0~8 
y:纵坐标值,范围1~4 
------------------------------------------------*/  
void LCD_PutString(unsigned char x,unsigned char y,char *s)  
{   
 switch(y)  
     {  
      case 1: Write_Cmd(0x80+x);break;  
      case 2: Write_Cmd(0x90+x);break;  
      case 3: Write_Cmd(0x88+x);break;  
      case 4: Write_Cmd(0x98+x);break;  
      default:break;  
     }  
 while(*s>0)  
   {   
      Write_Data(*s);  
      s++;  
      DelayUs(100);  //  
   }  
}  
  
  
int main(void)  
{  
     
    char* string1="12864LCD Demo";  
    char* string2="Demo for Msp430";  
    char* string3="Launch pad G2553";  
    char* string4="电控》微电》哈哈》";  
    WDTCTL = WDTPW + WDTHOLD;//关闭看门狗  
    P1DIR=0xFF;//配置P1为输出,作为数据端口  
    P2DIR=0xFF;//配置P2为输出,作为控制端口  
    Init_ST7920();  
    while(1)  
    {  
          
        LCD_PutString(0,1,string1);  
        DelayUs(20);  
        LCD_PutString(0,2,string2);  
        DelayUs(20);  
        LCD_PutString(0,3,string3);  
        DelayUs(20);  
        LCD_PutString(0,4,string4);  
        DelayUs(20);  
    }  
} 

 

串行驱动代码:

#include  "msp430g2553.h"  
  
#define CS1 P1OUT |=0x01              
#define CS0 P1OUT &=0x01  
#define SID1 P1OUT |=0x02  
#define SID0 P1OUT &=~0x02  
#define SCLK1 P1OUT |=0x04  
#define SCLK0 P1OUT &=~0x04  
  
  
void DelayUs2x(unsigned char t)  
{     
 while(--t);  
}  
  
void delay_1ms(unsigned char t)  
{  
       
 while(t--)  
 {  
     //大致延时1mS  
     DelayUs2x(245);  
     DelayUs2x(245);  
 }  
}  
  
              
  
void sendbyte(unsigned char zdata)  
{  
    unsigned int i;  
      
    for(i=0; i<8; i++)  
    {  
        if((zdata << i) & 0x80)  
        {  
            SID1;  
        }  
        else  
        {  
            SID0;  
        }  
        SCLK0;  
        SCLK1;  
    }  
}  
  
void write_com(unsigned char cmdcode)  
{  
    CS1;  
    sendbyte(0xf8);   //1 1 1 1 RS RW 0   写操作RW=0 11111000写数据 11111010写指令  
    sendbyte(cmdcode & 0xf0);  
    sendbyte((cmdcode << 4) & 0xf0);  
    delay_1ms(1);  
    CS0;  
}  
  
void write_data(unsigned char Dispdata)  
{  
    CS1;  
    sendbyte(0xfa);  
    sendbyte(Dispdata & 0xf0);  
    sendbyte((Dispdata << 4) & 0xf0);  
    delay_1ms(1);  
    CS0;  
}  
  
void Put_String(unsigned int x,unsigned int y,unsigned char* s)  
{  
     switch(y)  
     {  
      case 1: write_com(0x80+x);break;  
      case 2: write_com(0x90+x);break;  
      case 3: write_com(0x88+x);break;  
      case 4: write_com(0x98+x);break;  
      default:break;  
     }  
    while(*s>0)  
   {   
      write_data(*s);  
      s++;  
      DelayUs2x(50);  
   }  
}  
  
void lcdinit()  
{  
    delay_1ms(200);  
    write_com(0x30);  //功能设定:基本指令集  
    delay_1ms(20);  
    write_com(0x0c);  //显示状态:整体显示,游标关  
    delay_1ms(20);  
    write_com(0x01);  //清空显示  
    delay_1ms(200);  
}  
  
int main( void )  
{  
      
    WDTCTL = WDTPW + WDTHOLD; //关闭看门狗  
    P1DIR=0xFF;  
    P1OUT=0x00;  
    lcdinit();  
    while(1)  
    {  
      
       Put_String(1,1,"speed");           
                  
    }  
      
}  

 

msp430之lcd12864驱动

标签:

原文地址:http://www.cnblogs.com/CenTyger/p/5686680.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!