📄 失真度.c
字号:
/*********************************************************/
/** 失真度 **
*********************************************************/
#include <absacc.h>
#include <reg51.h>
#include<intrins.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
#define LED1 XBYTE [0xA000] //数码管地址
#define LED2 XBYTE [0xA001]
#define LED3 XBYTE [0xA002]
#define LED4 XBYTE [0xA003]
#define LED5 XBYTE [0xA004]
#define LED6 XBYTE [0xA005]
#define LED7 XBYTE [0xA006]
#define LED8 XBYTE [0xA007]
#define KEY XBYTE [0xA100] //键盘地址
#define lcdDl XBYTE [0xA201] //左半边液晶数据地址
#define lcdDr XBYTE [0xA301] //右半边液晶数据地址
#define lcdlCommand XBYTE [0xA200]//左半边液晶命令地址
#define lcdrCommand XBYTE [0xA300]//右半边液晶命令地址
#define fpga XBYTE[0xC800]
#define libleng 0x5F //字模库容量
/*液晶显示使用的常量*/
#define strat_yaddr 0x40
#define strat_xaddr 0xb8
#define strat_dispaddr 0xc0
xdata uchar RAM[32768] _at_ 0x0000;//外部RAM地址
static xdata uchar FPGA_data[64]_at_ 0xD800;
/*扫描键盘使用的变量 */
sbit first_row = P1^4; //键盘第一行控制
sbit second_row = P1^3; //键盘第二行控制
sbit clock=P1^1;
sbit ioput=P1^2;
sbit cs1=P1^0;
bit first_getkey = 0,control_readkey = 0; //读键盘过程中的标志位
bit getkey = 0; //获得有效键值标志位 等于1时代表得到一个有效键值
bit keyon = 0,enable_readkey=0,tuichu=0; //防止按键冲突标志位,tong[8],chufazi[3][8]
uchar keynum = 0; //获得的有效按键值寄存器
/*读写flash使用的变量*/
sbit scl = P1^0; //24C16 scl
sbit sda = P1^1; //24c16 sdl
/*数码管显示使用的变量和常量*/
/*
uchar lednum = 0; //数码管显示位控制寄存器
uchar led[8] = {0,0,0,0,0,0,0,0}; //数码管显示内容寄存器
uchar code segtab[18] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x8c,0xff}; //七段码段码表
// "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "P" ,"black"
*/
uchar code shezhi[256];
uchar code celiang[192];
uchar code zhonglei[160];
uchar code pinlv[96];
uchar code fudu[96];
uchar code zhengxian[96];
uchar code sanjiao[96];
uchar code shuruzifu[128];
uchar code shuru2zifu[128];
uchar code diaodianzifu[256];
uchar code diaodianzifu2[128];
uchar code ASCII[libleng][8];
//uchar code shezhishijian[128];
uchar code hehe[14] = "0123456789. E-";
//uchar data_temp[16],diaodianzhi[5];
void leddisp(void); //数码管显示函数
void readkey(void); //读键盘函数
// 功能函数
void showdata(float shu);
void show_data(double print,uchar hang,uchar lie,uchar wei);
void showshu1(float x,uchar h,uchar l);
/**********************************
液晶驱动函数
***********************************/
void lcdlon_off(uchar D);
void setlstartx(uchar D);
void setlstarty(uchar D);
void setlstartline(uchar D);
void lcdron_off(uchar D);
void setrstartx(uchar D);
void setrstarty(uchar D);
void setrstartline(uchar D);
void lcdlwrite(uchar D);
void lcdrwrite(uchar D);
void initial_lcd(void);
void clear_lcd(void);
//写入液晶函数
void show_hanzi_string(uchar word_data[],uchar hang,uchar lie,uchar word_len);
void write_char (uchar datan,uchar hang,uchar lie );
void write_str_noclear (uchar worddata[],uchar hang,uchar lie ,uchar len); //对LCD进行字符串写入
//void hanzi_lcd(uchar word_data[32], uchar index );
void jianpan(void);
/**********************************
24c16驱动函数
**********************************/
/*void delay(uchar time_nop);
void Start_I2c(void);
void Stop_I2c(void);
uchar SendByte(uchar c);
uchar RcvByte(void);
void Ack_I2c(uchar a);
uchar ISendByte(uchar sla,uchar c);
uchar ISendStr(uchar sla,uchar suba,uchar *s,uchar no);
uchar IRcvByte(uchar sla,uchar *c);
uchar IRcvStr(uchar sla,uchar suba,uchar *s,uchar no);
void write_24lc16b(uint adrress, uchar *wdata, uchar number);
void read_24lc16b(uint adrress, uchar *rdata, uchar number);*/
void intT0() interrupt 1 //T0 定时中断处理函数
{
TH0 = -2720/256; //定时器中断时间间隔 4ms
TL0 = -2720%256;
//leddisp(); //每次定时中断显示更新一次
if(enable_readkey==1)
{
if(control_readkey == 1) //每两次定时中断扫描一次键盘
{
readkey();
}
control_readkey = !control_readkey;
/*if(getkey==1)
{
enable_readkey=0;
}*/
}
}
void jianpan()
{
getkey=0;
enable_readkey=1;
while(getkey==0);
enable_readkey=0;
}
/*void showdata(float shu)//
{ long shuu=shu*100;
write_char(hehe[shuu/100],8,3);//
write_char(hehe[10],8,4);
shuu=shuu%100;
write_char(hehe[shuu/10],8,5);
shuu=shuu%10;
write_char(hehe[shuu],8,6);
}
*/
/*void showshu(uchar x,uchar h,uchar l)
{ long shuu=x;
write_char(hehe[shuu/100],h,l);//
shuu=shuu%100;
write_char(hehe[shuu/10],h,l+1);
shuu=shuu%10;
write_char(hehe[shuu],h,l+2);
}*/
void show_zhengshu(uint shu,uchar h,uchar l,uchar w)
{
uint zheng=shu,bb=1;
uchar i,x;
for(i=0;i<w;i++)
{
for(x=0;x<w-i-1;x++)
bb*=10;
write_char(hehe[zheng/bb],h,l+i);//
zheng=zheng%bb;
bb=1;
}
}
void gaishu(float xian,uchar h,uchar l)//数字频率计中的,显示恒八位,带小数点//待测试
{
uint i,x;
unsigned long shu1=0;
if(xian>=10000000)
{shu1=xian*100;x=2;}
else if(xian>=1000000)
{shu1=xian*1000;x=3;}
else if(xian>=100000)
{shu1=xian*10000;x=4;}
else if(xian>=10000)
{shu1=xian*100000;x=5;}
else if(xian>=1000)
{shu1=xian*1000000;x=6;}
else if(xian>=100)
{shu1=xian*10000000;x=7;}
else if(xian>=10)
{shu1=xian*100000000;x=8;}
else
{shu1=xian*1000000000;x=9;}
for(i=0;i<=10;i++)
{
if(i!=x)
{if(i>2)
write_char(hehe[shu1%10],h,10-i+l);
shu1=shu1/10;}//{shu[10-i]=hehe[shu1%10];shu1=shu1/10;}
else
write_char(hehe[10],h,10-i+l);//shu[10-i]=hehe[10];
}
}
/*void shezhihanshu()
{
uint shuru=0,ll=1,fudushu,fuduzhi;
clear_lcd();
show_hanzi_string(zhonglei,1,1,5);
show_hanzi_string(pinlv,2,1,3);
show_hanzi_string(fudu,3,1,3);
do
{
jianpan();
}while(keynum!=1&&keynum!=2&&keynum!=3);
if(keynum==1)
{
clear_lcd();
show_hanzi_string(zhengxian,1,1,3);
show_hanzi_string(sanjiao,3,1,3);
do
{
jianpan();
}while(keynum!=1&&keynum!=2);
FPGA_data[4]=keynum-1;
diaodianzhi[0]=keynum-1;
write_24lc16b(4, diaodianzhi , 1);
}
else if(keynum==2)
{
clear_lcd();
show_hanzi_string(shuruzifu,1,1,4);
show_zhengshu(20,2,9,2);
write_char(hehe[13],2,11);
show_zhengshu(20000,2,12,5);
do
{
do
{
jianpan();
}while(keynum>10&&keynum!=16);
if(keynum<10)
{shuru=shuru*10+keynum;write_char(hehe[keynum],4,ll++);}
else if(keynum==10)
{shuru=shuru*10;write_char(hehe[0],4,ll++);}
else
tuichu=1;
}while(tuichu==0);tuichu=0;
/////////////////////////////////////////////////////怎样将频率转换为步进
FPGA_data[0]=shuru%256;
FPGA_data[1]=shuru/256;
diaodianzhi[0]=shuru%256;
diaodianzhi[1]=shuru/256;
write_24lc16b(0, diaodianzhi , 2);
}
else
{
clear_lcd();
show_hanzi_string(shuru2zifu,1,1,4);
write_char(hehe[0],1,9);write_char(hehe[13],1,10);write_char(hehe[3],1,11);
do
{
jianpan();
}while(keynum>10);
write_char(hehe[keynum],4,7);
fudushu=keynum*100;
write_char(hehe[10],4,8);
do
{
jianpan();
}while(keynum>10);
write_char(hehe[keynum],4,9);
fudushu+=keynum*10;
do
{
jianpan();
}while(keynum>10);
write_char(hehe[keynum],4,10);
fudushu+=keynum;
do
{
jianpan();
}while(keynum!=16);
//////////////////
fuduzhi=(fudushu*512)/500+512;
FPGA_data[2]=fuduzhi%256;
FPGA_data[3]=fuduzhi/256;
diaodianzhi[0]=fuduzhi%256;
diaodianzhi[1]=fuduzhi/256;
write_24lc16b(2, diaodianzhi , 2);
}
}
void celianghanshu()
{
uchar jipin,m,x,y,hh=2;
long xubu,shibu;
float pingfanghe,shizhen,mozhi;
clear_lcd();
for(m=0;m<16;m++)
{
x=FPGA_data[m*4];
y=FPGA_data[m*4+1];
if(y>31)
shibu=8192-((y-32)*256+x);
else
shibu=y*256+x;
x=FPGA_data[m*4+2];
y=FPGA_data[m*4+3];
if(y>31)
xubu=8192-((y-32)*256+x);
else
xubu=y*256+x;
mozhi=sqrt(shibu*shibu+xubu*xubu);
showshu1(mozhi,hh,1+m*4);
if(m==3)
hh++;
//pingfanghe+=x^2;///////////////////////////什么样的数值表示形式
}
//shizhen=sqrt(pingfanghe)/sqrt(jipin*jipin+pingfanghe);
//show_data(shizhen,4,5,4);
do
{
jianpan();
}while(keynum!=16);
}
/*void eeprom_24c16(void)
{
uchar wdata[2] = {0x03,0x04};
write_24lc16b(0, wdata , 1);
write_24lc16b(1, wdata + 1, 1);
}
void reeprom_24c16(void)
{
uchar i;
uchar rdata[2] = {0x00,0x00};
read_24lc16b(0, rdata , 1);
read_24lc16b(1, rdata + 1, 1);
for(i=0;i<4;i++)
{
led[2*i] =rdata[0];
led[2*i+1] =rdata[1];
}
}*/
void main(void)
{
uchar m,x,y,c;//jipin
float shizhen,mozhi=0,jimo;//shab[5],he,he1;
float shibu,xubu;
TMOD = 0x01;
TH0 = -2720/256; //定时器中断时间间隔 4ms
TL0 = -2720%256;
TCON = 0x10;
ET0 = 1;
EA = 1;
initial_lcd();//初始化液晶
while(1)
{
do
{jianpan();}while(keynum>4);
clear_lcd();
if(keynum==1)//while(1)////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
{
mozhi=0;
for(m=0;m<=5;m++)
{
x=FPGA_data[m*2];
y=FPGA_data[m*2+1];
if(x>127)
{shibu=256-x;
if(m<8)
show_zhengshu(shibu,m+1,1,4);}//write_char(hehe[13],m+1,1);
else
{shibu=x;
if(m<8)
show_zhengshu(shibu,m+1,1,4);}
if(y>127)
{xubu=256-y;
if(m<8)
show_zhengshu(xubu,m+1,5,4);}//write_char(hehe[13],m+1,7);
else
{xubu=y;
if(m<8)
show_zhengshu(xubu,m+1,5,4);}
if(m==1)
jimo=shibu*shibu+xubu*xubu;
else if(m>1)
mozhi+=shibu*shibu+xubu*xubu;
}
gaishu(mozhi,4,9);
gaishu(jimo+mozhi,5,9);
gaishu(jimo,6,9);
shizhen=sqrt(mozhi/(jimo+mozhi));
gaishu(shizhen,3,9); //mozhi=sqrt(shibu*shibu+xubu*xubu);
do
{
jianpan();
}while(keynum!=16);////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
else if(keynum==2)//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
{/////////////////////////////////不去最大值的失真度
mozhi=0;
clear_lcd();
for(m=1;m<8;m++)
{
x=FPGA_data[m*4];
y=FPGA_data[m*4+1];
y=y%32;
if(y>15)
{shibu=4096-((y-16)*256+x);}
else
{shibu=y*256+x;}
x=FPGA_data[m*4+2];
y=FPGA_data[m*4+3];
y=y%32;
if(y>15)
{xubu=4096-((y-16)*256+x);}
else
{xubu=y*256+x;}
if(m==1)
jimo=shibu*shibu+xubu*xubu;
else
mozhi+=shibu*shibu+xubu*xubu;
}
shizhen=sqrt(mozhi/(jimo+mozhi));
gaishu(shizhen,3,1);
//showshu1(mozhi,hh,1+m*4);
// if(m==3)
// hh++;
//pingfanghe+=x^2;///////////////////////////什么样的数值表示形式
//shizhen=sqrt(pingfanghe)/sqrt(jipin*jipin+pingfanghe);
//show_data(shizhen,4,5,4);
//mozhi=sqrt(shibu*shibu+xubu*xubu);
//showshu1(mozhi,hh,1+m*4);
//if(m==3)
//hh++;
//pingfanghe+=x^2;///////////////////////////什么样的数值表示形式
//jianpan(); clear_lcd(); jianpan();
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
else if(keynum==3)//while(1)///////////////////////////////显示八个实虚部
{
jimo=0;mozhi=0;
for(m=0;m<=31;m++)
{
x=FPGA_data[m*2];
y=FPGA_data[m*2+1];
if(x>127)
{shibu=256-x;
if(m<8)
show_zhengshu(shibu,m+1,1,4);}//write_char(hehe[13],m+1,1);
else
{shibu=x;
if(m<8)
show_zhengshu(shibu,m+1,1,4);}
if(y>127)
{xubu=256-y;
if(m<8)
show_zhengshu(xubu,m+1,5,4);}//write_char(hehe[13],m+1,7);
else
{xubu=y;
if(m<8)
show_zhengshu(xubu,m+1,5,4);}
if(m==1)
jimo=shibu*shibu+xubu*xubu;
else if(m>1)
mozhi+=shibu*shibu+xubu*xubu;
}
gaishu(mozhi,4,9);
gaishu(jimo+mozhi,5,9);
gaishu(jimo,6,9);
shizhen=sqrt(mozhi/(jimo+mozhi));
gaishu(shizhen,3,9); //mozhi=sqrt(shibu*shibu+xubu*xubu);
//showshu1(mozhi,hh,1+m*4);
//if(m==3)
//hh++;
//pingfanghe+=x^2;///////////////////////////什么样的数值表示形式
//jianpan(); clear_lcd(); jianpan();
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
else
{
for(m=0;m<8;m++)
{
x=FPGA_data[2*m];
show_zhengshu(x,m+1,2,4);
x=FPGA_data[2*m+1];
show_zhengshu(x,m+1,8,4);
}
}
}
}
/*void showshu1(float xxx,uchar h,uchar l)
{ long shuu1=xxx;
shuu1=shuu1%10000;
write_char(hehe[shuu1/1000],h,l);//
shuu1=shuu1%1000;
write_char(hehe[shuu1/100],h,l+1);
//shuu1=shuu1%100;
//write_char(hehe[shuu1/10],h,l+2);
//shuu1=shuu1%10;
//write_char(hehe[shuu1],h,l+3);
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -