📄 main.c
字号:
{
arr[0]=8;
OSQPost(ReMsgQeue,(void*)arr);
}
if(key==4)
{
arr[0]=4;
dangqian++;
if(dangqian==4)dangqian=0;
OSQPost(ReMsgQeue,(void*)arr);
}
break;
case 4:
if(key==3)
{
OS_ENTER_CRITICAL();
zhouqi=Dispnum[0]*1000+Dispnum[1]*100+Dispnum[2]*10+Dispnum[3];
dianshu=Dispnum1[0]*100+Dispnum1[1]*10+Dispnum1[2];
OS_EXIT_CRITICAL();
cond[0]=zhouqi;
cond[1]=dianshu;
//if((zhouqi%10)==0)
OSTaskCreate (TaskDelaySamp,(void *)cond, &TaskDelaySampStk[TaskStkLengh - 1], 6); //创建延时采样任务
//if((zhouqi%10)!=0)
//OSTaskCreate (TaskIntSamp,(void *)cond, &TaskIntSampStk[TaskStkLengh - 1], 5); //创建定时采样任务
}
if(key==4)
{
arr[0]=4;
dangqian++;
if(dangqian==4)dangqian=0;
OSQPost(ReMsgQeue,(void*)arr);
}
break;
}
OSTimeDly(2);
}
}
/*********************************************************************************************************
** Task0 任务0
** 功能:使用ZLG/GUI,在屏幕上同时显示多个"Hello ZLG/GUI!"字符串
********************************************************************************************************/
void TaskDisp(void *pdata)
{
uint8 i,err,Index=0,xiougai=0,clr=0,dangqian=0,x=0,y;
uint8 coord=0,coord1=7; //显示x的坐标为0
uint8 *pt;
uint8 shuz=0;
pdata = pdata;
Dispnum[0]=0;
Dispnum[1]=1;
Dispnum[2]=0;
Dispnum[3]=0;
Dispnum1[0]=1;
Dispnum1[1]=0;
Dispnum1[2]=0;
GUI_LoadPic1(0,0,*(num+Dispnum[0]),5,8);
for(i=1;i<4;i++)
GUI_LoadPic(5*i,0,*(num+Dispnum[i]),5,8);
for(i=0;i<3;i++)
GUI_LoadPic(5*i+30,0,*(num+Dispnum1[i]),5,8);
GUI_LoadPic1(0,45,*(hanzi+0),24,14);
for(i=1;i<4;i++)
GUI_LoadPic(32*i,45,*(hanzi+i),24,14);
while (1)
{
pt=(uint8*)OSQPend(ReMsgQeue,0,&err); //等待一条短消息
switch(pt[0])
{
case 1:
Dispnum[coord]=pt[1];
break;
case 2:
coord++;
if(coord==4)coord=0;
break;
case 3:
if(pt[1])
coord=0;
else
coord=7;
break;
case 4:
dangqian++;
if(dangqian==4)dangqian=0;
break;
case 5:
Dispnum1[coord1]=pt[1];
break;
case 6:
coord1++;
if(coord1==4)coord1=0;
break;
case 7:
if(pt[1])
coord1=0;
else
coord1=7;
break;
case 8:
clr=1;
break;
case 9:
if(pt[1]==0xff)
x=0;
else
{
y=pt[1];
GUI_Point(x,y,1);
x++;
}
break;
default:
break;
}
if(!clr)
{
for(i=0;i<4;i++)
{
if(i==coord)
GUI_LoadPic1(5*i,0,*(num+Dispnum[i]),5,8);
else
GUI_LoadPic(5*i,0,*(num+Dispnum[i]),5,8);
}
for(i=0;i<4;i++)
{
if(i==dangqian)
GUI_LoadPic1(32*i,45,*(hanzi+i),24,14);
else
GUI_LoadPic(32*i,45,*(hanzi+i),24,14);
}
for(i=0;i<3;i++)
{
if(i==coord1)
GUI_LoadPic1(5*i+30,0,*(num+Dispnum1[i]),5,8);
else
GUI_LoadPic(5*i+30,0,*(num+Dispnum1[i]),5,8);
}
}
else
{
GUI_ClearSCR();
clr=0;
}
}
}
/*********************************************************************************************************
** DelaySamp采样任务优先级为6
********************************************************************************************************/
void TaskDelaySamp(void *pdata)
{
uint8 samp[4],err;
uint32 ADC_Data,i;
uint16 zhouqi,dianshu,*pt;
pt=(uint16*)pdata;
zhouqi=pt[0];
dianshu=pt[1];
samp[0]= 9;
samp[1]= 0xff;
OSQPost(ReMsgQeue,(void*)samp);
OSTimeDly(1);
OSMutexPend(sem,0,&err);
IO0CLR=LED1|LED2|LED3; // 采样开始
for(i=1;i<dianshu;i++)
{
ADC_Data = ADDR; // 读取ADC结果,并清除DONE标志位
ADCR|=(1 << 24);
while((ADDR&0x80000000)==0);
ADCR|=(1 << 24);
while ((ADDR & 0x80000000) == 0);
ADC_Data = ADDR;
ADC_Data = (ADC_Data >> 6) & 0x3ff;
ADC_Data = ADC_Data *2480/1024;
ADC_Data = 62-ADC_Data*62/2480;
samp1[i] = (uint8)ADC_Data;
samp[1] = samp1[i];
OSQPost(ReMsgQeue,(void*)samp);
OSTimeDly(zhouqi/10);
}
OSMutexPost(sem);
IO0SET=LED1|LED2|LED3; //结束采样
OSTaskDel(OS_PRIO_SELF);
}
void show(uint32 *a,uint32 n)
{
uint16 i;
GUI_ClearSCR();
for(i=0;i<n;i++)
{
GUI_Point(i,a[i],1);
}
}
/*********************************************************************************************************
** IntSamp采样任务优先级为6
********************************************************************************************************/
void TaskIntSamp(void *pdata)
{
uint8 samp[4],err;
uint16 zhouqi,dianshu,*pt,i;
uint32 Temp;
pt=(uint16*)pdata;
zhouqi=pt[0];
dianshu=pt[1];
//OSMutexPend(sem,0,&err);
samp1[0]=dianshu;
samp[0]= 9;
samp[1]= 0xff;
OSQPost(ReMsgQeue,(void*)samp);
OSTimeDly(1);
/*进行T1定时器模块的设置*/
T1IR = 0xffffffff; // 复位中断源
T1TC = 0; // 定时器设置为0
T1TCR = 0x01; // 使能定时器
T1PR = 0; // 时钟不分频
T1MCR = 0x03; // 设置T0MR0匹配后复位T0TC,并产生中断标志
T1MR0 = zhouqi*(Fpclk/1000); // 设定定时时间
VICIntSelect=0;
Temp=ADDR;
IO0CLR=LED1|LED2|LED3; // 采样开始
MyMbox=OSMboxCreate((void *)0);
VICIntEnable=1<<5;
for(i=1;i<dianshu+1;i++)
{
samp1[i]=*(uint16*)OSMboxPend(MyMbox,0,&err);
samp[1]=(uint8)samp1[i];
OSQPost(ReMsgQeue,(void*)samp);
}
OSMboxDel(MyMbox,OS_DEL_ALWAYS,&err); // 不管有没有等待邮箱的消息,立即删除邮箱
//OSMutexPost(sem);
VICIntEnClr=1<<5;
IO0SET=LED1|LED2|LED3; // 结束采样
OSTaskDel(OS_PRIO_SELF);
}
void Timer1_Exception(void)
{
static uint32 ADC_Data;
OS_ENTER_CRITICAL(); // 关中断
T1IR=0x01; // 清除中断源
VICVectAddr=0; // 通知中断控制器中断结束
ADC_Data = ADDR; // 读取ADC结果,并清除DONE标志位
ADCR|=(1 << 24);
while((ADDR&0x80000000)==0);
ADCR|=(1 << 24);
while ((ADDR & 0x80000000) == 0);
ADC_Data = ADDR;
ADC_Data = (ADC_Data >> 6) & 0x3ff;
ADC_Data =ADC_Data *2480/1024;
ADC_Data =62-ADC_Data*62/2480;
OS_EXIT_CRITICAL(); //开中断
OSMboxPost(MyMbox,(void*)&ADC_Data);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -