📄 main.c
字号:
#include <includes.h>
#include <ctype.h>
#include <aultdef.h>
#include <i2c.h>
#include <hhh16.h>
#include <chatfont.h>
#include <sed1330.h>
#include <8253.h>
#define KCREETRANT reentrant
void sys_init(void *lcnpdata) reentrant;
void mysecondtask(void *lcndata) reentrant;
void main1test(void *lcnpdata) KCREETRANT;
void gettesttype(void *lcnpdata) KCREETRANT;
void lcngetkey(void *lcnpdata) reentrant;
void getcurvault() reentrant;
void getstr8255() reentrant;
OS_STK sys_init_Stk[MaxStkSize];
OS_STK mysecondtask_Stk[MaxStkSize];
OS_STK lcngetkey_Stk[MaxStkSize];
OS_STK main1test_Stk[MaxStkSize];
OS_STK gettesttype_Stk[MaxStkSize];
void init_serial() reentrant
{
PCON &= 0x7F;
TH1 = 0xFD;
TMOD |= 0X20; //定时器1方式2
SCON = 0X50; //允许接收
TR1 = 1; //启动定时器1
ES = 1; //串行口中断允许
}
//串口中断处理
void serial() reentrant
{
if(RI)
{
RI = 0;
rs485in = SBUF;
}
else
{
TI = 0;
if(bout485 > 0)
{
SBUF = rs485out;
bout485 = 0;
}
else
{
RS485 = 1;
}
}
}
unsigned int advaut; //AD574采样中间数值
void getad() reentrant
{
unsigned char i,tempcl;
unsigned int tempch;
advaut=0;
for(i=0;i<16;i++)
{
ADCOM=0; //启动AD转换
adbusy=1;
tempcl=200;
while(tempcl&&adbusy)
{
tempcl++;
}
tempch=(unsigned int)ADHI;
tempcl=ADLO;
advaut+=(tempch*16+(unsigned int)(tempcl/16));
}
advaut/=16;
}
unsigned char gettimestr(unsigned int x,unsigned char y,unsigned char nu,unsigned char bdate) reentrant
{
unsigned char tem;
keystaut=0;
rectangle(SAD2,x-1,y,x+nu*8,y+16,1);
tem=0;
OSSemPend(KeySem,0,&lcnerr);
if(key==ESC||key==ENTER)
{
rectangle(SAD2,x-1,y,x+nu*8,y+16,0);
return(0);
}
for(tem=0;tem<nu;tem++)
disstr[tem]=' ';
if(bdate)
{
disstr[2]='.';
disstr[5]='.';
}
else
{
disstr[2]=':';
disstr[5]=':';
}
disstr[tem]=0;
tem=0;
while(tem<nu)
{
if(isdigit(key))
{
disstr[tem]=key;
myprintf(SAD1,TA_LEFT,x,y,disstr);
tem++;
if(tem==2||tem==5)
tem++;
}
else
{
switch(key)
{
case ENTER:
keystaut=0;
rectangle(SAD2,x-1,y,x+nu*8,y+16,0);
return(1);
default:
break;
}
}
if(tem<nu)
OSSemPend(KeySem,0,&lcnerr);
}
rectangle(SAD2,x-1,y,x+nu*8,y+16,0);
keystaut=0;
return(1);
}
unsigned char getstrnumber(unsigned int x,unsigned char y,unsigned char nu) reentrant
{
unsigned char tem;
keystaut=0;
linex(SAD1,y+16,x-1,x+nu*8);
tem=0;
OSSemPend(KeySem,0,&lcnerr);
if(key==ESC||key==ENTER)
{
rectangle(SAD1,x-1,y+15,x+nu*8,y+16,0);
return(0);
}
for(tem=0;tem<nu;tem++)
disstr[tem]=' ';
disstr[tem]=0;
tem=0;
while(tem<nu)
{
if(isdigit(key))
{
disstr[tem]=key;
myprintf(SAD1,TA_LEFT,x,y,disstr);
tem++;
}
else
{
switch(key)
{
case ENTER:
keystaut=0;
rectangle(SAD1,x-1,y,x+nu*8,y+16,0);
myprintf(SAD1,TA_LEFT,x,y,disstr);
return(1);
case ESC:
if(tem>0)
tem--;
disstr[tem]=' ';
myprintf(SAD1,TA_LEFT,x,y,disstr);
disstr[tem]=0;
break;
default:
break;
}
}
if(tem<nu)
OSSemPend(KeySem,0,&lcnerr);
}
keystaut=0;
rectangle(SAD1,x-1,y,x+nu*8,y+16,0);
myprintf(SAD1,TA_LEFT,x,y,disstr);
return(1);
}
unsigned char getstr(unsigned int x,unsigned char y,unsigned char nu) reentrant
{
unsigned char tem;
keystaut=0;
rectangle(SAD2,x-1,y,x+nu*8+8,y+16,1);
myprintf(SAD1,TA_LEFT,x+nu*8,y,"v");
tem=0;
OSSemPend(KeySem,0,&lcnerr);
if(key==ESC||key==ENTER)
{
myprintf(SAD1,TA_LEFT,x+nu*8,y," ");
rectangle(SAD2,x-1,y,x+nu*8+8,y+16,0);
return(0);
}
for(tem=0;tem<nu;tem++)
disstr[tem]=' ';
disstr[tem]=0;
tem=0;
myprintf(SAD1,TA_LEFT,x+nu*8,y,"v");
while(tem<nu)
{
if(isprint(key))
{
disstr[tem]=key;
myprintf(SAD1,TA_LEFT,x,y,disstr);
tem++;
}
else
{
switch(key)
{
case ENTER:
keystaut=0;
rectangle(SAD2,x-1,y,x+nu*8+8,y+16,0);
myprintf(SAD1,TA_LEFT,x+nu*8,y," ");
return(1);
case LEFT:
keystaut=24;
myprintf(SAD1,TA_LEFT,x+nu*8,y,"<");
break;
case UP:
keystaut=48;
myprintf(SAD1,TA_LEFT,x+nu*8,y,"^");
break;
case RIGHT:
keystaut=72;
myprintf(SAD1,TA_LEFT,x+nu*8,y,">");
break;
case DOWN:
keystaut=0;
myprintf(SAD1,TA_LEFT,x+nu*8,y,"v");
break;
case ESC:
if(tem>0)
tem--;
disstr[tem]=' ';
myprintf(SAD1,TA_LEFT,x,y,disstr);
disstr[tem]=0;
break;
default:
break;
}
}
if(tem<nu)
OSSemPend(KeySem,0,&lcnerr);
}
rectangle(SAD2,x-1,y,x+nu*8+8,y+16,0);
myprintf(SAD1,TA_LEFT,x+nu*8,y," ");
keystaut=0;
return(1);
}
//输入系统时间及网络信息
void setsysini() reentrant
{
unsigned char tem;
clssed(SAD1);
clssed(SAD2);
linex(SAD1,60,70,250);
linex(SAD1,80,70,250);
linex(SAD1,122,70,250);
liney(SAD1,70,60,122);
liney(SAD1,250,60,122);
myprintf(SAD1,TA_CENTER,160,62,"系统时钟设定");
myprintf(SAD1,TA_LEFT,90,85,"当前日期:");
myprintf(SAD1,TA_LEFT,90,104,"当前时间:");
readtimer(disstr,1);
myprintf(SAD1,TA_LEFT,165,85,disstr);
readtimer(disstr,0);
myprintf(SAD1,TA_LEFT,165,104,disstr);
rectangle(SAD2,90,83,160,101,1);
tem=0;
while(1)
{
OSSemPend(KeySem,0,&lcnerr);
if(key==INPUT)//输入键
{
switch(tem)
{
case 0:
if(gettimestr(165,84+tem*19,8,1))
settimer(disstr,1);
break;
case 1:
if(gettimestr(165,84+tem*19,8,0))
settimer(disstr,0);
break;
default:
break;
}
}
else
{
if(key==UP||key==DOWN)//上下方向键
{
if(key==DOWN)
{
rectangle(SAD2,90,83+tem*19,160,101+tem*19,0);
if(tem<1)
tem++;
else
tem=0;
rectangle(SAD2,90,83+tem*19,160,101+tem*19,1);
}
else
{
rectangle(SAD2,90,83+tem*19,160,101+tem*19,0);
if(tem>0)
tem--;
else
tem=1;
rectangle(SAD2,90,83+tem*19,160,101+tem*19,1);
}
}
else
{
if(key==ENTER)
{
return;
}
else
{
if(key==ESC)
return;
}
}
}
}
}
void showlogo() reentrant
{
unsigned char lcncount;
xdata union {unsigned int add;
struct {unsigned char addhi;unsigned char addlo;}addhalf;
}curadd;
curadd.add=SAD3;
LCDORDER=0X46; /*设置光标地址*/
LCDDATA=curadd.addhalf.addlo;
LCDDATA=curadd.addhalf.addhi;
LCDORDER=0X4C;
LCDORDER=0X42;
curadd.add=0;
while(curadd.add<sizeof(Bmp015))
{
if(Bmp015[curadd.add]==0)
{
curadd.add++;
lcncount=Bmp015[curadd.add];
while(lcncount)
{
LCDDATA=0;
lcncount--;
}
curadd.add++;
}
else
{
LCDDATA=Bmp015[curadd.add];
curadd.add++;
}
}
}
//系统初始化
void sys_init(void *lcnpdata) reentrant
{
unsigned char tem,tem1;
lcnpdata = lcnpdata;
ADNUMBER1 = 1;
ADNUMBER2 = 1;
ADNUMBER3 = 1;
//8279和SED1330初始化
COM8279=0xd1; //总清除命令160us
initlcd();
showlogo();
clssed(SAD1);
clssed(SAD2);
COM8279=0x08;COM8279=0x32; //键盘,显示方式,时钟分频
initcount();
if(onpower!=0x55)
{
keytype=0;
onpower=0x55;
}
tem = 0x55;
for(tem1=0;tem1<10;tem1++)
{
Writei2c(&tem,tem1+160,1);
}
for(tem1=0;tem1<10;tem1++)
{
Readi2c(&tem,tem1+160,1);
if(tem != 0x55)
ok24c02 = 0;
}
//创建键盘信号量
KeySem=OSSemCreate(0);
tem=0x81;//1024
Writei2ctime(&tem,0x0D,0x01);
#if OS_TASK_STAT_EN
OSStatInit();
#endif
OSTaskCreate(mysecondtask, (void *)0, &mysecondtask_Stk[0],3);
OSTaskCreate(lcngetkey, (void *)0, &lcngetkey_Stk[0],4);
OSTaskCreate(gettesttype, (void *)0, &gettesttype_Stk[0],5);
init_serial();
//消除警告
OSVersion();
OSTaskDelReq(OS_PRIO_SELF);
//消除警告
OSTaskDel(OS_PRIO_SELF);
}
void gettesttype(void *lcnpdata) KCREETRANT
{
unsigned char lastselect = 0;
unsigned char tem = 0;
lcnpdata = lcnpdata;
clssed(SAD1);
clssed(SAD2);
linex(SAD1,39,48,270);
myprintf(SAD1,TA_CENTER,160,20,"通用板系统调试程序");
myprintf(SAD1,TA_CENTER,160,90, "用18键通用键盘");
myprintf(SAD1,TA_CENTER,160,120,"用20键通用键盘");
myprintf(SAD1,TA_CENTER,160,200,"唐山百川智能机器有限公司");
rectangle(SAD2,0,222,319,239,1);
readtimer(disstr,1);
myprintf(SAD1,TA_LEFT,186,223,disstr);
myprintf(SAD1,TA_LEFT,2,223,"按键选择键盘");
lastselect = keytype;
rectangle(SAD2,103,88+lastselect*30,217,108+lastselect*30,1);
LCDORDER=0X59;
LCDDATA=0X14;
while(1)
{
OSSemPend(KeySem,2,&lcnerr);
if(lcnerr==OS_NO_ERR)
{
rectangle(SAD2,103,88+lastselect*30,217,108+lastselect*30,0);
if(lastselect > 0)
{
keytype = 0;
lastselect = 0;
}
else
{
keytype = 1;
lastselect = 1;
}
rectangle(SAD2,103,88+lastselect*30,217,108+lastselect*30,1);
}
if(bSecond)
{
tem++;
if(tem > 4)
{
OSTaskCreate(main1test, (void *)0, &main1test_Stk[0],6);
OSTaskDel(OS_PRIO_SELF);
}
bSecond=0;
readtimer(disstr,0);
myprintf(SAD1,TA_LEFT,254,223,disstr);
}
}
}
void lcngetkey(void *lcnpdata) reentrant
{
unsigned char k;
unsigned char newkey = 1;
lcnpdata=lcnpdata;
while(1)
{
OSTimeDly(OS_TICKS_PER_SEC/10);
if(COM8279 & 0x0f)
{
if(newkey)
{
if(COM8279 & 0x0f)
{
COM8279=0x50; //读FIFO命令自动地址增量
k=DAT8279;
k=k&0x1f; //取键盘数据低5位(32位键盘模式)
if(keytype == 0)
{
key=keytab18[k+keystaut];
}
else
{
key=keytab20[k+keystaut];
}
keyinterrupt = 0;
OSSemPost(KeySem);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -