📄 0203.c
字号:
#include <hn.h>
void main(void)
{
unsigned char i,j,m;//,/*ssb,*/addcode[4][2];
initial();/*51的初始化*/
lcdinit();/*液晶界面的初始化*/
init554();/*554的初始化*/
if(key==0xf3)modifyclk();
if(key==0xF5)modchedaohao();//系统设置
if(key==0xF4)his_del();
if(key==0xF1)help();
keyfinish=0;feefinish=0;
address=0x00000;
chedaoh=F29040read();
address=0x00001;
d_p_modi=F29040read();
if(d_p_modi>1)d_p_modi=2;
else d_p_modi=0;
address=0x10000;
savednum=F29040read();
address++;
savednum+=(F29040read()<<8);
address=0x10002;
sendnum=F29040read();
address++;
sendnum+=(F29040read()<<8);
while(1)
{
CS256;
dispclk();
if(k_x_jishi==0) sendidel();
if(key==0xF2){key=0xFF;lcddisp(0,0,0xfd,0Xff);} /*背光切换*/
CS256;
lcddisp(22,90,0xA3,chedaoh+0XB0);
lcddisp(24,90,0xb3,0Xb5);
lcddisp(26,90,0xb5,0Xc0);
lcddisp(28,90,0xa2,0xa2);//清除本地处理
gunping();
if(cheing!=cheshu){
tempa=0xff; //发送完成
for(m=0;m<5;m++){for(i=0;i<(18+toupcom[cheing][15]*4);i++){j=toupcom[cheing][i];
ST554A;;;;/*发送到上位机*/
ACC=ST05;
while(!ACC5){ST554A;ACC=ST05;}
RBR=j;
CS256;
}
delay_time(500);
if(tempa==0xf0)m=50;
}//发送五次
/***********************end of 把数据发送到上位机*************/
if(m==5)bendichuli();
if(cheing!=cheshu)cheing=(cheing+1)%10;
}
else tongbudata();
}//end while(1)
}
/////////////////////////////end of main////////////////////////////////////////////////
void ct0(void) interrupt 1 using 0 /*每1ms采集一次传感器数据*/
{
TH0=0x00;
TL0=0x01;
time++;if(time>5){count=0;time=0;/*counttime++;if(counttime>30){counttime=0;k_x_send=0;}*/}
P14=~P14;
if(k_x_jishi)k_x_jishi--;
}
void int0(void) interrupt 0 using 1 /*外部中断0 用来接受键盘发来的数据*/
{
time=0;
dat>>=1; /*接受数据 低->高*/
if(sda) dat|=0x80;
count++;
if(count==9 ) dat2=dat;
if(count>35){count=0;
switch(dat2)
{
case 0x45: key0=key;key=0;keyfinish=1;break;//0
case 0x16: key0=key;key=1;keyfinish=1;break;//1
case 0x1E: key0=key;key=2;keyfinish=1;break;//2
case 0x26: key0=key;key=3;keyfinish=1;break;//3
case 0x25: key0=key;key=4;keyfinish=1;break;//4
case 0x2E: key0=key;key=5;keyfinish=1;break;//5
case 0x36: key0=key;key=6;keyfinish=1;break;//6
case 0x3D: key0=key;key=7;keyfinish=1;break;//7
case 0x3E: key0=key;key=8;keyfinish=1;break;//8
case 0x46: key0=key;key=9;keyfinish=1;break;//9
case 0x49: key0=key;key=0xa;keyfinish=1;break; //.
case 0x5a: key0=0;key=0;feefinish=1;break; //enter
case 0x04: key=0XF3;break;/*校验用*/
case 0x06: key=0XF2;break;/*开关背光*/
case 0x05: key=0XF1;break;/*开关背光*/
case 0x0c: key=0XF4;break;/*开关背光*/
case 0x03: key=0XF5;break;/*开关背光*/
}
}
}//end of void int0() interrupt 0 using 1
void interrupt1(void) interrupt 2 using 3
{
ST554A;
ACC=ST05;
if(ACC0){tempa=RBR;}
ST554B;
ACC=ST05;
if(ACC0){tempb=RBR;jieshou();}
CS256;
}// end of void interrupt1() interrupt 2 using 3
void serial(void) interrupt 4 using 2 /* 串行口接收中断服务子程序 */
{
if(TI)TI=0;
if(txtolcd&(txtolcdnum<5)){SBUF=tolcd[txtolcdnum];txtolcdnum++;}
else {txtolcdnum=0; txtolcd=0;}
if(RI){RI=0;if(SBUF==0x66)lcdok=1;}
}//end of void serial() interrupt 4 using 2
void init554(void)
{
delay_time(500);
ST554D;
ST03=0X83; RBR=0x30; ST01=0; /*得到2400的波特率*/
ST03=0x03; ST01=0X0;ST04=0X08;
ST554C;
ST03=0X83; RBR=0x30; ST01=0; /*得到2400的波特率*/
ST03=0x03; ST01=0X0;ST04=0X08;
ST554B;
ST03=0X83; RBR=0X0C; ST01=0;
ST03=0x03; ST01=0X01;ST04=0X08;
ST554A;
ST03=0X83; RBR=0x0c; ST01=0;
ST03=0x03; ST01=0X01;ST04=0X08;
EX1=1;/*打开来自554的中断*/
}//end of void init554(void)
void initial(void) /* 初始化子程序 */
{
RCAP2L=0xDC; /*0MHz 计数初值F7dd可得到300的波特率*/
RCAP2H=0xFF;
TL2=0xDC;
TH2=0xFF;
T2CON=52;
SCON=0x50;
REN=1;
ES=1;
TH0=0x00;
TL0=0x01;
TR0=1;
TMOD=0X01;
ET0=1;
IT0=1;
EX0=1;
IP=0X0;
IT1=1; /*不使用*/
EX1=0; /*554初始化之前关掉来自554的中断*/
EA=1;
}
void delay_time(unsigned int delay) /* 延时子程序,基本延时单元为1ms */
{ /* 该程序段能完成延时delay个ms */
unsigned int j;
unsigned char i;
for (j=0;j<delay;j++)
for (i=0;i<125;i++); /* 一个基本延时单元 */
}
void jieshou(void)
{ unsigned int crc=0;
unsigned char i;
CS256;
if(subnum==0){if(tempb==0xff){subcom[0]=tempb;subnum=subnum+1;}}
else
{ subcom[subnum]=tempb;/*如果接收缓存不空,写入缓存*/
subnum=subnum+1;
if(subnum==subcom[03])/*缓存字节=5*/
{ /*crc校验*/
for( i=0; i<subcom[03]-2;i++) crc = xcrc(crc,subcom[i]);
if(crc==(subcom[subcom[03]-2]<<8)+subcom[subcom[03]-1]) {subrecok=1; }/*校验成功*/
else subrecok=0;
if(subrecok){receipt[0]=0xff;receipt[1]=0x00;receipt[2]=0x00;receipt[03]=0X00;receipt[04]=0x4B;receipt[05]=0xA3;}
else {receipt[0]=0xff;receipt[1]=0x00;receipt[2]=0x00;receipt[03]=0X01;receipt[04]=0x5B;receipt[05]=0x82;}
for(i=0;i<6;i++){ ST554B;ACC=ST05;
while(!ACC5)ACC=ST05;
RBR=receipt[i];
}
subnum=0;
}//end of if(subnum==subcom[cheshu][03])
}///end of else
CS256;
if(subrecok){if(subcom[2]==0x06){if(cheing!=cheshu){ if(cheshu==0)cheshu=9;
else cheshu--;}
subrecok=0;
}
else {tobuff();cheshu=(cheshu+1)%10;subrecok=0;}
}
CS256;
}
void lcdinit(void)
{unsigned char i;
delay_time(300);
// while(!lcdok); lcdok=0;
// while(txtolcd);
tolcd[0]=0xFF; /*CLS*/
tolcd[1]=0XFF;
tolcd[2]=0XFF;
tolcd[3]=0XFF;
tolcd[4]=0XFF;
txtolcd=1;
TI=1;
lcddisp(0,0,0XD7,0XDC);//总
lcddisp(10, 0, 0XD6, 0XD8); /*重*/
lcddisp(22, 0, 0XB3, 0XAC); /*超*/
lcddisp(24,0, 0XCF, 0XDE); /*限*/
lcddisp(26, 0, 0XC2, 0XCA); /*率*/
lcddisp(0, 90, 0XD3, 0XA6); /*应*/
lcddisp(2, 90, 0XBD, 0XC9); /*缴*/
lcddisp(4, 90,0XB7, 0XD1); /*费*/
lcddisp(6, 90, 0XB6, 0XEE); /*额*/
lcddisp(00, 112, 0XB3, 0XB5); /*车*/
lcddisp(6, 112,0XD0, 0XCD); /*型*/
lcddisp(8, 112, 0XA3, 0XBA); /*:*/
lcddisp(12, 112, 0XD0, 0XCD); /*型*/
lcddisp(17, 112, 0XCA, 0XB1); /*时*/
lcddisp(19, 112, 0XBC, 0XE4); /*间*/
lcddisp(21, 112, 0XA3, 0XBA); /*:*/
lcddisp(8, 90, 0XA3, 0XBA); /*:*/
lcddisp(17, 90, 0XD4, 0XAA); /*:*/
for(i=0x1E;i>0;i--) lcddisp(i-1, 2, 0Xff, 0X0d); /*-----------*///
}
/********************************************
内部函数,延时1uS
********************************************/
void In1uSDelay()
{
_nop_();_nop_();_nop_();_nop_();
}
/********************************************
内部函数,I2C开始
********************************************/
void InI2C_Start()
{
EA=0;
I2C_SDA=1;
I2C_SCK=1;
In1uSDelay();
I2C_SDA=0;
In1uSDelay();
I2C_SCK=0;
}
/********************************************
内部函数,I2C结束
********************************************/
void InI2C_Stop()
{
I2C_SDA=0;
I2C_SCK=0;
In1uSDelay();
I2C_SCK=1;
In1uSDelay();
I2C_SDA=1;
EA=1;
}
/********************************************
内部函数,输入ACK
********************************************/
void InI2C_ReadACK()
{
In1uSDelay();
I2C_SCK=1;
In1uSDelay();
I2C_SCK=0;
In1uSDelay();
}
/********************************************
内部函数,输出ACK=1
********************************************/
void InI2C_WriteACK()
{
In1uSDelay();
I2C_SCK=1;
In1uSDelay();
I2C_SDA=1;
In1uSDelay();
I2C_SCK=0;
In1uSDelay();
}
/********************************************
内部函数.输出数据字节
入口:B=数据
********************************************/
void InI2C_Write()
{
unsigned char i=8;
do{
ACC=B;
I2C_SDA=ACC7;
ACC+=ACC;
B=ACC;
_nop_();
_nop_();
I2C_SCK=1;
In1uSDelay();
I2C_SCK=0;
}while(--i);
}
/********************************************
内部函数.输入数据
出口:B
********************************************/
void InI2C_Read()
{
unsigned char i=8;
do{
I2C_SCK=1;
ACC=B;
ACC+=ACC;
ACC0=I2C_SDA;
B=ACC;
I2C_SCK=0;
In1uSDelay();
}while(--i);
}
/********************************************
输出数据->pcf8563
********************************************/
void I2C_WriteData(unsigned char mLocation,unsigned char mData)
{
InI2C_Start();
B=0xa2;
InI2C_Write(); /*写命令*/
InI2C_ReadACK();
B=mLocation;
InI2C_Write(); /*写地址*/
InI2C_ReadACK();
B=mData;
InI2C_Write(); /*写数据*/
InI2C_ReadACK();
InI2C_Stop();
}
/********************************************
输入数据<-pcf8563
********************************************/
unsigned char I2C_ReadData(unsigned char mLocation)
{
InI2C_Start();
B=0xa2;
InI2C_Write(); /*写命令,设置地址*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -