#include
__CONFIG(XT&WDTDIS&LVPDIS);
//定义配置字,晶振类型:XT,关闭开门狗,禁止低电压编程
#define Rs RB0 //并行数据/控制字选择 H:数据 L:控制字
#define RW RB1 //并行读/写选择 H:读 L:写
#define E RB2 //并行读写使能 H有效,下降沿锁定数据
#define Psb RB3 //串口,并口选择 H:并口 L:串口(开发板上引脚标识为CS1)
#define Rst RB5 //复位引脚 L:液晶复位
//---------------------------------------
//名称: 延时函数
//-----------------------------------------
void delay(unsigned int t)
{
unsigned int i,j;
for(i=0;i
{
for(j=0;j<10;j++)
{
asm("NOP");
}
}
}
//---------------------------------------
//名称: 数据总线处理函数
//ND118开发板中,因为布线的原因液晶的8位数据总线和单片机的8位数据线
//是反的,所以需要调换过来,即DB0-RD7、DB1-RD6。。。。DB7-RD0
//-----------------------------------------
void write_bus(unsigned char buf)
{
if(buf&0x01) RD7=1;
else RD7=0;
if(buf&0x02) RD6=1;
else RD6=0;
if(buf&0x04) RD5=1;
else RD5=0;
if(buf&0x08) RD4=1;
else RD4=0;
if(buf&0x10) RD3=1;
else RD3=0;
if(buf&0x20) RD2=1;
else RD2=0;
if(buf&0x40) RD1=1;
else RD1=0;
if(buf&0x80) RD0=1;
else RD0=0;
}
//---------------------------------------
//名称: 写命令字节到12864函数
//-----------------------------------------
void write_com(unsigned char cmdcode)
{
unsigned int ii=20000;
Rs=0; //设置该字节数据为命令代码
RW=1; //设置此次操作为读
E=1; //使能
TRISD=0B11111111; //RD设置为输入
while((PORTD&0X01)&&(ii>0)) //读忙状态,不忙时退出
{
ii--;
}
E=0; //失能
TRISD=0B00000000; //RD设置为输出
Rs=0; //设置该字节数据为控制命令
RW=0; //设置此次操作为读写
write_bus(cmdcode); //通过数据总线处理函数将命令字写进总线中去
E=1; //使能写
asm("NOP"); //略加延迟
asm("NOP");
asm("NOP");
E=0; //失能写
}
//---------------------------------------
//名称: 写数据字节到12864函数
//-----------------------------------------
void write_data(unsigned char Rsspdata)
{
unsigned int ii=20000;
Rs=0; //设置该字节数据为命令代码
RW=1; //设置此次操作为读
E=1; //使能
TRISD=0B11111111; //RD设置为输入
while((PORTD&0X01)&&(ii>0)) //读忙状态,不忙时退出
{
ii--;
}
E=0; //失能
TRISD=0B00000000; //RD设置为输出
Rs=1; //设置该字节数据为数据
RW=0; //设置此次操作为读写
write_bus(Rsspdata); //通过数据总线处理函数将命令字写进总线中去
E=1; //使能写
asm("NOP"); //略加延迟
asm("NOP");
asm("NOP");
E=0; //失能写
}
//---------------------------------------
//名称: 写地址函数
//输入参数:x,y:显示字符串的位置,x:0-7,y:0-3
//-----------------------------------------
void write_xy(unsigned char x,unsigned char y)
{
unsigned char address;
switch(y){
case 0:address=0x80+x;break; //第一行的首地址是0x80
case 1:address=0x90+x;break; //第二行的首地址是0x90
case 2:address=0x88+x;break; //第三行的首地址是0x88
case 3:address=0x98+x;break; //第四行的首地址是0x98
default:address=0x80+x;
}
write_com(address);
}
//---------------------------------------
//名称: 初始化LCD屏
//-----------------------------------------
void init_lcd(void)
{
Rst=0; //复位液晶
delay(250); //加些延时
delay(250);
Rst=1; //复位结束
delay(250); //加些延时
Psb=1; //选择8bit并口
write_com(0x30); //基本指令集
write_com(0x0c); //显示开
write_com(0x06); //光标右移,整体显示不移动
write_com(0x01); //清除显示(清零DDRAM)
delay(250);
}
//---------------------------------------
//名称: 指定地址中英文字符串显示函数
//-----------------------------------------
void write_string(unsigned char x,unsigned char y,const unsigned char *s)
{
write_xy(x,y); //先写入地址参数
while(*s) //只要字符串没写完就继续写
{
write_data(*s); //写入一个字符串数据
s++; //指针转到下一个
delay(10);
}
}
//---------------------------------------
//名称: 整行中英文字符串显示函数
//-----------------------------------------
void lcd12864_dis_oneline(unsigned char line,const unsigned char *p)
{
unsigned char c;
switch(line%4)
{
case 0:
write_com(0x80); //第一行的首地址为0x80
for(c=0;c<16;c++) //将本行的16个字符全部写进去,汉字占两个字符位
{
write_data(*p);
p++;
if(*p==0)
{
break;
}
}
break;
case 1:
write_com(0x90); //第二行的首地址为0x90
for(c=0;c<16;c++) //将本行的16个字符全部写进去,汉字占两个字符位
{
write_data(*p);
p++;
if(*p==0)
{
break;
}
}
break;
case 2:
write_com(0x88); //第三行的首地址为0x88
for(c=0;c<16;c++) //将本行的16个字符全部写进去,汉字占两个字符位
{
write_data(*p);
p++;
if(*p==0)
{
break;
}
}
break;
case 3:
write_com(0x98); //第四行的首地址为0x98
for(c=0;c<16;c++) //将本行的16个字符全部写进去,汉字占两个字符位
{
write_data(*p);
p++;
if(*p==0)
{
break;
}
}
break;
default : break;
}
}
//---------------------------------------
//名称: 主函数
//-----------------------------------------
void main(void)
{
TRISB=0B11000000; //RB0-5设置为输出
TRISD=0B00000000; //RD设置为输出
init_lcd(); //初始化12864
write_string(0,0,"XXXX电子有限");
write_string(0,1,"公司");
write_string(0,2,"MovingChip.com");
write_string(0,3,"0574-86878555");
while(1)
{
}
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』