之前已经把12864液晶的并行显示汉字,图形的程序上传,现在上传这几天调出来的串行显示汉字的源程序,至此12864液晶的学习暂告一段落。
//=================================================================== #include <reg51.h> #include <string.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char //==================================================================== //函数声明 void Delay(uint ms); //延时子程序 void W_1byte(uchar RW, uchar RS, uchar W_data); void Write_8bits(uint W_bits); void LCD_Init(void);
sbit CS=P1^0; //CS=RS sbit SID=P1^1; //RW=SID sbit SCLK=P1^2; //E=SCLK sbit PSB=P1^3; //E=SCLK //=================================================================== code uchar mynew1[]={"欢迎你使用本产品"}; code uchar mynew2[]={"菜鸟一只多多指教"}; code uchar mynew3[]={"一起学习一起进步"}; code uchar mynew4[]={" QQ:313589449 "};
void main() { uchar i=0; SP = 0X60; CS = 0; SCLK = 0; SID = 0; PSB=0; LCD_Init(); while(1) { W_1byte(0,0,0x80); _nop_(); for(i=0;mynew1!='\0';i++) { W_1byte(0,1,mynew1); } W_1byte(0,0,0x90); for(i=0;mynew2!='\0';i++) { W_1byte(0,1,mynew2); } W_1byte(0,0,0x88); for(i=0;mynew3!='\0';i++) { W_1byte(0,1,mynew3); } W_1byte(0,0,0x98); for(i=0;mynew4!='\0';i++) { W_1byte(0,1,mynew4);
} } } /******************************************************************/ void LCD_Init(void) { uchar cmd; cmd=0x30; //功能设置 8位数据,基本指令 W_1byte(0,0,cmd); Delay(2); cmd=0x0C; //显示状态 ON,游标OFF,反白OFF W_1byte(0,0,cmd); //写指令 Delay(2); cmd=0x01; //清除显示 W_1byte(0,0,cmd); //写指令 Delay(2); cmd=0x02; //地址归位 W_1byte(0,0,cmd); //写指令 Delay(2); cmd=0x80; //设置DDRAM地址 W_1byte(0,0,cmd); //写指令 Delay(2); //延时 } /******************************************************************* 函数作用:写一个字节的数据到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格式 CS = 1; Write_8bits(S_ID); //发送S_ID Write_8bits(H_data); //发送H_data Write_8bits(L_data); //发送L_data CS = 0; } /******************************************************************** 函数作用:负责串行输出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 { SID = 0; _nop_(); SCLK = 1; _nop_(); _nop_(); SCLK = 0; _nop_(); SID = 0; } else //bit7 is one { SID = 1; _nop_(); SCLK = 1; _nop_(); _nop_(); SCLK = 0; _nop_(); SID = 0; } } } /******************************************************************** 函数作用:毫秒级的延时程序,当晶振为12Mhz时,xtal=12; ********************************************************************/ void Delay(uint ms) { uint i; while(ms--) { for(i=1;i<(uint)(8*143-2);i++) ; } }
|