12864液晶屏多级菜单C51编程

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

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

[code lang=”c”]
#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++);
}

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;
}

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=0×01;
TH0=-(50000/256);//500毫秒
TL0=-(50000%6);
EA=1;
ET0=1;
TR0=1;
}

void lcd_init()
{
LCD_PSB = 1; //并口方式
write_cmd(0×30); //基本指令操作
delay_1ms(2);
write_cmd(0x0C); //显示开,关光标
delay_1ms(2);
write_cmd(0×01); //清除LCD的显示内容
delay_1ms(2);
write_cmd(0×90); // 显示第一页,开机显示初始化。
for(i=0;i<16;i++)
{
write_dat(dis1_[i]);
}
delay_1ms(100);
write_cmd(0×90);
for(i=0;i<16;i++)
{
write_dat(dis2_[i]);
}
delay_1ms(100);
write_cmd(0×90);
for(i=0;i<16;i++)
{
write_dat(dis3_[i]);
}
delay_1ms(100);
write_cmd(0×90);
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(0×01); //清除LCD的显示内容
write_cmd(0×80); // 显示第一页
for(i=0;i<16;i++)
{
write_dat(dis1[i]);
}
write_cmd(0×90);
for(i=0;i<16;i++)
{
write_dat(dis2[i]);
}
write_cmd(0×88);
for(i=0;i<16;i++)
{
write_dat(dis3[i]);
}
write_cmd(0×98);
for(i=0;i<16;i++)
{
write_dat(dis4[i]);
}
write_cmd(0×80+1); //显示位置向又移一位
write_dat(0×10); //写箭头的数据
write_cmd(0×90);
for(i=0;i<16;i++)
{
write_dat(dis2[i]);
}
write_cmd(0×88);
for(i=0;i<16;i++)
{
write_dat(dis3[i]);
}
write_cmd(0×98);
for(i=0;i<16;i++)
{
write_dat(dis4[i]);
}
}
if(count1==2) //按下选择按钮2次
{
flag=2; //选择键标志位
write_cmd(0×90+1);
write_dat(0×10);
write_cmd(0×80);
for(i=0;i<16;i++)
{
write_dat(dis1[i]);
}
write_cmd(0×88);
for(i=0;i<16;i++)
{
write_dat(dis3[i]);
}
write_cmd(0×98);
for(i=0;i<16;i++)
{
write_dat(dis4[i]);
}
}
if(count1==3) //按下选择按钮3次
{
flag=3; //选择键标志位
write_cmd(0×88+1);
write_dat(0×10);
write_cmd(0×80);
for(i=0;i<16;i++)
{
write_dat(dis1[i]);
}
write_cmd(0×90);
for(i=0;i<16;i++)
{
write_dat(dis2[i]);
}
write_cmd(0×98);
for(i=0;i<16;i++)
{
write_dat(dis4[i]);
}
}
if(count1==4) //按下选择按钮4次
{
flag=4; //选择键标志位
write_cmd(0×98+1);
write_dat(0×10);
write_cmd(0×80);
for(i=0;i<16;i++)
{
write_dat(dis1[i]);
}
write_cmd(0×90);
for(i=0;i<16;i++)
{
write_dat(dis2[i]);
}
write_cmd(0×88);
for(i=0;i<16;i++)
{
write_dat(dis3[i]);
}
}
if(count1==5) //按下选择按钮5次
{
flag=5; //选择键标志位
write_cmd(0×01); //清除LCD的显示内容
write_cmd(0×80);
for(i=0;i<16;i++) //再次显示第二页
{
write_dat(dis5[i]);
}
write_cmd(0×90);
for(i=0;i<16;i++)
{
write_dat(dis6[i]);
}
write_cmd(0×88);
for(i=0;i<16;i++)
{
write_dat(dis7[i]);
}
write_cmd(0×98);
for(i=0;i<16;i++)
{
write_dat(dis8[i]);
}
write_cmd(0×80+1);
write_dat(0×10);
write_cmd(0×90);
for(i=0;i<16;i++)
{
write_dat(dis6[i]);
}
write_cmd(0×88);
for(i=0;i<16;i++)
{
write_dat(dis7[i]);
}
write_cmd(0×98);
for(i=0;i<16;i++)
{
write_dat(dis8[i]);
}
}
if(count1==6) //按下选择按钮6次
{
flag=6; //选择键标志位
write_cmd(0×90+1);
write_dat(0×10);
write_cmd(0×80);
for(i=0;i<16;i++)
{
write_dat(dis5[i]);
}
write_cmd(0×88);
for(i=0;i<16;i++)
{
write_dat(dis7[i]);
}
write_cmd(0×98);
for(i=0;i<16;i++)
{
write_dat(dis8[i]);
}
}
if(count1==7) //按下选择按钮7次
{
flag=7; //选择键标志位
write_cmd(0×88+1);
write_dat(0×10);
write_cmd(0×80);
for(i=0;i<16;i++)
{
write_dat(dis5[i]);
}
write_cmd(0×90);
for(i=0;i<16;i++)
{
write_dat(dis6[i]);
}
write_cmd(0×98);
for(i=0;i<16;i++)
{
write_dat(dis8[i]);
}
}
if(count1==8) //按下选择按钮8次
{
flag=8; //选择键标志位
count1=0;
write_cmd(0×98+1);
write_dat(0×10);
write_cmd(0×80);
for(i=0;i<16;i++)
{
write_dat(dis5[i]);
}
write_cmd(0×90);
for(i=0;i<16;i++)
{
write_dat(dis6[i]);
}
write_cmd(0×88);
for(i=0;i<16;i++)
{
write_dat(dis7[i]);
}
}
}
}
}

void quedingkey()
{
if((flag==1)&&(queding==0))//选择项一确定
{
flag1=1; //确定键标志位
write_cmd(0×01); //清除LCD的显示内容
write_cmd(0×80); // 显示第一页
for(i=0;i<16;i++)
{
write_dat(dis1_1[i]);
}
write_cmd(0×90);
for(i=0;i<16;i++)
{
write_dat(dis2_1[i]);
}
write_cmd(0×88);
for(i=0;i<16;i++)
{
write_dat(dis3_1[i]);
}
write_cmd(0×98);
for(i=0;i<16;i++)
{
write_dat(dis4_1[i]);
}
}
if((flag==2)&&(queding==0))//选择项二确定
{
flag1=2; //确定键标志位
write_cmd(0×01); //清除LCD的显示内容
write_cmd(0×80); // 显示第一页
for(i=0;i<16;i++)
{
write_dat(dis1_2[i]);
}
write_cmd(0×90);
for(i=0;i<16;i++)
{
write_dat(dis2_2[i]);
}
write_cmd(0×88);
for(i=0;i<16;i++)
{
write_dat(dis3_2[i]);
}
write_cmd(0×98);
for(i=0;i<16;i++)
{
write_dat(dis4_2[i]);
}
}
if((flag==3)&&(queding==0))//选择项三确定
{
flag1=3; //确定键标志位
write_cmd(0×01); //清除LCD的显示内容
write_cmd(0×80); // 显示第一页
for(i=0;i<16;i++)
{
write_dat(dis1_3[i]);
}
write_cmd(0×90);
for(i=0;i<16;i++)
{
write_dat(dis2_3[i]);
}
write_cmd(0×88);
for(i=0;i<16;i++)
{
write_dat(dis3_3[i]);
}
write_cmd(0×98);
for(i=0;i<16;i++)
{
write_dat(dis4_3[i]);
}
}
if((flag==4)&&(queding==0))//选择项四确定
{
flag1=4; //确定键标志位
write_cmd(0×01); //清除LCD的显示内容
write_cmd(0×80); // 显示第一页
for(i=0;i<16;i++)
{
write_dat(dis1_4[i]);
}
write_cmd(0×90);
for(i=0;i<16;i++)
{
write_dat(dis2_4[i]);
}
write_cmd(0×88);
for(i=0;i<16;i++)
{
write_dat(dis3_4[i]);
}
write_cmd(0×98);
for(i=0;i<16;i++)
{
write_dat(dis4_4[i]);
}
}
if((flag==5)&&(queding==0))//选择项五确定
{
flag1=5; //确定键标志位
write_cmd(0×01); //清除LCD的显示内容
write_cmd(0×80); // 显示第一页
for(i=0;i<16;i++)
{
write_dat(dis1_5[i]);
}
write_cmd(0×90);
for(i=0;i<16;i++)
{
write_dat(dis2_5[i]);
}
write_cmd(0×88);
for(i=0;i<16;i++)
{
write_dat(dis3_5[i]);
}
write_cmd(0×98);
for(i=0;i<16;i++)
{
write_dat(dis4_5[i]);
}
}
if((flag==6)&&(queding==0))//选择项六确定
{
flag1=6; //确定键标志位
write_cmd(0×01); //清除LCD的显示内容
write_cmd(0×80); // 显示第一页
for(i=0;i<16;i++)
{
write_dat(dis1_6[i]);
}
write_cmd(0×90);
for(i=0;i<16;i++)
{
write_dat(dis2_6[i]);
}
write_cmd(0×88);
for(i=0;i<16;i++)
{
write_dat(dis3_6[i]);
}
write_cmd(0×98);
for(i=0;i<16;i++)
{
write_dat(dis4_6[i]);
}
}
if((flag==7)&&(queding==0))//选择项七确定
{
flag1=7; //确定键标志位
write_cmd(0×01); //清除LCD的显示内容
write_cmd(0×80); // 显示第一页
for(i=0;i<16;i++)
{
write_dat(dis1_7[i]);
}
write_cmd(0×90);
for(i=0;i<16;i++)
{
write_dat(dis2_7[i]);
}
write_cmd(0×88);
for(i=0;i<16;i++)
{
write_dat(dis3_7[i]);
}
write_cmd(0×98);
for(i=0;i<16;i++)
{
write_dat(dis4_7[i]);
}
}
if((flag==8)&&(queding==0))//选择项八确定
{
flag1=8; //确定键标志位
write_cmd(0×01); //清除LCD的显示内容
write_cmd(0×80); // 显示第一页
for(i=0;i<16;i++)
{
write_dat(dis1_8[i]);
}
write_cmd(0×90);
for(i=0;i<16;i++)
{
write_dat(dis2_8[i]);
}
write_cmd(0×88);
for(i=0;i<16;i++)
{
write_dat(dis3_8[i]);
}
write_cmd(0×98);
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(0×01); //清除LCD的显示内容
write_cmd(0×80); // 显示第一页
for(i=0;i<16;i++)
{
write_dat(dis1[i]);
}
write_cmd(0×90);
for(i=0;i<16;i++)
{
write_dat(dis2[i]);
}
write_cmd(0×88);
for(i=0;i<16;i++)
{
write_dat(dis3[i]);
}
write_cmd(0×98);
for(i=0;i<16;i++)
{
write_dat(dis4[i]);
}
write_cmd(0×80+1); //显示位置向又移一位
write_dat(0×10); //写箭头的数据
write_cmd(0×90);
for(i=0;i<16;i++)
{
write_dat(dis2[i]);
}
write_cmd(0×88);
for(i=0;i<16;i++)
{
write_dat(dis3[i]);
}
write_cmd(0×98);
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(0×01); //清除LCD的显示内容
write_cmd(0×80); // 显示第二页
for(i=0;i<16;i++)
{
write_dat(dis5[i]);
}
write_cmd(0×90);
for(i=0;i<16;i++)
{
write_dat(dis6[i]);
}
write_cmd(0×88);
for(i=0;i<16;i++)
{
write_dat(dis7[i]);
}
write_cmd(0×98);
for(i=0;i<16;i++)
{
write_dat(dis8[i]);
}
write_cmd(0×80+1);
write_dat(0×10);
write_cmd(0×90);
for(i=0;i<16;i++)
{
write_dat(dis6[i]);
}
write_cmd(0×88);
for(i=0;i<16;i++)
{
write_dat(dis7[i]);
}
write_cmd(0×98);
for(i=0;i<16;i++)
{
write_dat(dis8[i]);
}
}
}
}

void LED_(uchar kai)
{
if(kai==1)LED1=0;
if(kai==0)LED1=1;
}

void extern0() interrupt 1
{
TH0=-(50000/256);
TL0=-(50000%6);
tt++;
if(tt==5)
{
P0=0×00;
}
if(tt==10)
{
tt=0;
P0=0xff;
}
}
[/code]


微信扫一扫识别

donation

12864液晶屏多级菜单C51编程》有4个想法

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注