📄 oscillograph_v6.c
字号:
GUI_LoadPic((200+16*i),221,*(p7+i),16,16);
for(i=0;i<2;i++) //显示"HZ"
GUI_LoadPic((8*i+280),221,*(p10+i),8,16);
for(i=0;i<2;i++) //显示"倍率"
GUI_LoadPic(16*i,221,*(p8+i),16,16);
GUI_SetColor(RED,DGREEN);
GUI_LoadPic(50,221,X,8,16);//显示"X"
GUI_LoadPic(64,221,*(p9+Bei_Lv),8,16); //显示"数字"
/****************************************************************************/
/*****************************画控制区*******************************************/
GUI_SetColor(BLACK,WHITE);
GUI_RectangleFill(4,164,56,196,WHITE);
for(i=0;i<2;i++) //显示"停止"
GUI_LoadPic(8+16*i,168,*(p11+i),16,16);
GUI_SetColor(WHITE,BLACK);
GUI_RectangleFill(4,124,56,156,WHITE);
for(i=0;i<2;i++) //显示"开始"
GUI_LoadPic(8+16*i,128,*(p12+i),16,16);
GUI_SetColor(BLACK,WHITE);
GUI_RectangleFill(4,84,56,116,WHITE);
for(i=0;i<2;i++) //显示"清屏"
GUI_LoadPic(8+16*i,88,*(p13+i),16,16);
GUI_RectangleFill(4,44,56,76,WHITE);
for(i=0;i<2;i++) //显示"设置"
GUI_LoadPic(8+16*i,48,*(p14+i),16,16);
GUI_SetColor(OLIVE,PURPLE);
for(i=0;i<5;i++) //显示"Tiger"
GUI_LoadPic(10+8*i,10,*(p15+i),8,16);
}
/******************ADC初始化********************************************/
void ADC_Init(void)
{
PINSEL1=PINSEL1&(~(3<<22))|(1<<22); //设置P0.27为AIN0
ADCR= (1<<0) |
((Fpclk/1000000-1)<<8) |
(0<<16) |
(0<<17) |
(1<<21) |
(0<<22) |
(1<<24) |
(0<<27);
}
/*******************************************************************************/
/*****************T1初始化******************************************************/
void T1_Init(void)
{
T1IR=0xFFFFFFFF; //清楚定时器的全部中断标志
T1TC=0x00; //初始化T1
T1PR=0x00; //不分频
T1MCR=0x03; //匹配的时候 产生中断并且复位
T1CCR=T1CCR|(1<<7)|(1<<8); //设置P0.17 为CAP1.2 ,下降沿有效,产生中断
T1MR0=Fpclk/5000; //定时时间为200us
T1TCR=0x01; //启动定时器
}
/*******************************************************************************/
/*************中断服务程序***********************************/
void Timer1_Exception(void)
{
static uint32 Temp;
//void *Temp1=(&Temp);
OS_ENTER_CRITICAL();
if(T1IR&0x01!=0)
{
T1IR=0x01; //清除中断标志
VICVectAddr=0; //通知中断控制器中断结束
/*******************采样程序*******/
Temp=ADDR;
ADCR=(ADCR&0xFFFFFF00)|0x01|(1<<24); //切换通道,并且进行转换
while((ADDR&0x80000000)==0);
ADCR=ADCR|(1<<24);
while((ADDR&0x80000000)==0);
Temp=ADDR;
Temp=(Temp>>6)&0x3FF;
Temp=3300*Temp;
Temp=Temp>>10;
OV++; //计时的周期个数
/**********************************/
ADC_DATA[count]=Temp;
OSMboxPost(Mybox,(void *)&Temp);
}
if(T1IR&(1<<6)!=0)
{
T1IR=0x01; //清除中断标志
VICVectAddr=0; //通知中断控制器中断结束
if(CAP>10)
CAP=0;
else
CAP++;
CAP_Value0=CAP_Value;
CAP_Value=T1CR2; //读取T1CR2中的TC的值
if(CAP_Value>CAP_Value0)
Time_CAP[CAP]=(CAP_Value-CAP_Value0)*OV; //计算捕获的间隔时间
else
Time_CAP[CAP]=(CAP_Value0-CAP_Value)*OV; //计算捕获的间隔时间
OV=0; //清除计时的周期个数
}
OS_EXIT_CRITICAL();
}
/*************计算采样平均值程序***********************************/
void AVG_CAL(uint32 *Data)
{
uint32 i;
uint32 Begin=0; //循环的初始值
uint32 AVG[4]={0}; //存放计算平均值的中间结果
for(i=0;i<4;i++)
{
Begin=i*65;
for(COU=Begin;COU<(Begin+65);COU++)
AVG[i]=ADC_DATA[COU]+AVG[i];
}
ADC_DATA_AVG=AVG[0]+AVG[1]+AVG[2]+AVG[3];
ADC_DATA_AVG=ADC_DATA_AVG/260;
}
/*************计算捕获平均值程序***********************************/
void CAP_AVG_CAL(void)
{
uint32 i;
uint32 CAP_AVG=0; //存放计算平均值的中间结果
for(i=0;i<10;i++)
{
CAP_AVG=Time_CAP[i]+CAP_AVG;
}
CAP_AVG=CAP_AVG/10;
CAP_AVG=(CAP_AVG*1000)/Fpclk; //计算周期(ms)
}
/***********************显示 捕获平均值 液晶屏幕 *********************************/
void CAP_AVG_Display(void)
{
uint32 i;
uint8 num[4]={0};
CAP_AVG_CAL(); //计算平均值
num[0]=CAP_AVG/1000;
num[1]=(CAP_AVG%1000)/100;
num[2]=(CAP_AVG%100)/10;
num[3]=CAP_AVG%10;
GUI_SetColor(WHITE,DGREEN);
for(i=0;i<4;i++) //显示"平均值的数据"
GUI_LoadPic((8*i+50),201,*(p2+num[i]),8,16);
}
/**************************************************************************/
/************计算 最大值和最小值*************************************/
void Max_Min(void)
{
uint32 i;
Max_ADC=ADC_DATA[0];
Min_ADC=ADC_DATA[0];
for(i=1;i<260;i++)
{
if(ADC_DATA[i]<Min_ADC)
Min_ADC=ADC_DATA[i];
if(ADC_DATA[i]>Max_ADC)
Max_ADC=ADC_DATA[i];
}
}
/***********************显示 最大值 最小值 *********************************/
void Max_Min_Display(void)
{
uint32 i;
uint8 num[4]={0};
Max_Min(); //计算平均值
num[0]=Min_ADC/1000;
num[1]=(Min_ADC%1000)/100;
num[2]=(Min_ADC%100)/10;
num[3]=Min_ADC%10;
GUI_SetColor(WHITE,DGREEN);
for(i=0;i<4;i++) //显示"最小值的数据"
GUI_LoadPic((8*i+147),221,*(p2+num[i]),8,16);
//************************************************************/
num[0]=Max_ADC/1000;
num[1]=(Max_ADC%1000)/100;
num[2]=(Max_ADC%100)/10;
num[3]=Max_ADC%10;
GUI_SetColor(WHITE,DGREEN);
for(i=0;i<4;i++) //显示"最小值的数据"
GUI_LoadPic((8*i+147),201,*(p2+num[i]),8,16);
}
/**************************************************************************/
/***********************显示平均值 液晶屏幕 *********************************/
void AVG_Display(void)
{
uint32 i;
uint8 num[4]={0};
AVG_CAL(ADC_DATA); //计算平均值
num[0]=ADC_DATA_AVG/1000;
num[1]=(ADC_DATA_AVG%1000)/100;
num[2]=(ADC_DATA_AVG%100)/10;
num[3]=ADC_DATA_AVG%10;
GUI_SetColor(WHITE,DGREEN);
for(i=0;i<4;i++) //显示"平均值的数据"
GUI_LoadPic((8*i+50),201,*(p2+num[i]),8,16);
}
/**************************************************************************/
/*************************************产生PWM**************************************/
void Cap_Display()
{
}
/*********************************************************************************************************
** Task2 任务2
显示曲线任务
************************************************************************/
void Task2(void *pdata)
{
uint32 i,x,y,xx,yy;
uint32 L=0;
pdata=pdata;
while(1)
{
if(Stop==1)
{
OSTaskSuspend(4); //按下停止按钮的时候,挂起采样任务;
Stop=0;
}
/*******显示曲线******************/
OS_ENTER_CRITICAL();
x=60;
xx=60;
yy=100;
while(x<320)
{
for(i=0;i<260;i++)
{
GUI_RLine(x+1, 0, 200, BLUE);
while(L<200)
{
GUI_Point(x+1, L, YELLOW );
L=L+20;
}
L=0;
if(((x+1)%20)==0)
{
GUI_RLine(x+1, 0, 200,YELLOW);
}
y=100-ADC_DATA[i]*K; //K为电压与格子数的转换系数
//GUI_Point(x,y,BLACK);
x=x+1;
GUI_Line(xx,yy, x,y,BLACK);
xx=x;
yy=y;
}
}
//x=0;
OS_EXIT_CRITICAL();
/*********************************/
OSTimeDly(OS_TICKS_PER_SEC/2);
}
}
/*********************************************************************************************************
** Task1 任务1
中速采样任务
**********************************************************/
void Task1(void *pdata)
{
INT8U err=0;
count=0;
pdata=pdata;
Mybox=OSMboxCreate((void*)0); //创建一个信邮箱
ADC_Init(); //ADC初始化
T1_Init(); //初始化T1
while(1)
{
if(Stop==1)
{
OSTaskSuspend(3); //按下停止按钮的时候,挂起采样任务;
Stop=0;
}
for(count=0;count<260;count++) //从邮箱中读取采样的数据
{
ADC_DATA[count]=*(uint32*)(OSMboxPend(Mybox,0,&err));
}
AVG_Display(); //显示采样的平均值
Max_Min_Display(); //显示采样的最大值以及最小值
Cap_Display(); //显示捕获的 频率 周期
OSTimeDly(OS_TICKS_PER_SEC/2);
}
}
/***************************************************************************************/
/***************************************************************************
* 功 能:键盘的输入任务
* 入口参数:无
* 出口参数:无
****************************************************************************/
void Task0(void *pdata)
{
uint32 KEY0,KEY;
uint32 i;
pdata =pdata;
TargetInit();
while(1)
{
OSTimeDly(4);
KEY0=ZLG7290GetKey();
OSTimeDly(4);
KEY=ZLG7290GetKey();
if((KEY==0)||(KEY>16)||(KEY!=KEY0))
{
OSTimeDly(4);
continue;
}
switch(KEY)
{
case 11:
{
if(Guang_Biao<1)
Guang_Biao=4;
else
Guang_Biao--; //"B"向下移动光标
break;
}
case 16:
{
OK=1;
break;
}
default: break;
}
switch(Guang_Biao)
{
case 2: //唤醒采样 显示 任务
{
GUI_SetColor(BLACK,WHITE); //白地黑子
for(i=0;i<2;i++) //显示"清屏"
GUI_LoadPic(8+16*i,88,*(p13+i),16,16);
GUI_SetColor(WHITE,BLACK); //黑地白字
for(i=0;i<2;i++) //显示"开始"
GUI_LoadPic(8+16*i,128,*(p12+i),16,16);
if(OK==1)
{
OK=0;
OSTaskResume(3); //唤醒采样任务
OSTaskResume(4); //唤醒显示任务
}
break;
}
case 1: //停止
{
GUI_SetColor(BLACK,WHITE); //白地黑字
for(i=0;i<2;i++) //显示"开始"
GUI_LoadPic(8+16*i,128,*(p12+i),16,16);
GUI_SetColor(WHITE,BLACK); //黑地白字
for(i=0;i<2;i++) //显示"停止"
GUI_LoadPic(8+16*i,168,*(p11+i),16,16);
if(OK==1)
{
OK=0;
Stop=1; //停止标志位置1
}
break;
}
case 3: //清屏
{
GUI_SetColor(BLACK,WHITE); //白地黑字
for(i=0;i<2;i++) //显示"设置"
GUI_LoadPic(8+16*i,48,*(p14+i),16,16);
GUI_SetColor(WHITE,BLACK);
for(i=0;i<2;i++) //显示"清屏"
GUI_LoadPic(8+16*i,88,*(p13+i),16,16);
if(OK==1)
{
OK=0;
Stop=1; //清屏的时候终止 采样以及显示任务
Display_Frame();
Guang_Biao=2;
}
break;
}
case 4: //设置
{
GUI_SetColor(BLACK,WHITE); //白地黑字
for(i=0;i<2;i++) //显示"停止"
GUI_LoadPic(8+16*i,168,*(p11+i),16,16);
GUI_SetColor(WHITE,BLACK); //黑地白字
for(i=0;i<2;i++) //显示"设置"
GUI_LoadPic(8+16*i,48,*(p14+i),16,16);
if(OK==1)
{
OK=0;
}
break;
}
default:
break;
}
}
OSTimeDly(OS_TICKS_PER_SEC*4);
}
/****************************************************************************
* 功 能:创建任务
* 入口参数:无
* 出口参数:无
****************************************************************************/
int main(void)
{
OSInit();
//Create_PWM(); //产生PWM波
Display_Frame(); //显示界面的构架
OSTaskCreate(Task0,(void *)0,&TaskStk0[TaskStkLengh-1],8);//按键任务
OSTaskCreate (Task1,(void *)0, &TaskStk1[TaskStkLengh - 1], 3);//中速采样任务
OSTaskCreate (Task2,(void *)0, &TaskStk2[TaskStkLengh - 1], 4);//显示任务
OSStart();
return 0;
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -