distm.c
来自「一个分选系统的软件:用SmallRtos操作系统」· C语言 代码 · 共 852 行 · 第 1/2 页
C
852 行
/**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: distm.c
**创 建 人: 曾银玲
**最后修改日期: 2004年4月3日
**描 述: distm源代码。
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 曾银玲
** 版 本: V1。0
** 日 期: 2004年2月22日
** 描 述: 原始版本
**------------------------------------------------------------------------------------------------------
** 修改人: 曾银玲
** 版 本: V1.0
** 日 期: 2004年7月2日
** 描 述: 根据新版本要求修改
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
//#include <absacc.h>
//#include <reg51.h>
//#include <intrins.h>
//#include <string.h>
//#include <stdio.h>
#define IN_DISTM
#include "config.h"
main()
{
init();
TR0=1;
TR1=1;
OSStart();
}
void init(void)
{uint8 k;
init52();
init_12887();
//init_16550();
selct_page_addr();
sp=&ram0;
sp0=&ram1;
for(k=0;k<0x108;k++){
*(sp+k)=0x00;}
for(k=0;k<0x108;k++){
*(sp0+k)=0x00;}
head00_over=0;head01_over=0;head02_over=0;
}
/*********************************************************************************************************
** 函数名称: TaskPICK
** 功能描述: PICK
** 输 入: 无
** 输 出: 无
** 全局变量: AdBuf Cell
** 调用模块: midst OSWait
**
** 作 者: 曾银玲
** 日 期: 2004年4月28日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void TaskPick(void)
{
uint8 i,j,k;
cj_50hz();
cj_6k();
anly_50hz(0);
andata00=mdtra;
anly_50hz(8);
andata01=mdtra;
anly_6k(16);
out_xdata=mdtra;
i=andata00^andata10;
j=andata01^andata11;
k=out_xdata^old_out;
if(i!=0){
memdata[cjtemp]=andata00;
memdata[cjtemp+1]=0x66;
cjtemp+=2;
storage();
andata10=andata00;}
if(j!=0){
memdata[cjtemp]=andata01;
memdata[cjtemp+1]=0x77;
cjtemp+=2;
storage();
andata11=andata01;}
if(k!=0){
memdata[cjtemp]=out_xdata;
memdata[cjtemp+1]=0x88;
cjtemp+=2;
storage();}
//old_out=out_xdata;}
}
void TaskTrans_x1x2(void)
{
uint8 temp0,temp1,i,j,highbyte,lowbyte;
uint16 condat0;
temp0=out_xdata&0x03;
temp1=old_out&0x03;
//temp2=out_xdata&0x30;//2004/10/9
//temp3=out_xdata&0xc0;//2004/10/9
i=temp0^temp1;
if((i!=0)||(time_2s==1)){time_2s=0;
while(!trans_over){}
SBUF=0xfc;trans_over=0;
while(!trans_over){}
SBUF=0x33;trans_over=0;
if(((out_xdata&0x03)==0x01)&&((out_xdata&0xf0)==0x00)){//2004/10/09
//if((out_xdata&0x03)==0x01){
tx[0]=0x44;
tx[1]=0x55;
tx[2]=0x66;
pbuf=&tx[0];
condat0=getcrccode(pbuf,3);
lowbyte=condat0&0x00ff;
highbyte=condat0>>8;
tx[3]=lowbyte;
tx[4]=highbyte;
for(j=0;j<5;j++){
while(!trans_over){}
SBUF=tx[j];trans_over=0;}}
if(((out_xdata&0x03)==0x02)&&((out_xdata&0xf0)==0x00)){//2004/10/09
//if((out_xdata&0x03)==0x02){
tx[0]=0x77;
tx[1]=0x88;
tx[2]=0x99;
pbuf=&tx[0];
condat0=getcrccode(pbuf,3);
lowbyte=condat0&0x00ff;
highbyte=condat0>>8;
tx[3]=lowbyte;
tx[4]=highbyte;
for(j=0;j<5;j++){
while(!trans_over){}
SBUF=tx[j];trans_over=0;}}
if((out_xdata&0x03)==0x00){
tx[0]=0xaa;
tx[1]=0xbb;
tx[2]=0xcc;
pbuf=&tx[0];
condat0=getcrccode(pbuf,3);
lowbyte=condat0&0x00ff;
highbyte=condat0>>8;
tx[3]=lowbyte;
tx[4]=highbyte;
for(j=0;j<5;j++){
while(!trans_over){}
SBUF=tx[j];trans_over=0;}}
old_out=out_xdata;
while(!trans_over){}
SBUF=out_xdata;trans_over=0;
}
}
void TaskD(void)
{uint8 j;
while (1)
{
if((out_xdata&0x30)==0x30){ //有问题040809,已修改041122
if((wave00==1)&&((out_xdata&0x01)==0x01)){alarm=1;}
else{alarm=0;}}
else if((out_xdata&0xc0)==0xc0){
if((wave01==1)&&((out_xdata&0x02)==0x02)){alarm=1;}
else{alarm=0;}}
j=clear;
}
}
void TaskE(void)
{
while (1)
{
OSWait(K_TMO,(50*OS_TICKS_PER_SEC)/1000);
}
}
void TaskF(void)
{
while (1)
{
OSWait(K_TMO,(50*OS_TICKS_PER_SEC)/1000);
}
}
/*void storage(void)
{ uchar i,j;
//sp=&ram0;
j=cjtemp+6;
read_date();
read_time();
memdata[cjtemp]=date[0];
memdata[cjtemp+1]=date[1];
memdata[cjtemp+2]=date[2];
memdata[cjtemp+3]=date[3];
memdata[cjtemp+4]=date[4];
memdata[cjtemp+5]=date[5];
for(i=0;i<j;i++){
*(sp+num_in)=memdata[i];num_in++;
if(num_in>0xff){
bytes_write(0xff);
num_in=0;
sp=&ram0;}
}
cjtemp=0;//variable=0;//04/10/18
}
uint code crcCcittTable[16] =
{
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
};*/
int16 getcrccode(uint8 *point0,uint8 lenth);
int16 getcrccode(uint8 *p0,uint8 ilen)
{ uint16 i,j,crc=0;
for(i=0;i<ilen;i++)
{ j=(crc>>8)^(*(p0+i));
crc=(crc<<8)^crcCcittTable[j];
}
return (crc);
}
void init_16550(void)
{
//MR=1;
MR=0;
UARTLCR=0x80; //bound 80
UARTRBR=tab[1];
UARTIER=0; //0
UARTLCR=0x0b; //8,n,1 0x0b:odd,0x1b:even
UARTIER=0x05;
ACC=UARTLSR;
ACC=UARTRBR;
ACC=UARTRBR;
re_start=0;
}
void init_12887(void)
{
uint8 i;
//i=RTIMED;
RTIMEA=0x20;//分频复位70h
RTIMEB=0x8a;//停止更新,选BCD码,24小时制
// RTIME0=30;
RTIME1=0xff;//XBYTE[0XFF00]=0x24;
//RTIME2=0x33;
RTIME3=0xff;
//RTIME4=0x10;
RTIME5=0xff;
//RTIME7=0x03;RTIME8=0x05;RTIME9=0x04;
RTIMEA=0x29;//打开晶振并允许RTC计时
RTIMEB=0x0a;//每秒计时走一次,24小时制
i=RTIMEC;
i=RTIMED;
}
void write_12887(void)
{uint8 i;
//P13=0;
i=RTIMED;//0x80 formal 0x00 lithium battery use up
RTIMEA=0x20;
RTIMEB=0x8a;
RTIME0=date[5];
RTIME2=date[4];
RTIME4=date[3];
RTIME7=date[2];
RTIME8=date[1];
RTIME9=date[0];
RTIMEB=0x0a;
RTIMEA=0x29;
i=RTIMEC;
}
void read_time(void)
{uint8 i;//,temp0,temp1,temp2;
do{i=RTIMEA;} while((i&0x80)==0x80);//RTIMEA==00 oprate valid
date[5]=RTIME0;date[4]=RTIME2;date[3]=RTIME4;
//date[2]=RTIME7;date[1]=RTIME8;date[0]=RTIME9;
//temp0=date[5];
//disp[0]=temp0&0x0f;
//disp[1]=(temp0&0xf0)>>4;
//temp1=date[4];disp[2]=temp1&0x0f;disp[3]=(temp1&0xf0)>>4;
//temp2=date[3];disp[4]=temp2&0x0f;disp[5]=(temp2&0xf0)>>4;
//display();
}
void read_date(void)
{uint8 i;//,temp0,temp1,temp2;
do{i=RTIMEA;} while((i&0x80)==0x80);
date[2]=RTIME7;date[1]=RTIME8;date[0]=RTIME9;
//temp0=date[2];disp[0]=temp0&0x0f;disp[1]=(temp0&0xf0)>>4;
//temp1=date[1];disp[2]=temp1&0x0f;disp[3]=(temp1&0xf0)>>4;
//temp2=date[0];disp[4]=temp2&0x0f;disp[5]=(temp2&0xf0)>>4;//+0x80;
//display();
}
uint8 BCD_D(uint8 bcd)
{
return(((bcd&0xf0)>>4)*10+(bcd&0x0f));
}
//uchar D_BCD(uchar d)
//{
// return(((d/10)<<4)+(d-(d/10)*10));
//}
void init52(void)
{
IE=0xb3;//EA ET2 ES ET0 EX0
TMOD=0x21;// 16 bit timer and bound = mode 2
TCON=0x01;//negative trigger interrupt0
PCON=0x00;//0x80 bound double
SCON=0xd0;//50 8,n,1 parity:odd or even
TH1=tab[0];
TL1=tab[0];
TH0=0xff;// FFc2H 7.4khz ffbf 7khz
TL0=0xb3;//ffb4 6khz ff7d 3.5khz
TR0=1;
//TH2=0xff;// FFc2H 7.4khz ffbf 7khz
//TL2=0xb3;//ffb4 6khz ff7d 3.5khz
//TR2=1;
TR1=1;
//P13=1;
trans_over=1;
}
void delay(uint16 t)
{uint16 i;//t=1 40us
for(i=0;i<t;i++)_nop_();
for(i=0;i<t;i++)_nop_();
}
void eerom_start(void)
{
CS0=1; _nop_();
SCK=1; _nop_();
CS0=0; _nop_();
}
void spi_writebits(uint8 byte,uint8 num_of_bits)
{//SK上升沿数据有效
uint8 count;
byte=byte<<(8-num_of_bits);
for(count=0;count<num_of_bits;count++){
SCK=0;_nop_();_nop_();
byte<<=1;_nop_();_nop_();
SIN=CY;_nop_();_nop_();
SCK=1;_nop_();_nop_();}
}
uint8 spi_readbyte()
{//SK下降沿数据有效
uint8 count,byte;
for(count=0;count<8;count++){
SCK=1;_nop_();_nop_();
SCK=0;_nop_();_nop_();
byte<<=1;
if(SO){byte++;}
//byte<<=1;
_nop_();_nop_();}
return (byte);
}
void buffer1write(uint16 len,uint16 start_addr)
{uint16 i;
uint8 m;
eerom_start();
spi_writebits(0x84,8);
spi_writebits(0x00,8);
spi_writebits(0x00,7);
//spi_writebits(0x00,8);
spi_writebits((uint8)(start_addr>>8),1);
spi_writebits((uint8)(start_addr),8);
for(i=0;i<len;i++)
{
m=*(sp+i);
spi_writebits(*(sp+i),8);}
spi_writebits(mon>>8,8);
spi_writebits((uint8)(mon),8);
CS0=1;
}
void buffer1topageprogerase(uint16 page)
{//uint i;
eerom_start();
spi_writebits(0x83,8);
spi_writebits(0x00,3);
spi_writebits((uint8)(page>>8),4);
spi_writebits((uint8)(page),8);
spi_writebits(0x00,4);
spi_writebits(0x00,5);
CS0=1;
}
void buffer2_read(uint16 len,uint16 byteaddr)
{
uint8 m;
uint16 i;
//k=len+1;
eerom_start();
spi_writebits(0x56,8);
spi_writebits(0x00,8);
spi_writebits(0x00,7);
spi_writebits((uint8)(byteaddr>>8),1);
spi_writebits((uint8)(byteaddr),8);
spi_writebits(0x00,8);
//spi_writebits(0x00,8);//多这一行每次丢失一字节
for(i=0;i<len;i++)
{
m=spi_readbyte();
*(sp0+i)=m;
//_nop_();//04423
//_nop_();
}
CS0=1;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?