📄 adda.c
字号:
DACdata[2*i]=((0xFFF-(unsigned long)(0xFFF/(ADDAParaList[5]*0.64)*(i-(ADDAParaList[3]+ADDAParaList[4])*0.64)))*ADDAParaList[2]/24)>>8;
DACdata[2*i+1]=((0xFFF-(unsigned long)(0xFFF/(ADDAParaList[5]*0.64)*(i-(ADDAParaList[3]+ADDAParaList[4])*0.64)))*ADDAParaList[2]/24);
}
for(;i<64;i++) //低电平
DACdata[2*i]=DACdata[2*i+1]=0;
}
return;
}
}//while(1)
}
void DrawScale() //在3区绘制坐标刻度
{
int i,j;
unsigned int TriggerLine=176-TriggerValue*16/300;; //触发线坐标
CS=0;
LCD_RAM_ORG=LCD_Area3;
//纵轴
CmdWrite(CSRDIR_DOWN);
for(i=0;i<7;i++)
{
unsigned char Mode=0x80;
Locatexy((10+50*i)/8,16);
for(j=0;j<(10+50*i)%8;j++)
Mode=Mode>>1;
CmdWrite(MWRITE);
for(j=0;j<80;j++)
{
DataWrite(Mode);
DataWrite(0);
}
}
//横轴
CmdWrite(CSRDIR_RIGHT);
for(i=0;i<7;i++)
{
Locatexy(1,176-i*27);
CmdWrite(MWRITE);
for(j=0;j<38;j++)
DataWrite(0xAA);
}
//绘制触发线
Locatexy(1,TriggerLine);
CmdWrite(MWRITE);
for(i=0;i<38;i++)
DataWrite(0xFF);
LCD_RAM_ORG=LCD_Area1;
CS=1;
}
void ADC0_ISR() interrupt 15 //采集AD数据
{
char Stats=0; //0:< 1:>
AD0INT=0;
if(ADcounter==0)
{
if(ADC0H>ADH_TriggerValue)
Stats=1;
if(ADC0H==ADH_TriggerValue)
{
if(ADC0L>ADL_TriggerValue)
Stats=1;
}
if(TriggerMode==0)
{
if(LastStats==0 && Stats==1)
{
ADCdata[ADcounter]=ADC0H;
ADcounter++;
}
}
if(TriggerMode==1)
{
if(LastStats==1 && Stats==0)
{
ADCdata[ADcounter]=ADC0H;
ADcounter++;
}
}
if(TriggerMode==2)
{
if(LastStats+Stats==1)
{
ADCdata[ADcounter]=ADC0H;
ADcounter++;
}
}
LastStats=Stats;
}
else
{
if(ADcounter<304)
{
ADCdata[ADcounter]=ADC0H;
ADcounter++;
}
else
{
LastStats=2;
ready=1;
}
}
}
void DrawGraph() //根据ADCdata中数据绘制曲线
{
unsigned char row,col,k;
CS=0;
Locatexy(0,17); //定位在显示区(16~176行)
CmdWrite(CSRDIR_RIGHT);
CmdWrite(MWRITE); //发写命令
for(row=16;row<=176;row++) //对16~176行绘图
{
unsigned char value=176-row; //第row行所对应的ADC值
for(col=0;col<40;col++) //每行40个字节
{
unsigned char Data=0;
unsigned char M=0x80;
if(col==0 || col==39) //第一列和最后一列不使用
{
DataWrite(Data);
continue;
}
for(k=0;k<8;k++) //分析每个字节应写入的数值
{
if(ADCdata[(col-1)*8+k]==value)
Data|=M;
else
{
char m=0;
if(ADCdata[(col-1)*8+k]<value) //value>当前值 m++
m++;
if(ADCdata[(col-1)*8+k+1]>value)//value<下一值 m--
m--;
if(m==0) //m=0说明value在两值之间,该位应该置一
Data|=M;
}
M=M>>1;
}
DataWrite(Data);
}
}
CS=1;
}
void ADDA()
{
ADDASetUp(); //设置
Clear(0,240);
DrawScale();
//界面
Udprintf(0,192," 16KHz 0mv 钬 ");
putufig(10,192,TriggerValue,4,1,' ');
dprintf(0,208,"采样频率 触发电平 触发 退出");
dprintf(0,224,"柽2 刍2 芗 兦 模式 实验");
if(ADDAParaList[0]==0)
;//显示正弦波
if(ADDAParaList[0]==1)
;//显示梯形波
ADC0_Init(); //AD初始化
AD_T3_INIT(); //T3初始化,驱动AD
EIE2|=0x02; //开ADC0中断
while(1)
{
if(CheckKeyF==1) //键盘检测
{
CheckKey();
CheckKeyF=0;
}
if(Key[0].pressed==1) //检测到*2键
{
if(ADDAParaList[6]<64)
{
unsigned int T3Value;
ADDAParaList[6]*=2;
T3Value=0xFFFF-(unsigned int)22118/ADDAParaList[6];
SFRPAGE = TMR3_PAGE;
TR3=0;
TMR3L=T3Value;
TMR3H=T3Value>>8;
RCAP3L=TMR3L;
RCAP3H=TMR3H;
TR3=1;
SFRPAGE = CONFIG_PAGE;
putufig(1,192,ADDAParaList[6],2,1,' ');
}
Key[0].pressed=0;
}
if(Key[1].pressed==1) //检测到/2键
{
if(ADDAParaList[6]>2)
{
unsigned int T3Value;
ADDAParaList[6]/=2;
T3Value=0xFFFF-(unsigned int)22118/ADDAParaList[6];
SFRPAGE = TMR3_PAGE;
TR3=0;
TMR3L=T3Value;
TMR3H=T3Value>>8;
RCAP3L=TMR3L;
RCAP3H=TMR3H;
TR3=1;
SFRPAGE = CONFIG_PAGE;
putufig(1,192,ADDAParaList[6],2,1,' ');
}
Key[1].pressed=0;
}
if(Key[2].pressed==1) //提高触发电平
{
Key[2].pressed=0;
if(TriggerValue<3000) //触发值0~3000mv
{
TriggerValue+=100; //步长100mv
//调整TriggerValue对应的ADC值 (TriggerValue/3000mv*(1.5v/2.4v*4096))
ADH_TriggerValue=((unsigned long)TriggerValue*64/75)>>4;
ADL_TriggerValue=((unsigned long)TriggerValue*64/75)<<4;
Clear(240+14,240+176);
DrawScale();
putufig(10,192,TriggerValue,4,1,' ');
}
}
if(Key[3].pressed==1) //降低触发电平
{
Key[3].pressed=0;
if(TriggerValue>0)
{
TriggerValue-=100;
ADH_TriggerValue=((unsigned long)TriggerValue*64/75)>>4;
ADL_TriggerValue=((unsigned long)TriggerValue*64/75)<<4;
Clear(240+14,240+176);
DrawScale();
putufig(10,192,TriggerValue,4,1,' ');
}
}
if(Key[4].pressed==1) //改变触发模式
{
TriggerMode=(++TriggerMode)%3;
if(TriggerMode==0)
Udprintf(21,192,"牲");
if(TriggerMode==1)
Udprintf(21,192,"豇");
if(TriggerMode==2)
Udprintf(21,192,"钬");
Key[4].pressed=0;
}
if(ready==1)
{
DrawGraph();
ready=0;
ADcounter=0;
}
if(Key[7].pressed==1) //检测到退出键
{
char SFRPAGE_SAVE;
SFRPAGE_SAVE=SFRPAGE;
SFRPAGE = DAC0_PAGE; //关DAC
DAC0CN&=0x7f;
SFRPAGE = ADC0_PAGE; //关DAC
ADC0CN&=0x7f;
SFRPAGE = TMR3_PAGE; //关T3
TR3=0;
SFRPAGE = TMR4_PAGE; //关T4
TR4=0;
SFRPAGE=SFRPAGE_SAVE;
ClearKey();
Clear(0,480);
return;
}
}
}
/*
if(ready==1)
{
int i,j;
int p=700;
Clear(16,176);
for(i=0;i<700;i++) //每次选择零点为显示起始点,找不到零点则显示后300个点
{
if(ADCdata[i]==0 && ADCdata[i+1]>0 && ADCdata[i+2]>0)
{
p=i;
break;
}
}
for(i=1;i<300;i++)
{
if(ADCdata[p+i]==ADCdata[p+i-1])
Point(10+i,176-ADCdata[p+i]);
if(ADCdata[p+i]<ADCdata[p+i-1])
{
for(j=ADCdata[p+i-1]-1;j>=ADCdata[p+i];j--)
Point(10+i,176-j);
}
if(ADCdata[p+i]>ADCdata[p+i-1])
{
for(j=ADCdata[p+i-1]+1;j<=ADCdata[p+i];j++)
Point(10+i,176-j);
}
}
ready=0;
ADcounter=0;
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -