www.pudn.com > 12864ymy.rar > 12864ymy.c


#include  
#define   LCD12864DIR      P1DIR 
#define   LCD12864OUT      P1OUT 
#define   LCD12864IN       P1IN 
 
#define   LCD12864_CS      BIT0 
#define   LCD12864_SID     BIT2 
#define   LCD12864_SCLK     BIT4 
 
#define   LCD12864_CS_LOW    LCD12864OUT &= ~LCD12864_CS 
#define   LCD12864_CS_HIGH   LCD12864OUT |= LCD12864_CS 
#define   LCD12864_SCLK_LOW   LCD12864OUT &= ~LCD12864_SCLK 
#define   LCD12864_SCLK_HIGH  LCD12864OUT |= LCD12864_SCLK 
#define   LCD12864_SID_LOW   LCD12864OUT &= ~LCD12864_SID 
#define   LCD12864_SID_HIGH  LCD12864OUT |= LCD12864_SID 
 
#define   LCD12864_SID_READ    (12864IN & 12864_SID) 
 
#define uchar unsigned char 
#define uint unsigned int  
//==================================================================== 
//函数声明 
void Delay(uint ms);      //延时子程序 
//void Write_cmd(cmd);   //写指令子程序 
//void Write_data(uchar _data); //写数据子程序 
//void Position(uchar pos);  //定位函数 
//void Display(uchar address); // 
//void Init_12864(); 
//void LcdSetXY(uchar x, uchar y, uchar *pt); 
void W_1byte(uchar RW, uchar RS, uchar W_data); 
void Write_8bits(uint W_bits); 
void LCD_Init(void); 
//==================================================================== 
//常量字符数组 
uchar mynew1[]={"7920_3wires_demo"}; 
uchar mynew2[]={"Create by:朱江"}; 
uchar mynew3[]={"E_mail:ntzhf100@"}; 
uchar mynew4[]={"163.com"}; 
/******************************************************************** 
 
********************************************************************/ 
void main(void) 
{ 
    unsigned int itemp; 
    WDTCTL = WDTPW + WDTHOLD;              //停止系统软件看门狗 
    P5DIR |= BIT4;                                         //P54为输出 
    P5SEL |= BIT4;                                         //P54第二功能:MCLK输出 
    BCSCTL1 &= ~XT2OFF;                                       //XT2 = HF-XTAL 
    do { 
        IFG1 &= ~OFIFG;                                           //清除OSCFault标志位 
        for (itemp=0xFF;itemp>0;itemp--);                                         //延时等待晶振 
    } while ((IFG1 & OFIFG));                                    //OSCFault标志位始终有效? 
 
  BCSCTL2 |= SELM_2   ;//+DIVM_3;                                       //MCLK = XT2 
 
    uchar i = 0; 
    LCD12864DIR = 0XFF; 
    LCD12864_CS_LOW;    //CS = 0; 
    LCD12864_SCLK_LOW;   //SCLK = 0; 
    LCD12864_SID_LOW;   //SID = 0; 
    LCD_Init(); 
    while(1) 
    {  
       _NOP();//nop; 
       _NOP();//nop; 
       W_1byte(0,0,0x80); 
       _NOP();//nop; 
       for(i=0;mynew1[i]!='\0';i++) 
       { 
          W_1byte(0,1,mynew1[i]); 
       } 
       W_1byte(0,0,0x90); 
       for(i=0;mynew2[i]!='\0';i++) 
       { 
          W_1byte(0,1,mynew2[i]);  
       } 
       W_1byte(0,0,0x88); 
       for(i=0;mynew3[i]!='\0';i++) 
       { 
          W_1byte(0,1,mynew3[i]); 
       } 
       W_1byte(0,0,0x98); 
       for(i=0;mynew4[i]!='\0';i++) 
       { 
          W_1byte(0,1,mynew4[i]); 
       } 
       _NOP();//nop;  
    } 
} 
 
 
/******************************************************************/ 
void LCD_Init(void) 
{ 
  uchar cmd; 
  cmd=0x30;   //功能设置 8位数据,基本指令 
  W_1byte(0,0,cmd); 
  Delay(16); 
  cmd=0x0C;   //显示状态 ON,游标OFF,反白OFF 
  W_1byte(0,0,cmd); //写指令 
  Delay(16); 
  cmd=0x01;   //清除显示 
  W_1byte(0,0,cmd); //写指令 
  Delay(16); 
  cmd=0x02;   //地址归位 
  W_1byte(0,0,cmd); //写指令 
  Delay(16); 
  cmd=0x80;   //设置DDRAM地址 
  W_1byte(0,0,cmd); //写指令 
  Delay(16);   //延时 
} 
/******************************************************************* 
函 数 名:W_1byte 
入口参数:RW、RS、W_data 
出口参数:无 
建立日期:2007年3月3日 
修改日期: 
函数作用:写一个字节的数据到12864液晶,包括指令和数据 
说    明:RW=1,从液晶读数据到MCU;RW=0,写一个数据到液晶; 
   (一般RW都设为0,即只向液晶写数据,不读数据) 
          RS=1,写入的是数据;RS=0,写入的是指令; 
    一般模式:RW=0,RS=1;写数据 
       RW=0,RS=0;写指令 
********************************************************************/ 
void W_1byte(uchar RW, uchar RS, uchar W_data) 
{ 
 uint H_data,L_data,S_ID = 0xf8;  //11111RWRS0 
 if(RW == 0) 
 { 
   S_ID &= ~0x04; 
 } 
 else     //if(RW==1) 
 { 
   S_ID |= 0X04; 
 } 
 if(RS == 0) 
 { 
   S_ID &= ~0x02; 
 } 
 else     //if(RS==1) 
 { 
   S_ID |= 0X02; 
 } 
 H_data = W_data; 
 H_data &= 0xf0;   //屏蔽低4位的数据 
 L_data = W_data;     //xxxx0000格式 
 L_data &= 0x0f;   //屏蔽高4位的数据 
 L_data <<= 4;   //xxxx0000格式 
 LCD12864_CS_HIGH;    //CS = 1; 
 Write_8bits(S_ID);   //发送S_ID 
 Write_8bits(H_data); //发送H_data 
 Write_8bits(L_data); //发送L_data 
 LCD12864_CS_LOW;     //CS = 0;  
} 
/******************************************************************** 
函 数 名:Write_8bits 
入口参数:W_bits 
出口参数:无 
建立日期:2007年3月3日 
修改日期: 
函数作用:负责串行输出8个bit位 
说    明: 
********************************************************************/ 
void Write_8bits(uint W_bits) 
{ 
 uint i,Temp_data; 
 for(i=0; i<8; i++) 
 { 
  Temp_data = W_bits; 
  Temp_data <<= i; 
  if((Temp_data&0x80)==0)  //bit7 is zero 
  { 
   LCD12864_SID_LOW;    //SID = 0; 
   _NOP();    //nop; 
   LCD12864_SCLK_HIGH;    //SCLK = 1; 
   _NOP();    //nop; 
   _NOP();    //nop; 
   LCD12864_SCLK_LOW;   //SCLK = 0; 
   _NOP();    //nop; 
   LCD12864_SID_LOW;    //SID = 0; 
  } 
  else         //bit7 is one 
  { 
    LCD12864_SID_HIGH;    //SID = 1; 
   _NOP();    //nop; 
   LCD12864_SCLK_HIGH;    //SCLK = 1; 
   _NOP();    //nop; 
   _NOP();    //nop; 
   LCD12864_SCLK_LOW;   //SCLK = 0; 
   _NOP();    //nop; 
   LCD12864_SID_LOW;    //SID = 0; 
  }  
 } 
} 
/******************************************************************** 
函 数 名:Delay 
入口参数:ms 
出口参数:无 
建立日期:2007年3月3日 
修改日期: 
函数作用:毫秒级的延时程序,当晶振为12Mhz时,xtal=12; 
说    明: 
********************************************************************/ 
void Delay(uint ms)  
{  
    uint i;  
    while(ms--)     
   {  
     for(i=1;i<(uint)(8*143-2);i++)  
         ;  
   }    
} 
//===================================================================*/