📄 基于sst单片机的数字示波器(很有价值).txt
字号:
数字示波器// Header: 数字示波器
// File Name:lcdII.c
// Author: H.C.H
// Date:2007/8/15
//说明:基本成功
#include <SST89x5x4.H>
#include <math.h>
#include<ziku.h>
#define uint unsigned int
#define uchar unsigned char
#define Disp_On 0x3f
#define Disp_Off 0x3e
#define Col_Add 0x40 //列地址
#define Page_Add 0xb8 //行地址
#define Start_Line 0xc0
//********************LCD128*64口定义**********************
#define pi 3.14159
#define Lcd_Bus P1
#define LCD_CON P0
sbit s0=P2^0;
sbit s1=P2^1;
sbit s2=P2^2;
sbit s3=P2^3;
sbit adclk=P2^5;
sbit adcs=P2^7;
sbit addata=P2^6;
unsigned char bdata adc;
sbit adclow=adc^0;
sbit CS2=LCD_CON^3; // CS2
sbit CS1=LCD_CON^4; // CS1
sbit DI=LCD_CON^0; //液晶数据指
sbit RW=LCD_CON^1; //液晶读写
sbit E =LCD_CON^2; //液晶使能
uchar state=0;
sbit beep=P2^4;
uchar max,min;
uchar d[3];
uchar dd[4];
struct complex
{
float real;
float image;
};
struct complex xdata s[64];
uint data T2NOW=0,time2_count=65535;
unsigned long data fi_int=0,fs=0,fs_const=0;
uchar data ii=0,T0_counter=0,Time_NO=2,T1_counter=0;
bit over=0;
struct complex mul(struct complex,struct complex); /*定义复数乘*/
void FFT(struct complex *s);
//******************************子函数*********************
void delay1(uint); //延时程序
void write_cmd1(uchar); //写命令操作字
void write_data1(uchar); //写数据
void cls(); //清屏程序
void init(); //初始化程序
uchar read_data(); //读数据
void line_h(uchar x,uchar y,uchar l);
void line_v(uchar x,uchar y,uchar l);
void screen1(void);
unsigned char key();
//************************延时子程序***********************
struct complex mul(struct complex x,struct complex y)
{
struct complex z;
z.real=x.real*y.real-x.image*y.image;
z.image=x.real*y.image+x.image*y.real;
return (z);
}
void FFT(struct complex *s)
{
unsigned char idata nv2,nm1,k,level,i,j=0;
unsigned char idata ip,le,lei;
struct complex idata v,w,t;
float max;
nv2=64>>1;
nm1=64-1;
for(i=0;i<nm1;i++)
{
if(i<j)
{
t=s[j];
s[j]=s[i];
s[i]=t;
}
k=nv2;
while(k<=j)
{
j-=k;
k=k>>1;
}
j+=k;
}
le=1;
for(level=1;level<=6;level++)
{
lei=le;
le<<=1;
v.real=1.0;
v.image=0.0;
w.real=cos(pi/lei);
w.image=-sin(pi/lei);
for(j=0;j<lei;j++)
{
for(i=j;i<64;i+=le)
{
ip=i+lei;
t=mul(s[ip],v);
s[ip].real=s[i].real-t.real;
s[ip].image=s[i].image-t.image;
s[i].real+=t.real;
s[i].image+=t.image;
}
v=mul(v,w);
}
}
for(i=0;i<32;i++)
s[i].real=sqrt(s[i].real*s[i].real+s[i].image*s[i].image); //幅值
max=s[0].real;
for(i=1;i<32;i++)if(max<s[i].real)max=s[i].real;
for(i=0;i<32;i++)s[i].real=s[i].real*50/max;
}
unsigned char adconvert() //ad设置
{ unsigned char i;
adcs=1;
adcs=0;
adclk=0;
for(i=0;i<8;i++)
{ adclk=1;
adclow=addata;
adclk=0;
if(i<7) adc=adc<<1;
}
adclk=0;
adcs=1;
return(adc);
}
void delay1(uint t)
{
uint i,j;
for(i=0;i<t;i++)
for(j=0;j<10;j++);
}
//********************写命令到LCD**************************
void write_cmd1(uchar cmd)
{
DI=0; RW=0;
Lcd_Bus=cmd;
E=1;
E=0;
delay1(1);
}
void display_h(uchar page,uchar col,uchar code *english,uchar n)
{
uchar j,i;
if(col<64)
{
CS2=1;CS1=0;
}
else
{
CS2=0;CS1=1;
col=col-64;
}
for(j=0;j<2;j++)
{
write_cmd1(Page_Add+page+j);write_cmd1(Col_Add+col);
for(i=0;i<12;i++)
write_data1(english[n*24+12*j+i]);
}
}
void display_e(uchar page,uchar col,uchar code *english,uchar n)
{
uchar j,i;
if(col<64)
{
CS2=1;CS1=0;
}
else
{
CS2=0;CS1=1;
col=col-64;
}
for(j=0;j<2;j++)
{
write_cmd1(Page_Add+page+j);write_cmd1(Col_Add+col);
for(i=0;i<7;i++)
write_data1(english[n*14+7*j+i]);
}
}
//************************写数据到LCD**********************
void point(uchar x,uchar y)
{
uchar y1,y2,pp;
uchar datain;
pp=1;
y1=y>>3;
y2=y%8;
pp=pp<<y2;
if (x<64)
{
CS2=1;
CS1=0;
write_cmd1(Page_Add+y1);
write_cmd1(Col_Add+x);
datain=read_data();
write_cmd1(Page_Add+y1);
write_cmd1(Col_Add+x);
delay1(10);
datain=read_data();
write_cmd1(Page_Add+y1);
write_cmd1(Col_Add+x);
datain=datain|pp;
write_data1(datain);
}
else
{
CS2=0;
CS1=1;
write_cmd1(Page_Add+y1);
write_cmd1(Col_Add+x-64);
datain=read_data();
write_cmd1(Page_Add+y1);
write_cmd1(Col_Add+x-64);
delay1(10);
datain=read_data();
write_cmd1(Page_Add+y1);
write_cmd1(Col_Add+x-64);
datain=datain|pp;
write_data1(datain);
}
}
vp_p(uchar *s)
{
uchar i;
unsigned long vp=0;
max=s[0],min=s[0];
for(i=1;i<120;i++)
{
if (max<s[i])max=s[i];
if(min>s[i])min=s[i];
}
vp=max-min;
vp=vp*500;
vp=vp/255;
d[2]=vp/100;
d[1]=(vp-d[2]*100)/10+1;
d[0]=vp%10;
}
void pointb(uchar x,uchar y)
{
uchar y1,y2,pp;
uchar datain;
pp=1;
y1=y>>3;
y2=y%8;
pp=~(pp<<y2);
if (x<64)
{
CS2=1;
CS1=0;
write_cmd1(Page_Add+y1);
write_cmd1(Col_Add+x);
datain=read_data();
write_cmd1(Page_Add+y1);
write_cmd1(Col_Add+x);
delay1(10);
datain=read_data();
write_cmd1(Page_Add+y1);
write_cmd1(Col_Add+x);
datain=datain&pp;
write_data1(datain);
}
else
{
CS2=0;
CS1=1;
write_cmd1(Page_Add+y1);
write_cmd1(Col_Add+x-64);
datain=read_data();
write_cmd1(Page_Add+y1);
write_cmd1(Col_Add+x-64);
delay1(10);
datain=read_data();
write_cmd1(Page_Add+y1);
write_cmd1(Col_Add+x-64);
datain=datain&pp;
write_data1(datain);
}
}
//5*7
display_num(uchar x,uchar y,uchar *num,uchar n)
{
uchar i,j,temp;
for(j=0;j<5;j++)
{ temp=num[5*n+j];
for(i=0;i<8;i++)
{
if(temp&1)point(x+j,y+i);
else pointb(x+j,y+i);
temp=temp>>1;
}
}
}
display8_16(uchar x,uchar y,uchar *num,uchar n)
{
uchar i,j,temp;
for(j=0;j<16;j++)
{ temp=num[16*n+j];
if(j<8)
{
temp=temp>>4;
for(i=0;i<4;i++)
{
if(temp&1)point(x+j,y+i);
else pointb(x+j,y+i);
temp=temp>>1;
}
}
else
{
for(i=0;i<4;i++)
{
//temp=temp>>4;
if(temp&1)point(x+j-8,y+i+4);
else pointb(x+j-8,y+i+4);
temp=temp>>1;
}
}
}
}
void write_data1(uchar dout)
{
DI=1; RW=0;
Lcd_Bus=dout;
E=1;
E=0;
delay1(1);
}
//***************************读LCD数据*********************
uchar read_data()
{
uchar din;
Lcd_Bus=0xff;
DI=1; RW=1;
E=0;
E=0;
E=1;
E=1;
E=1;
din=Lcd_Bus;
return din;
}
//****************************清除内存*********************
void cls()
{
uchar j,k;
CS2=1;CS1=0;
for(k=0;k<8;k++)
{
write_cmd1(Page_Add+k);
write_cmd1(Col_Add); //列地址0
for(j=0;j<64;j++) //列地址自动加一
write_data1(0x00);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -