case 0X7B:key=11;break; case 0XE7:key=12;break; case 0XD7:key=13;break; case 0XB7:key=14;break; case 0X77:key=15;break; } //end switch }//end for return key;
}//end keyboard()
/*======================================================= 头文件名:SPI.h
功能:AVR与FPGA SPI通信的驱动程序
=======================================================*/ //---------FPGA的SPI接口定义----------------// #define CS 0 #define SCLK 1 #define MOSI 2 #define LOAD 3 #define MISO 4 #define LAT 5 #define RST 6
#define DDR_SPI DDRD #define PORT_SPI PORTD #define PIN_SPI PIND
#define CSH PORT_SPI|=BIT(CS) #define CSL PORT_SPI&=~BIT(CS) #define SCLKH PORT_SPI|=BIT(SCLK) #define SCLKL PORT_SPI&=~BIT(SCLK) #define MOSIH PORT_SPI|=BIT(MOSI) #define MOSIL PORT_SPI&=~BIT(MOSI) #define MISOH PORT_SPI|=BIT(MISO) #define MISOL PORT_SPI&=~BIT(MISO) #define LOADH PORT_SPI|=BIT(LOAD) #define LOADL PORT_SPI&=~BIT(LOAD) #define LOADH PORT_SPI|=BIT(LOAD) #define LOADL PORT_SPI&=~BIT(LOAD) #define LATH PORT_SPI|=BIT(LAT) #define LATL PORT_SPI&=~BIT(LAT) #define RSTH PORT_SPI|=BIT(RST) #define RSTL PORT_SPI&=~BIT(RST)
//---------微妙级别的延时函数-------------//
delayus(uchar t) { uchar i;
for(i=0;i asm(\asm(\asm(\asm(\asm(\asm(\asm(\asm(\} } //---------从FPGA中读出数据------------// uchar spi_read(uchar addr) { uchar i,output; DDR_SPI=0XFF;//IO的初始化 DDR_SPI&=~BIT(MISO); CSH; LOADH; SCLKL; MOSIL; LATL; CSL; for(i=0;i<8;i++) //写入地址 { if(addr&0X80) MOSIH; else MOSIL; SCLKH; SCLKL; addr=addr<<1; } CSH; LOADL;//产生load的下降沿,往reg[15:8]中装入数据 LOADH; CSL; for(i=0;i<8;i++) { output=output<<1;//要先移位一下,否则只要for7次 if(PIN_SPI&BIT(MISO)) output|=1; SCLKH; SCLKL; } CSH; LATH; return output; } /*======================================================= 头文件名:read_data.h 功能:从FPGA中读取数据,并处理。 此程序中包含对低频信号测周期并取倒数的算法 =======================================================*/ uchar period[24]; uchar sig_dig[24]; uchar real[24]; uchar dummy[24]; uchar freq[24]; uchar pnt; //-------判断周期数组中有效位的起始位置------// uchar find_pos() { uchar flag=1,i=0,pos; while(flag) { if(period[i]!='0') { pos=i; flag=0; } else { pos==255; i++; flag=1; } } return pos; } //-------------------------- -------------------// //取6位被测信号周期的数字(高6位) //---------------------------------------------// double catch_six_dig(uchar pos) { double temp=0; uchar i; for(i=0;i<6;i++) { temp=temp*10+(period[pos+i]-'0'); } return temp; } //---------------------------------------------// //求有效位的倒数,并乘以10000,然后将每一个有 效位转换成字符数组保存在sig_dig[]数值中。 //---------------------------------------------// void float_disp() { double float1,float2,float3,float_MSD,float_LSD; uint uint_MSD,uint_LSD,temp; uchar i; uint sig_fig_L,sig_fig_H; float2=catch_six_dig(find_pos()); //float3=(float1*10000/float2); float3=(1000000000/float2); float_MSD=float3; uint_MSD=float_MSD; float_LSD=(float_MSD-uint_MSD)*1000; uint_LSD=float_LSD; pnt=0; if(float3!=1) { temp=uint_MSD/1000; sig_dig[pnt++]=temp+'0'; uint_MSD=uint_MSD00; temp=uint_MSD/100; sig_dig[pnt++]=temp+'0'; uint_MSD=uint_MSD0; temp=uint_MSD/10; sig_dig[pnt++]=temp+'0'; sig_dig[pnt++]=uint_MSD+'0'; //temp=uint_LSD/1000; // sig_dig[pnt++]=temp+'0'; uint_LSD=uint_LSD00; temp=uint_LSD/100; sig_dig[pnt++]=temp+'0'; uint_LSD=uint_LSD0; temp=uint_LSD/10; sig_dig[pnt++]=temp+'0'; sig_dig[pnt++]=uint_LSD+'0'; } } //------------------------------------------------// //通过输入有效位数值和小数点所在位数用字符串显示小数 //------------------------------------------------// void put_dot(uchar sig_dig[],uchar location) { uchar i,j; char pos=location-3; float_disp(); if(pos>=1 && pos<=5) { j=0; for(i=0;i<7;i++) { if(j==pos) { real[j++]='.'; } real[j++]=sig_dig[i]; } } else if(pos==0) { real[0]='0';