原创 51学习之LCD菜单

2011-2-23 17:48 1496 10 10 分类: MCU/ 嵌入式

说明:小弟做的一个波形发生器的菜单,其中第一级为选择波形,第二级调节波幅,第三级调节频率。后面的波形发生在下一篇日志。

#include"reg52.h"

#define uchar unsigned char
#define uint unsigned int

sbit dula=P2^6;
sbit wela=P2^7;
sbit rs=P3^5;
sbit lcden=P3^4;
sbit s1=P3^0;
sbit s2=P3^1;
sbit s3=P3^2;
sbit rd=P3^7; //功能键及其他位定义。

uchar range,i,N;
uint rate;

uchar code table1[]="S1:sine wave S2:zigzag wave S3:square";
uchar code table2[]=" Please chose!";
uchar code table3[]="  range:00";
uchar code table4[]="  rate:   0";
uchar code table5[]="sine wave    range:  rate:   ";
uchar code table6[]="zigzag wave  range:  rate:   ";
uchar code table7[]="square wave  range:  rate:   ";

void delay(uint); //延时函数delay(50);大约50毫秒
void write_com(uchar); //LCD指令输入
void write_dat(uchar); //LCD数据输入
uchar init(void); //初始化函数
void debug1(); //波幅调节函数
void debug2(); //频率调节函数
void result(uchar,uint); //显示最终的函数波形属性

void main()
{
 init();
 while(1);
}

void delay(uint z)
{
 uchar x;
 uint y;
 for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}

void write_com(uchar com) //LCD写指令函数
{
 rs=0;
 lcden=0;
 P0=com;
 delay(5);
 lcden=1;
 delay(5);
 lcden=0;
}

void write_dat(uchar date) //LCD写数据函数
{
 rs=1;
 lcden=0;
 P0=date;
 delay(5);
 lcden=1;
 delay(5);
 lcden=0;
}

uchar init()
{
 range=0;
 rate=0;
 wela=0;
 dula=0; 
 lcden=0; //片选打开
 write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口
 write_com(0x0f); //设置开显示,显示光标,光标闪烁
 write_com(0x06); //写一个字符后地址指针加一
 write_com(0x01); //显示清0,数据指针清0
 write_com(0x80); //初始化数据指针 
 while(table1!='\0') //显示选择波形函数菜单
 {
  write_dat(table1[i++]);
  delay(5);
 }
 write_com(0x80+0x50); //指针指向第二行
 while(table2!='\0')
 {
  write_dat(table2[i++]);
  delay(5);
 }
 for(i=0;i<100;i++)
 {
  write_com(0x18); //整屏左移
  delay(500);
 }
 rd=0;
 while(1) //进入第一级菜单(选择波形函数)
 {
  if(s1==0) //选择方波
  {
   delay(50);
   if(s1==0)
   {
    N=5;
      debug1();
      debug2(); //进入方波属性调试
      result(range,rate); //显示最终的函数波形属性
      return 1;
//    break;
   }
  } 
  if(s2==0) //选择锯齿波
  {
   delay(50);
   if(s2==0)
   {
    N=6;
    debug1();
    debug2(); //进入锯齿波属性调试
    result(range,rate); //显示最终的函数波形属性
    return 2;
//    break; 
   }
  }
  if(s3==0) //选择正弦波
  {
   delay(50);
   if(s3==0)
   {
    N=7;
    debug1();
    debug2(); //进入正弦波属性调试
    result(range,rate); //显示最终的函数波形属性
    return 3;
//    break;
   }
  }
 }
}
void debug1() //进入第二级菜单(调幅)
{
 write_com(0x01); //清屏指令
 write_com(0x80); //初始化数据指针
 i=0;
 while(table3!='\0')
 {
  write_dat(table3[i++]);
  delay(5);
 }
 write_com(0x80+0x09); //将指针指向0,并将0进行光标闪烁.
 rd=0;
 while(1)
  {
   if(s1==0) //调整波幅,按键S1加一
    {
     delay(50);
     if(s1==0)
     {
      write_dat(range++); 
      delay(5);
     }
    }
   if(s2==0) //调整波幅,按键S2减一
    {
     delay(50);
     if(s2==0)
     {
      write_dat(range--); 
      delay(5);
     }
    }
   if(s3==0)
    {
     delay(50);
     if(s3==0)
      break;
    }
  }
}
void debug2() //进入第三级菜单(调频)
{
  write_com(0x01); //清屏指令
  write_com(0x80); //初始化数据指针
  i=0;
  while(table4!='\0') 
   {
    write_dat(table4[i++]);
    delay(5);
   }
  write_com(0x80+0x0b); //将指针指向0
  rd=0;
  while(1) 
  {
   if(s1==0) //调整频率,按键S1加一
    {
     delay(50);
     if(s1==0)
     {
      write_dat(rate++);
      delay(5);
     }
    }
   if(s2==0) //调整频率,按键S2减一
    {
     delay(50);
     if(s2==0)
     {
      write_dat(rate--);
      delay(5);
     }
    }
   if(s3==0)
    {
     delay(50);
     if(s3==0)
      break;
    }    
  } 
}
void result(uchar x,uint y)
{
 write_com(0x01); //清屏指令
 write_com(0x80); //初始化数据指针
 i=0;
 switch(N)
 {
  case 5: while(table5!='\0'){write_dat(table5[i++]);delay(5);}
    break;
  case 6: while(table6!='\0'){write_dat(table6[i++]);delay(5);}
    break;
  case 7: while(table7!='\0'){write_dat(table7[i++]);delay(5);}
    break;
 }
   
 write_com(0x80+0x13); //将指针指向range
 write_dat(x);
 write_com(0x80+0x1a); //将指针指向rate
 write_dat(y);
 i=100;
 while(i--)
 {
  write_com(0x18); //整屏左移
  delay(500);
 }
}

文章评论0条评论)

登录后参与讨论
我要评论
0
10
关闭 站长推荐上一条 /2 下一条