12864液晶屏初始界面

以前没用过12864液晶屏,和大多数初学 者都一样,因为比较贵的缘故。现在学校支持了,也拥有了一块液晶屏,不容易准备学一下它的编程,经过今天忙碌,还是有一点小收获的。下面的程序都是我自己 瞎琢磨,弄出来的,没有参照任何人的程序,在显示上有一个问题,就是每次清屏的时候,文字有阴影,我严格按照12864时序写的,不知道是液晶屏质量的原 因,还是程序上什么没考虑到,也请教请教大家。

………………………………….优酷的视频:http://v.youku.com/v_show/id_XMjQxMDI1MzAw.html

/**************宏定义变量*******************/
#include <reg51.h>
#define uchar unsigned char
#define uint  unsigned int
uchar count1,i,flag,flag1,tt;
/*******************************************/
/**************液晶屏控制端口***************/
#define LCD_data P1       //数据口
sbit  LCD_RS  =  P2^0;    //寄存器选择输入0写指令:1写数据
sbit  LCD_RW  =  P2^1;    //液晶读/写控制
sbit  LCD_EN  =  P2^2;    //液晶使能控制
sbit  LCD_PSB =  P2^3;    //串/并方式控制
/*******************************************/
/**************基本操作按钮*****************/
sbit  xuanze  =  P3^4;    //选择键
sbit  queding =  P3^5;    //确定键
sbit tiaozheng=  P3^7;    //调整键
sbit  fanhui  =  P3^6;    //返回键
sbit    LED1  =  P0^0;
/*******************************************/
/**************子函数声明区*****************/
void xuanzekey();         //选择子函数··flag
void quedingkey();        //确定子函数··flag1
void fanhuikey();         //返回子函数··
void LED_(uchar kai);

/*******************************************/
/**************初始化显示*******************/
uchar code dis1_[] = {“系统初始化.     “};
uchar code dis2_[] = {“系统初始化..    “};
uchar code dis3_[] = {“系统初始化…   “};
uchar code dis4_[] = {”  按选择键开始! “};
/*******************************************/
/**************主界面系统菜单***************/
uchar code dis1[] = {“系  1:背光灯    “};
uchar code dis2[] = {“统  2:存储器管理”};
uchar code dis3[] = {“菜  3:MP3 播放  “};
uchar code dis4[] = {“单  4:文件夹选项”};
uchar code dis5[] = {“系  5:轻松一刻!”};
uchar code dis6[] = {“统  6:摄像头    “};
uchar code dis7[] = {“菜  7:Word阅读器”};
uchar code dis8[] = {“单  8:万年历    “};
/*******************************************/
/**************第一选项菜单*****************/
uchar code dis1_1[] = {”  液晶屏背光灯  “};
uchar code dis2_1[] = {“亮度: 0/9      “};
uchar code dis3_1[] = {“延时时间: 0/9  “};
uchar code dis4_1[] = {“保存————返回”};
/*******************************************/
/**************第二选项菜单*****************/
uchar code dis1_2[] = {”  外部存储器    “};
uchar code dis2_2[] = {“以用大小: 12%  “};
uchar code dis3_2[] = {“剩余大小: 88%  “};
uchar code dis4_2[] = {”            返回”};
/*******************************************/
/**************第三选项菜单*****************/
uchar code dis1_3[] = {”  多媒体播放器  “};
uchar code dis2_3[] = {“选择歌曲: 0/100”};
uchar code dis3_3[] = {“声音大小: 0/9  “};
uchar code dis4_3[] = {“保存————返回”};
/*******************************************/
/**************第四选项菜单*****************/
uchar code dis1_4[] = {”    系统文件    “};
uchar code dis2_4[] = {“《小车使用手册》”};
uchar code dis3_4[] = {“《单片机基础》  “};
uchar code dis4_4[] = {“翻页————返回”};
/*******************************************/
/**************第五选项菜单*****************/
uchar code dis1_5[] = {”    俄罗斯方块  “};
uchar code dis2_5[] = {“难度: 0/3      “};
uchar code dis3_5[] = {”                “};
uchar code dis4_5[] = {“开始游戏——返回”};
/*******************************************/
/**************第六选项菜单*****************/
uchar code dis1_6[] = {”    摄像头      “};
uchar code dis2_6[] = {”                “};
uchar code dis3_6[] = {”                “};
uchar code dis4_6[] = {“保存拍照——返回”};
/*******************************************/
/**************第七选项菜单*****************/
uchar code dis1_7[] = {”    Word文件    “};
uchar code dis2_7[] = {”                “};
uchar code dis3_7[] = {”                “};
uchar code dis4_7[] = {“保存————返回”};
/*******************************************/
/**************第八选项菜单*****************/
uchar code dis1_8[] = {”    万年历      “};
uchar code dis2_8[] = {“2011年02月01日  “};
uchar code dis3_8[] = {“12时:52分:23秒”};
uchar code dis4_8[] = {“更改设置——返回”};
/*******************************************/
/*************毫秒级软件延时***************/
void delay_1ms(uint x)
{
uint i,j;
for(j=0;j<x;j++)
for(i=0;i<113;i++);
}
/*******************************************/
/**************12864写指令子函数************/
void write_cmd(uchar cmd)//写指令数据到LCD  :RS=L,RW=L,E=高脉冲,D0-D7=指令码
{
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
P1 = cmd;
delay_1ms(1);
LCD_EN = 1;
delay_1ms(1);
LCD_EN = 0;
}
/*******************************************/
/**************12864写数据子函数************/
void write_dat(uchar dat)//写显示数据到LCD  :RS=H,RW=L,E=高脉冲,D0-D7=数据。                                                  */
{
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P1 = dat;
delay_1ms(1);
LCD_EN = 1;
delay_1ms(1);
LCD_EN = 0;
}
/*******************************************/
/**************变量初始化*******************/
void bianliang_init()
{
count1=0;
i=0;
flag=0;
flag1=0;
}
/*******************************************/
/**************定时器初始化*******************/
void Time_init()
{
TMOD=0x01;
TH0=-(50000/256);//500毫秒
TL0=-(50000%256);
EA=1;
ET0=1;
TR0=1;
}
/*******************************************/
/**************液晶屏初始化*****************/
void lcd_init()
{
LCD_PSB = 1;          //并口方式
write_cmd(0x30);      //基本指令操作
delay_1ms(2);
write_cmd(0x0C);      //显示开,关光标
delay_1ms(2);
write_cmd(0x01);      //清除LCD的显示内容
delay_1ms(2);
write_cmd(0x90);      // 显示第一页,开机显示初始化。
for(i=0;i<16;i++)
{
write_dat(dis1_[i]);

}
delay_1ms(100);
write_cmd(0x90);
for(i=0;i<16;i++)
{
write_dat(dis2_[i]);

}
delay_1ms(100);
write_cmd(0x90);
for(i=0;i<16;i++)
{
write_dat(dis3_[i]);

}
delay_1ms(100);
write_cmd(0x90);
for(i=0;i<16;i++)
{
write_dat(dis4_[i]);

}

}
/*******************************************/
/**************主函数体*********************/
main()
{

delay_1ms(10);
bianliang_init();
Time_init();
lcd_init();
while(1)
{
xuanzekey();
quedingkey();
fanhuikey();
if(flag==5){ LED_(1); }
if(flag!=5){ LED_(0); }

}
}
/*******************************************/
/**************选择子函数*******************/
void xuanzekey()//选择子函数
{
if((xuanze==0)&&(flag1==0))  //确定后选择无效
{
delay_1ms(10);
if(xuanze==0)
{
count1++;
while(!xuanze);
if(count1==1)        //按下选择按钮1次
{
flag=1;          //选择键标志位
write_cmd(0x01); //清除LCD的显示内容
write_cmd(0x80); // 显示第一页
for(i=0;i<16;i++)
{
write_dat(dis1[i]);

}
write_cmd(0x90);
for(i=0;i<16;i++)
{
write_dat(dis2[i]);

}
write_cmd(0x88);
for(i=0;i<16;i++)
{
write_dat(dis3[i]);

}
write_cmd(0x98);
for(i=0;i<16;i++)
{
write_dat(dis4[i]);

}
write_cmd(0x80+1); //显示位置向又移一位
write_dat(0x10);   //写箭头的数据
write_cmd(0x90);
for(i=0;i<16;i++)
{
write_dat(dis2[i]);

}
write_cmd(0x88);
for(i=0;i<16;i++)
{
write_dat(dis3[i]);

}
write_cmd(0x98);
for(i=0;i<16;i++)
{
write_dat(dis4[i]);

}
}

if(count1==2)           //按下选择按钮2次
{
flag=2;             //选择键标志位
write_cmd(0x90+1);
write_dat(0x10);
write_cmd(0x80);
for(i=0;i<16;i++)
{
write_dat(dis1[i]);

}
write_cmd(0x88);
for(i=0;i<16;i++)
{
write_dat(dis3[i]);

}
write_cmd(0x98);
for(i=0;i<16;i++)
{
write_dat(dis4[i]);

}
}
if(count1==3)            //按下选择按钮3次
{
flag=3;              //选择键标志位
write_cmd(0x88+1);
write_dat(0x10);
write_cmd(0x80);
for(i=0;i<16;i++)
{
write_dat(dis1[i]);

}
write_cmd(0x90);
for(i=0;i<16;i++)
{
write_dat(dis2[i]);

}
write_cmd(0x98);
for(i=0;i<16;i++)
{
write_dat(dis4[i]);

}

}
if(count1==4)            //按下选择按钮4次
{
flag=4;              //选择键标志位
write_cmd(0x98+1);
write_dat(0x10);
write_cmd(0x80);
for(i=0;i<16;i++)
{
write_dat(dis1[i]);

}
write_cmd(0x90);
for(i=0;i<16;i++)
{
write_dat(dis2[i]);

}
write_cmd(0x88);
for(i=0;i<16;i++)
{
write_dat(dis3[i]);

}

}
if(count1==5)            //按下选择按钮5次
{
flag=5;              //选择键标志位
write_cmd(0x01);     //清除LCD的显示内容
write_cmd(0x80);
for(i=0;i<16;i++)    //再次显示第二页
{
write_dat(dis5[i]);

}
write_cmd(0x90);
for(i=0;i<16;i++)
{
write_dat(dis6[i]);

}
write_cmd(0x88);
for(i=0;i<16;i++)
{
write_dat(dis7[i]);

}
write_cmd(0x98);
for(i=0;i<16;i++)
{
write_dat(dis8[i]);

}

write_cmd(0x80+1);
write_dat(0x10);
write_cmd(0x90);
for(i=0;i<16;i++)
{
write_dat(dis6[i]);

}
write_cmd(0x88);
for(i=0;i<16;i++)
{
write_dat(dis7[i]);

}
write_cmd(0x98);
for(i=0;i<16;i++)
{
write_dat(dis8[i]);

}

}
if(count1==6)            //按下选择按钮6次
{
flag=6;               //选择键标志位
write_cmd(0x90+1);
write_dat(0x10);
write_cmd(0x80);
for(i=0;i<16;i++)
{
write_dat(dis5[i]);

}
write_cmd(0x88);
for(i=0;i<16;i++)
{
write_dat(dis7[i]);

}
write_cmd(0x98);
for(i=0;i<16;i++)
{
write_dat(dis8[i]);

}

}
if(count1==7)             //按下选择按钮7次
{
flag=7;               //选择键标志位
write_cmd(0x88+1);
write_dat(0x10);
write_cmd(0x80);
for(i=0;i<16;i++)
{
write_dat(dis5[i]);

}
write_cmd(0x90);
for(i=0;i<16;i++)
{
write_dat(dis6[i]);

}
write_cmd(0x98);
for(i=0;i<16;i++)
{
write_dat(dis8[i]);

}

}
if(count1==8)              //按下选择按钮8次
{
flag=8;                //选择键标志位
count1=0;
write_cmd(0x98+1);
write_dat(0x10);
write_cmd(0x80);
for(i=0;i<16;i++)
{
write_dat(dis5[i]);

}
write_cmd(0x90);
for(i=0;i<16;i++)
{
write_dat(dis6[i]);

}
write_cmd(0x88);
for(i=0;i<16;i++)
{
write_dat(dis7[i]);

}

}

}

}
}
/*******************************************/
/**************确定子函数*******************/
void quedingkey()
{
if((flag==1)&&(queding==0))//选择项一确定
{
flag1=1;         //确定键标志位
write_cmd(0x01); //清除LCD的显示内容
write_cmd(0x80); // 显示第一页
for(i=0;i<16;i++)
{
write_dat(dis1_1[i]);

}
write_cmd(0x90);
for(i=0;i<16;i++)
{
write_dat(dis2_1[i]);

}
write_cmd(0x88);
for(i=0;i<16;i++)
{
write_dat(dis3_1[i]);

}
write_cmd(0x98);
for(i=0;i<16;i++)
{
write_dat(dis4_1[i]);

}
}

if((flag==2)&&(queding==0))//选择项二确定
{
flag1=2;         //确定键标志位
write_cmd(0x01); //清除LCD的显示内容
write_cmd(0x80); // 显示第一页
for(i=0;i<16;i++)
{
write_dat(dis1_2[i]);

}
write_cmd(0x90);
for(i=0;i<16;i++)
{
write_dat(dis2_2[i]);

}
write_cmd(0x88);
for(i=0;i<16;i++)
{
write_dat(dis3_2[i]);

}
write_cmd(0x98);
for(i=0;i<16;i++)
{
write_dat(dis4_2[i]);

}
}
if((flag==3)&&(queding==0))//选择项三确定
{
flag1=3;         //确定键标志位
write_cmd(0x01); //清除LCD的显示内容
write_cmd(0x80); // 显示第一页
for(i=0;i<16;i++)
{
write_dat(dis1_3[i]);

}
write_cmd(0x90);
for(i=0;i<16;i++)
{
write_dat(dis2_3[i]);

}
write_cmd(0x88);
for(i=0;i<16;i++)
{
write_dat(dis3_3[i]);

}
write_cmd(0x98);
for(i=0;i<16;i++)
{
write_dat(dis4_3[i]);

}
}
if((flag==4)&&(queding==0))//选择项四确定
{
flag1=4;         //确定键标志位
write_cmd(0x01); //清除LCD的显示内容
write_cmd(0x80); // 显示第一页
for(i=0;i<16;i++)
{
write_dat(dis1_4[i]);

}
write_cmd(0x90);
for(i=0;i<16;i++)
{
write_dat(dis2_4[i]);

}
write_cmd(0x88);
for(i=0;i<16;i++)
{
write_dat(dis3_4[i]);

}
write_cmd(0x98);
for(i=0;i<16;i++)
{
write_dat(dis4_4[i]);

}
}
if((flag==5)&&(queding==0))//选择项五确定
{
flag1=5;         //确定键标志位
write_cmd(0x01); //清除LCD的显示内容
write_cmd(0x80); // 显示第一页
for(i=0;i<16;i++)
{
write_dat(dis1_5[i]);

}
write_cmd(0x90);
for(i=0;i<16;i++)
{
write_dat(dis2_5[i]);

}
write_cmd(0x88);
for(i=0;i<16;i++)
{
write_dat(dis3_5[i]);

}
write_cmd(0x98);
for(i=0;i<16;i++)
{
write_dat(dis4_5[i]);

}
}
if((flag==6)&&(queding==0))//选择项六确定
{
flag1=6;         //确定键标志位
write_cmd(0x01); //清除LCD的显示内容
write_cmd(0x80); // 显示第一页
for(i=0;i<16;i++)
{
write_dat(dis1_6[i]);

}
write_cmd(0x90);
for(i=0;i<16;i++)
{
write_dat(dis2_6[i]);

}
write_cmd(0x88);
for(i=0;i<16;i++)
{
write_dat(dis3_6[i]);

}
write_cmd(0x98);
for(i=0;i<16;i++)
{
write_dat(dis4_6[i]);

}
}
if((flag==7)&&(queding==0))//选择项七确定
{
flag1=7;         //确定键标志位
write_cmd(0x01); //清除LCD的显示内容
write_cmd(0x80); // 显示第一页
for(i=0;i<16;i++)
{
write_dat(dis1_7[i]);

}
write_cmd(0x90);
for(i=0;i<16;i++)
{
write_dat(dis2_7[i]);

}
write_cmd(0x88);
for(i=0;i<16;i++)
{
write_dat(dis3_7[i]);

}
write_cmd(0x98);
for(i=0;i<16;i++)
{
write_dat(dis4_7[i]);

}
}
if((flag==8)&&(queding==0))//选择项八确定
{
flag1=8;         //确定键标志位
write_cmd(0x01); //清除LCD的显示内容
write_cmd(0x80); // 显示第一页
for(i=0;i<16;i++)
{
write_dat(dis1_8[i]);

}
write_cmd(0x90);
for(i=0;i<16;i++)
{
write_dat(dis2_8[i]);

}
write_cmd(0x88);
for(i=0;i<16;i++)
{
write_dat(dis3_8[i]);

}
write_cmd(0x98);
for(i=0;i<16;i++)
{
write_dat(dis4_8[i]);

}
}
}
/*******************************************/
/**************返回子函数*******************/
void fanhuikey()
{
if((fanhui==0)&&(flag<=4))
{
delay_1ms(10);
if(fanhui==0)
{
while(!fanhui);
flag1=0;         //返回后清除原确定键标志位,归0
count1=1;        //选择键次数回原值
flag=1;          //选择键标志位回原
write_cmd(0x01); //清除LCD的显示内容
write_cmd(0x80); // 显示第一页
for(i=0;i<16;i++)
{
write_dat(dis1[i]);

}
write_cmd(0x90);
for(i=0;i<16;i++)
{
write_dat(dis2[i]);

}
write_cmd(0x88);
for(i=0;i<16;i++)
{
write_dat(dis3[i]);

}
write_cmd(0x98);
for(i=0;i<16;i++)
{
write_dat(dis4[i]);

}
write_cmd(0x80+1); //显示位置向又移一位
write_dat(0x10);   //写箭头的数据
write_cmd(0x90);
for(i=0;i<16;i++)
{
write_dat(dis2[i]);

}
write_cmd(0x88);
for(i=0;i<16;i++)
{
write_dat(dis3[i]);

}
write_cmd(0x98);
for(i=0;i<16;i++)
{
write_dat(dis4[i]);

}
}
}

if((fanhui==0)&&(flag>=5))
{
delay_1ms(10);
if(fanhui==0)
{
while(!fanhui);
flag1=0;         //返回后清除原确定键标志位,归0
count1=5;        //选择键次数第二页值
flag=5;          //选择键标志位回原第二页值
write_cmd(0x01); //清除LCD的显示内容
write_cmd(0x80); // 显示第二页
for(i=0;i<16;i++)
{
write_dat(dis5[i]);

}
write_cmd(0x90);
for(i=0;i<16;i++)
{
write_dat(dis6[i]);

}
write_cmd(0x88);
for(i=0;i<16;i++)
{
write_dat(dis7[i]);

}
write_cmd(0x98);
for(i=0;i<16;i++)
{
write_dat(dis8[i]);

}
write_cmd(0x80+1);
write_dat(0x10);
write_cmd(0x90);
for(i=0;i<16;i++)
{
write_dat(dis6[i]);

}
write_cmd(0x88);
for(i=0;i<16;i++)
{
write_dat(dis7[i]);

}
write_cmd(0x98);
for(i=0;i<16;i++)
{
write_dat(dis8[i]);

}

}

}

}
/*******************************************/
/**************彩灯子函数*******************/
void LED_(uchar kai)
{

if(kai==1)LED1=0;
if(kai==0)LED1=1;

}
/*******************************************/
/**************定时器0中断子函数************/
void extern0() interrupt 1
{
TH0=-(50000/256);
TL0=-(50000%256);
tt++;
if(tt==5)
{
P0=0x00;
}
if(tt==10)
{
tt=0;
P0=0xff;
}

}