#include <REG52.H>
#include <intrins.h>
#include <stdio.h>
#include <math.h>
#include "LCD.h"
#define uint unsigned int
#define uchar unsigned char
#define n_max 128 //采样点个数
#define xstep 100 //x步进量
#define ystep 2 //y步进量
sbit AD_CS = P1^6;//定义数模转换器硬件对应引脚
sbit AD_CLK = P1^3;
sbit AD_DI = P1^5;
sbit AD_DO = P1^4;
sbit Key_S1 = P3^0;
sbit Key_S2 = P3^1;
sbit Key_S3 = P3^2;
sbit Key_S4 = P3^3;
uchar avg;
uchar xdata smp[n_max];
uchar xdata disp[n_max];
uchar disp_index,smp_index,img_index;
uchar TH, TL; //采样频率对应的定时器参数
char vmax,vmin;
uint rate = 0;//记录频率
uint fs = 500;//采样频率
float f;//信号频率
bit tf;//定时器中断标志
bit df=0;
bit sf=0;
bit cf;
float x=1,y=1;//步进后的值
/******************LCD****************/
/***********************************
函数名: Delay
函数说明: 进行us级的延时
传入参数: uint t
传出参数: 无
返回值: 无
***********************************/
void Delay(uint t)
{
uint i;
for(i=0; i<t; i++)
;
}
/*****************************************
函数名: CheckBusy
函数说明: 检查LCD状态,不忙才能往下执行
传入参数: 无
传出参数: 无
返回值: 无
*****************************************/
void CheckBusy(void)
{
RS=0;
RW=1;
E =1;
Lcd_Bus=0xff;
while((Lcd_Bus&0x80)==0x80);
E =0;
}
/*****************************
函数名: WriteCom
函数说明: 向LCD写入1字节命令
传入参数: uchar cmdcode
传出参数: 无
返回值: 无
******************************/
void WriteCom(uchar Cmdcode)
{
CheckBusy();
RS=0;
RW=0;
E =1;
Lcd_Bus=Cmdcode;
E =0;
}
/*********************************
函数名: WriteData
函数说明: 向LCD写入1字节显示内容
传入参数: uchar Dispdata
传出参数: 无
返回值: 无
**********************************/
void WriteData(uchar Dispdata)
{
CheckBusy();
RS=1;
RW=0;
E =1;
Lcd_Bus=Dispdata;
E =0;
}
/*****************************
函数名: ReadByte
函数说明: 从LCD读出1字节数据
传入参数: 无
传出参数: 无
返回值: 读出的1字节数据
******************************/
uchar ReadByte(void)
{
uchar ReValue;
CheckBusy();
Lcd_Bus=0xff;
RS=1;
RW=1; //读
E =0;
E =1;
ReValue=Lcd_Bus;
E =0;
return ReValue;
}
/************************************
函数名: ClrGDRAM
函数说明: 通过写入全0清除LCD的GDRAM
传入参数: 无
传出参数: 无
返回值: 无
*************************************/
void ClrGDRAM(void)
{
uchar x,y;
for(y=0;y<64;y++)
for(x=0;x<16;x++)
{
WriteCom(0x34);
WriteCom(y+0x80); //行地址
WriteCom(x+0x80); //列地址
WriteCom(0x30);
WriteData(0x00);
WriteData(0x00);
}
}
/*********************************************
函数名: LcdReset
函数说明: 重置LCD,PSB置1(并口),清除GDRAM
传入参数: 无
传出参数: 无
返回值: 无
**********************************************/
void LcdReset(void)
{
PSB=1;
WriteCom(0x30); //选择基本指令集
WriteCom(0x30); //选择8bit数据流
WriteCom(0x0c); //开显示(无游标、不反白)
WriteCom(0x01); //清除显示,并且设定地址指针为00H
WriteCom(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位
ClrGDRAM();
}
/*********************************************
函数名: asc_single_disp
函数说明: 在指定位置显示单个8*8的asc码
传入参数: uchar xpos, uchar ypos, uchar data1
xpos为0~15,ypos为0~7,data1是要显示的asc码值
传出参数: 无
返回值: 无
**********************************************/
void asc_single_disp(uchar xpos, uchar ypos, uchar data1, bit color)
{
uchar i;
uchar OldHByte,OldLByte;
uchar x0,y0;
data1-=' ';
if(ypos<4)
{
x0=xstart1+(xpos>>1);//上半屏地址
y0=ystart+(ypos<<3);
}
else
{
x0=xstart2+(xpos>>1);//下半屏地址
y0=ystart +((ypos-4)<<3);
}
for(i=0;i<8;i++)
{
WriteCom(0x36);
WriteCom(y0+i);
WriteCom(x0);
ReadByte();
OldHByte=ReadByte(); //读取地址中的16个像素值
OldLByte=ReadByte();
if(xpos&0x01)//为真时写入OldLByte
OldLByte=asc[data1][i];
else
OldHByte=asc[data1][i];
WriteCom(y0+i);
WriteCom(x0);
WriteCom(0x30);
if(color)
{
WriteData(OldHByte);
WriteData(OldLByte);
}
else
{
WriteData(~OldHByte);
WriteData(~OldLByte);
}
}
WriteCom(0x36);
}
/***********************************************************
函数名: asc_double_disp
函数说明: 在指定位置显示两个8*8的asc码
传入参数: uchar xpos, uchar ypos, uchar data1, uchar data2
xpos为0~7,ypos为0~7,data1和data2是要显示的asc码值
传出参数: 无
返回值: 无
***********************************************************/
void asc_double_disp(uchar xpos, uchar ypos, uchar data1, uchar data2, bit color)
{
uchar i;
uchar x0,y0;
data1-=' ';
data2-=' ';
if(ypos<4)
{
x0=xstart1+xpos;//上半屏地址
y0=ystart +(ypos<<3);
}
else
{
x0=xstart2+xpos;//下半屏地址
y0=ystart +((ypos-4)<<3);
}
for(i=0;i<8;i++)
{
WriteCom(0x36);
WriteCom(y0+i);
WriteCom(x0);
WriteCom(0x30);
if(color)
{
WriteData(asc[data1][i]);
WriteData(asc[data2][i]);
}
else
{
WriteData(~(asc[data1][i]));
WriteData(~(asc[data2][i]));
}
}
WriteCom(0x36);
}
/************************************************************************************
函数名: asc_list_disp
函数说明: 在指定位置显示8*8的asc码串
传入参数: uchar xpos, uchar ypos, uchar code *s
xpos为0~7,ypos为0~7,s是要显示asc码串的首地址,函数没有对需要显示的字串进行长度判断
传出参数: 无
返回值: 无
************************************************************************************/
void asc_list_disp(uchar xpos, uchar ypos, uchar *s, bit color)
{
while(*s>0)
{
if(*(s+1)>0)
asc_double_disp(xpos++, ypos, *(s++), *(s++),color);
else
{
asc_single_disp(xpos*2, ypos, *s,color);
return;
}
}
}
/********************************************************************
函数名: SetPixel
函数说明: 在指定位置画一个点
传入参数: uchar xpos,uchar ypos,uchar color
xpos为0~127,ypos为0~63,color=0背景色,color=1前景色,color=2颜色取反
传出参数: 无
返回值: 无
********************************************************************/
void SetPixel(uchar xpos,uchar ypos,uchar color)
{
uchar Row/*行*/,Tier/*列(16个像素/列)*/,TierBit/*列中的第几个像素*/;
uchar OldHByte,OldLByte;
WriteCom(0x34); //功能设定:扩充指令集
WriteCom(0x36); //绘图显示ON
Tier=xpos>>4;
TierBit=xpos&0x0f;
if(ypos<32)//上半屏
Row=ypos;
else //下半屏
{
if(ypos>63)
return;
Row=ypos-32;
Tier+=8;
}
WriteCom(Row+0x80); //确定地址
WriteCom(Tier+0x80);
ReadByte();
OldHByte=ReadByte(); //读取地址中的16个像素值
OldLByte=ReadByte();
WriteCom(Row+0x80);
WriteCom(Tier+0x80);
if(TierBit<8)
{
switch(color)
{
case 0:OldHByte&=(~(0x01<<(7-TierBit)));break;
case 1:OldHByte|=(0x01<<(7-TierBit));break;
case 2:OldHByte^=(0x01<<(7-TierBit));break;
default:break;
};
WriteData(OldHByte);
WriteData(OldLByte);
}
else
{
switch(color)
{
case 0:OldLByte&=(~(0x01<<(15-TierBit)));break;
case 1:OldLByte|=(0x01<<(15-TierBit));break;
case 2:OldLByte^=(0x01<<(15-TierBit));break;
default:break;
}
WriteData(OldHByte);
WriteData(OldLByte);
}
WriteCom(0x30);//基本指令集,绘图显示OFF
}
/**************************************************************************
函数名: HorLine
函数说明: 在指定两点间画水平线
传入参数: uchar x0,uchar x1,uchar y,uchar color
x0为0~127,x1为0~127,y为0~63,color=0背景色,color=1前景色,color=2颜色取反
传出参数: 无
返回值: 无
**************************************************************************/
void HorLine(uchar x0,uchar x1,uchar y,uchar color)
{
uchar temp;
//保证x0<x1
if(