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++) ; } } //===================================================================*/