说明:小弟做的一个波形发生器的菜单,其中第一级为选择波形,第二级调节波幅,第三级调节频率。后面的波形发生在下一篇日志。
#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条评论)
登录后参与讨论