#include <reg52.h>
#include "intrins.h"
#define uchar unsigned char //类型重定义
#define uint unsigned int //类型重定义
sbit CS=P3^5; // LCD_4 选通
sbit SID=P3^6; // LCD_5 串行数据输入端
sbit SCLK=P3^7; // LCD_6 串行时钟
uchar code line1[14]={"频率步进:100Hz"};
uchar code line2[16]={"当前频率: kHz"};
uchar code line3[16]={"当前幅值: V"};
uchar code line4[16]={"波形: "};
uchar code table[]={"0123456789 "}; //半字符数字码表
uchar a[8]=0; //装载要显示频率的数组
long int f=0; //输入的频率
//uint AA=0; //输入的幅度
uchar code wavetype[24]={"sin波 方波 叁角波锯齿波"};
unsigned char key,count_set,cpld, key_flag1,boxing_flag;
unsigned int count;
unsigned char Data[2];
sbit P12=P1^2;sbit P13=P1^3;
sbit pinlv1=P3^0;sbit pinlv2=P3^1;sbit boxing=P3^2;sbit P33=P3^3;sbit P34=P3^4;
unsigned char keyhh();
void init12864() ;
void LCD_Write_order(uchar Command);
void LCD_Write_Data(uchar ddd);
void display();
//==============================================================
//函数名称:void delay(unsigned int n)
//函数功能:延时函数
//=============================================================
void delay(unsigned int n)
{
unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++) ;
}
//==============================================================
//函数名称:void dectohex(f)
//函数功能:十进制频率控制字数值转换十六进制数值,分为高8位与低8位
//=============================================================
void dectohex(f)
{ long int Ds;
unsigned int az;
Ds=f/3;
//Ds=Ds*100;
az=Ds/256;
P2=az; //高8位
P0=Ds%256; //低8位
}
//==============================================================
//函数名称:void type_gettype(void )
//函数功能:波形选择
//=============================================================
void type_gettype(void )
{
switch (boxing_flag)
{ case 0: P13=0; P12=0; break;//正弦波
case 1: P13=0; P12=1; break;//方波
case 2: P13=1; P12=0; break;//三角波
case 3: P13=1; P12=1; break;//锯齿波
default: break; }
}
//==============================================================
//函数名称:unsigned char keyhh()
//函数功能:按键检测并去除抖动,返回键值
//=============================================================
unsigned char keyhh()
{
unsigned char fromkey;
fromkey=P3&0x1f;
if (fromkey!=0x1f)
{
delay(20);
fromkey=P3&0x1f;
while ((P3&0x1f)!=0x1f)
{
;//wait key release
}
switch (fromkey)
{
case 0x1f:return(0);break;//无按键
case 0x1e:return(1);break;//按SW2 FRE递增
case 0x1d:return(2);break;//按SW3 FRE递减
case 0x1b:return(3);break;//change WAVE
//case 0xe0:return(4);break;
default:return(0);break;
}
}
else return(0);
}
//==============================================================
//函数名称:void init12864()
//函数功能:初始化12864函数
//=============================================================
void init12864()
{
uchar i;
LCD_Write_order(0x30); //基本操作指令
LCD_Write_order(0x0f); //开显示,关光标,不闪烁
LCD_Write_order(0x01); //清除显示
LCD_Write_order(0x06); //指定在资料写入或读取时,光标的移动方向
LCD_Write_order(0x0c); //整体显示
LCD_Write_order(0x80); //第1行初始化
for(i=0;i<14;i++)
LCD_Write_Data(line1[i]);
LCD_Write_order(0x90); //第2行初始化
for(i=0;i<16;i++)
LCD_Write_Data(line2[i]);
LCD_Write_order(0x88); //第3行初始化
for(i=0;i<16;i++)
LCD_Write_Data(line3[i]);
LCD_Write_order(0x98); //第4行初始化
for(i=0;i<16;i++)
LCD_Write_Data(line4[i]);
}
//==============================================================
//函数名称:void LCD_Write_order(uchar Command)
//函数功能:送命令给夜晶12864函数
//=============================================================
void LCD_Write_order(uchar Command)
{
uchar i,j,tem=0xf8;
CS=1;
for(i=8;i>0;i--)
{
SCLK=0;
SID=tem&0x80;
SCLK=1;
tem<<=1;
}
for(j=2;j>0;j--)
for(i=8;i>0;i--)
{
if(i>4) //送高四位
{
SCLK=0;
SID=Command&0x80;
SCLK=1;
Command<<=1;
}
else //低四位为“0”
{
SCLK=0;
SID=0;
SCLK=1;
}
}
CS=0;
}
//==============================================================
//函数名称:void LCD_Write_Data(uchar Data)
//函数功能:送数据给夜晶12864函数
//=============================================================
void LCD_Write_Data(uchar Data)
{
uchar i,j,tem=0xfa;
CS=1;
for(i=8;i>0;i--)
{
SCLK=0;
SID=tem&0x80;
SCLK=1;
tem<<=1;
}
for(j=2;j>0;j--)
for(i=8;i>0;i--)
{
if(i>4) //送高四位
{
SCLK=0;
SID=Data&0x80;
SCLK=1;
Data<<=1;
}
else //低四位为“0”
{
SCLK=0;
SID=0;
SCLK=1;
}
}
CS=0;
}
//=====================================================
//函数名称:void display(uint value)
//函数功能:显示选择的波形,调用前先送液晶地址
//=====================================================
void display()
{
uchar i;
uchar j;
a[0]=f/10000000;
a[1]=f/1000000%10;
a[2]=f/100000%10;
a[3]=f/10000%10;
a[4]=f/1000%10;
a[5]=f/100%10;
a[6]=f/10%10;
a[7]=f%10;
for(i=0; i<8; i++) //在液晶12864上显示频率
{
LCD_Write_order(0x96+i);
LCD_Write_Data(table[a[i]]);
}
switch(boxing_flag)
{
case 0: LCD_Write_order(0x9b); //显示正弦波
for(j=0;j<6;j++)
LCD_Write_Data(wavetype[j]);
break;
case 1: LCD_Write_order(0x9b); //显示方波
for(j=6;j<12;j++)
LCD_Write_Data(wavetype[j]);
break;
case 2:LCD_Write_order(0x9b); //显示三角波
for(j=12;j<18;j++)
LCD_Write_Data(wavetype[j]);
break;
case 3: LCD_Write_order(0x9b); //显示锯齿波
for(j=18;j<24;j++)
LCD_Write_Data(wavetype[j]);
break;
default: break;
}
}
//主函数
void main(void)
{ //long int f;
init12864(); //初始化12864函数
f=1000;
boxing_flag=0;
while(1)
{switch (keyhh())
{
case 0: break;
case 1: f+=100;if(f>200000||f<0)f=0;break;
case 2: f-=100;if(f>200000||f<0)f=0;break;
case 3: boxing_flag++;
if (boxing_flag==4)
boxing_flag=0; break;
default: break;
}
//LCD_Write_order(0x95); //设定光标位置
display(); //频率更新后的数据显示
dectohex(f);
//LCD_Write_order(0x8c); //设定光标位置
//display(A); //幅度更新后的数据显示
type_gettype();
display();
}
}