12864液晶按键菜单程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本文主要介绍89c51下,12864显示菜单程序,用户只用设置12864的命令数据端口
读写控制端口,使能端口和串并方式控制接口,以及按键端口即可。
#include
#define uchar unsigned char
#define uint unsigned int
uchar count1,i,flag,flag1,tt;
#define LCD_data P0 //数据口
sbit LCD_RS = P2^5; //寄存器选择输入0写指令:1写数据
sbit LCD_RW = P2^6; //液晶读/写控制
sbit LCD_EN = P2^7; //液晶使能控制
sbit LCD_PSB = P2^4; //串/并方式控制
sbit xuanze = P3^2; //选择键
sbit queding = P3^3; //确定键
sbit tiaozheng= P3^5; //调整键
sbit fanhui = P3^4; //返回键
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/10"};
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
}
void write_cmd(uchar cmd)//写指令数据到LCD :RS=L,RW=L,E=高脉冲,D0-D7=指令码
{
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
P0 = 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;
P0 = 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%6);
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(500);
write_cmd(0x90);
for(i=0;i<16;i++)
{
write_dat(dis2_[i]);
}
delay_1ms(500);
write_cmd(0x90);
for(i=0;i<16;i++)
{
write_dat(dis3_[i]);
}
delay_1ms(500);
write_cmd(0x90);
for(i=0;i<16;i++)
{
write_dat(dis4_[i]);
}
}
void 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;
}
void timer0() interrupt 1
{
TH0=-(50000/256);
TL0=-(50000%6);
tt++;
if(tt==5)
{
P0=0x00;
}
if(tt==10)
{
tt=0;
P0=0xff;
}
}