📄 venus.c
字号:
case 2:{;}break;
}
}break;
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:{
move_data(&lcd_buf[1],&lcd_buf[0],7); //YIWEI
lcd_buf[7]=i|0x10;
move_data(&lcd_buf,&xtcs_x[counter_new][0],8); //SAVE
print_e(MENU_DIS[counter_new]);
}break;
}
print_fill(menu_add[counter_old],0x00,0x8,0x9);
}
}
gzsd() //故障设定
{
unsigned char code TABLE01[5]={24,25,26,27,0xFF};//故障设定
unsigned char code TABLE02[15]={29,30,0xfe,0xfe,0xfe,29,30,0xfe,0xfe,0xfe,0xfe,31,32,0xFF};//系统电压
unsigned int code MENU_DIS[18]={154,163,172,
214,223,232,
274,283,292,
334,343,352,
394,403,412,
454,463,472,
};//菜单显示位置数组
unsigned char xdata gzsd_x[18][9]; //设置数据存放数组
unsigned int xdata menu_add[18]; //激活块地址数组 menu_add=(MENU_DIS/30)*240+(MENU_DIS%30)
unsigned char i,counter_old,counter_new;
bit off,first_char;
off=1;
first_char=1;
load_data(cshsj_page,&gzsd_c,0,&gzsd_x,162); //装初始设置数据
menu_add[0]=(MENU_DIS[0]/30)*240+(MENU_DIS[0]%30);
menu_add[1]=(MENU_DIS[1]/30)*240+(MENU_DIS[1]%30);
menu_add[2]=(MENU_DIS[2]/30)*240+(MENU_DIS[2]%30);
menu_add[3]=(MENU_DIS[3]/30)*240+(MENU_DIS[3]%30);
menu_add[4]=(MENU_DIS[4]/30)*240+(MENU_DIS[4]%30);
menu_add[5]=(MENU_DIS[5]/30)*240+(MENU_DIS[5]%30);
menu_add[6]=(MENU_DIS[6]/30)*240+(MENU_DIS[6]%30);
menu_add[7]=(MENU_DIS[7]/30)*240+(MENU_DIS[7]%30);
menu_add[8]=(MENU_DIS[8]/30)*240+(MENU_DIS[8]%30);
menu_add[9]=(MENU_DIS[9]/30)*240+(MENU_DIS[9]%30);
menu_add[10]=(MENU_DIS[10]/30)*240+(MENU_DIS[10]%30);
menu_add[11]=(MENU_DIS[11]/30)*240+(MENU_DIS[11]%30);
menu_add[12]=(MENU_DIS[12]/30)*240+(MENU_DIS[12]%30);
menu_add[13]=(MENU_DIS[13]/30)*240+(MENU_DIS[13]%30);
menu_add[14]=(MENU_DIS[14]/30)*240+(MENU_DIS[14]%30);
menu_add[15]=(MENU_DIS[15]/30)*240+(MENU_DIS[15]%30);
menu_add[16]=(MENU_DIS[16]/30)*240+(MENU_DIS[16]%30);
menu_add[17]=(MENU_DIS[17]/30)*240+(MENU_DIS[17]%30);
counter_new=0x0;
counter_old=0x0;
lcd_cls(lcd_page1);
lcd_cls(lcd_page2);
load_data(0,&TABLE01,0,&lcd_buf,5);
print_c16(0x8);
load_data(0,&TABLE02,0,&lcd_buf,15);
print_c16(0x1E6);
lcd_buf[0]=0x35; //U
lcd_buf[1]=0x41; //a
lcd_buf[2]=0xff;
print_e(151);
lcd_buf[0]=0x35; //U
lcd_buf[1]=0x42; //b
lcd_buf[2]=0xff;
print_e(211);
lcd_buf[0]=0x35; //U
lcd_buf[1]=0x43; //c
lcd_buf[2]=0xff;
print_e(271);
lcd_buf[0]=0x29; //I
lcd_buf[1]=0x41; //a
lcd_buf[2]=0xff;
print_e(331);
lcd_buf[0]=0x29; //I
lcd_buf[1]=0x42; //b
lcd_buf[2]=0xff;
print_e(391);
lcd_buf[0]=0x29; //I
lcd_buf[1]=0x43; //c
lcd_buf[2]=0xff;
print_e(451);
move_data(&gzsd_x[0][0],&lcd_buf,9);
print_e(MENU_DIS[0]);
move_data(&gzsd_x[1][0],&lcd_buf,9);
print_e(MENU_DIS[1]);
move_data(&gzsd_x[2][0],&lcd_buf,9);
print_e(MENU_DIS[2]);
move_data(&gzsd_x[3][0],&lcd_buf,9);
print_e(MENU_DIS[3]);
move_data(&gzsd_x[4][0],&lcd_buf,9);
print_e(MENU_DIS[4]);
move_data(&gzsd_x[5][0],&lcd_buf,9);
print_e(MENU_DIS[5]);
move_data(&gzsd_x[6][0],&lcd_buf,9);
print_e(MENU_DIS[6]);
move_data(&gzsd_x[7][0],&lcd_buf,9);
print_e(MENU_DIS[7]);
move_data(&gzsd_x[8][0],&lcd_buf,9);
print_e(MENU_DIS[8]);
move_data(&gzsd_x[9][0],&lcd_buf,9);
print_e(MENU_DIS[9]);
move_data(&gzsd_x[10][0],&lcd_buf,9);
print_e(MENU_DIS[10]);
move_data(&gzsd_x[11][0],&lcd_buf,9);
print_e(MENU_DIS[11]);
move_data(&gzsd_x[12][0],&lcd_buf,9);
print_e(MENU_DIS[12]);
move_data(&gzsd_x[13][0],&lcd_buf,9);
print_e(MENU_DIS[13]);
move_data(&gzsd_x[14][0],&lcd_buf,9);
print_e(MENU_DIS[14]);
move_data(&gzsd_x[15][0],&lcd_buf,9);
print_e(MENU_DIS[15]);
move_data(&gzsd_x[16][0],&lcd_buf,9);
print_e(MENU_DIS[16]);
move_data(&gzsd_x[17][0],&lcd_buf,9);
print_e(MENU_DIS[17]);
while (off)
{
move_data(&gzsd_x[counter_new][0],&lcd_buf,9);
print_fill(menu_add[counter_new],0xff,0x8,0x8);
counter_old=counter_new;
i=getchar();
switch (i)
{
case LEFT:{ first_char=1;
if (counter_new==0) {counter_new=17;}
else {counter_new--;}
}break;
case ENTER:
case RIGHT:{ first_char=1;
if (counter_new<17) {counter_new++;}
else {counter_new=0x0;}
}break;
case UP:{ first_char=1;
if (counter_new>2) {counter_new=counter_new-3;}
else {counter_new=counter_new+15;}
}break;
case DOWN:{ first_char=1;
if (counter_new<15) {counter_new=counter_new+3;}
else {counter_new=counter_new-15;}
}break;
case ESC:{off=0;}break;
case START:{
switch (counter_new)
{
case 0:{;}break;
case 1:{;}break;
case 2:{;}break;
}
}break;
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:{
if (first_char)
{first_char=0;
lcd_buf[0]=0x00;
lcd_buf[1]=0x00;
lcd_buf[2]=0x00;
lcd_buf[3]=0x00;
lcd_buf[4]=0x00;
lcd_buf[5]=0x00;
lcd_buf[6]=0x00;
lcd_buf[7]=i|0x10;
move_data(&lcd_buf,&gzsd_x[counter_new][0],8); //SAVE
print_e(MENU_DIS[counter_new]);
}
else
{
move_data(&lcd_buf[1],&lcd_buf[0],7); //YIWEI
lcd_buf[7]=i|0x10;
move_data(&lcd_buf,&gzsd_x[counter_new][0],8); //SAVE
print_e(MENU_DIS[counter_new]);
}
}break;
}
print_fill(menu_add[counter_old],0x00,0x8,0x8);
}
}
long d_to_hex(unsigned char xdata *k)
{
unsigned char i,j;
float n,m;
n=0;
j=7;
for (i=0;i<8;i++)
{
if (k[i]==0xe) {j=i;break;}
}
for (i=7;i>j;i--)
{
n=n+(k[i]&0xf);
n=n/10;
}
m=0;
for (i=0;i<j;i++)
{
if (k[i]>=0x10) {m=m*10+(k[i]&0xf);}
}
m=m+n;
for (i=0;i<8;i++)
{
if (k[i]==0xd) {m=-m;break;}
}
return (m*0x10000);
}
/*---------------------------------------------
I2C总线驱动程序(用两个普通IO模拟I2C总线)
----------------------------------------------*/
#define SDA P30
#define SCL P31
#define true 1
#define false 0
/*--------------------------------------------------------------------------------
调用方式:void I2CStart(void)
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2CStart(void)
{
EA=0;
SDA=1; SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
SDA=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SCL=0;
}
/*--------------------------------------------------------------------------------
调用方式:void I2CStop(void)
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2CStop(void)
{
SCL=0; SDA=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SDA=1;
EA=1;
}
/*--------------------------------------------------------------------------------
调用方式:bit WaitAck(void)
函数说明:私有函数,I2C专用,等待从器件接收方的应答
---------------------------------------------------------------------------------*/
bit WaitAck(void)
{
unsigned char errtime=255;//因故障接收方无ACK,超时值为255。
SDA=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
while(SDA)
{
errtime--;
if (!errtime) {I2CStop();return false;}
}
SCL=0;
return true;
}
/*--------------------------------------------------------------------------------
调用方式:void SendAck(void)
函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,应答信号。
---------------------------------------------------------------------------------*/
void SendAck(void)
{
SDA=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
SCL=0;
}
/*--------------------------------------------------------------------------------
调用方式:void SendNotAck(void)
函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,非应答信号。
--------------------------------------------------------------------------------*/
void SendNotAck(void)
{
SDA=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
SCL=0;
}
/*--------------------------------------------------------------------------------
调用方式:void I2CSendByte(unsigned char x)
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2CSendByte(unsigned char x)
{
unsigned char i=8;
while (i--)
{
SCL=0;_nop_();
SDA=(bit)(x&0x80); x<<=1; _nop_(); _nop_(); _nop_(); _nop_();
SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
}
SCL=0;
}
/*--------------------------------------------------------------------------------
调用方式:uchar I2CReceiveByte(void)
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
unsigned char I2CReceiveByte(void)
{
unsigned char i=8;
unsigned char j=0;
SDA=1;
while (i--)
{
j<<=1;
SCL=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
j|=SDA;
}
SCL=0;
return j;
}
//---------------------------------------------------------------------------
//开始PCF8563T驱动程序
/*--------------------------------------------------------------------------------
调用方式:void GetPCF8563(unsigned char *buff)
函数说明:读取时钟芯片PCF8563的时间
一次读取秒、分、小时、日、星期、月(世纪)、年共7个值放入缓冲区buff
---------------------------------------------------------------------------------*/
void GetPCF8563(unsigned char *buff)
{
unsigned char i;
I2CStart();
I2CSendByte(0xA2);
WaitAck();
I2CSendByte(0x2); //从秒开始读
WaitAck();
I2CStart();
I2CSendByte(0xA3);
WaitAck();
for (i=0;i<7;i++)
{
buff[i]=I2CReceiveByte();
if (i<6) SendAck();//除最后一个字节外,其他都要从MASTER发应答。
}
SendNotAck();
I2CStop();
}
/*--------------------------------------------------------------------------------
调用方式:void SetPCF8563(unsigned char timetype,unsigned char value)
函数说明:调整时钟。timetype是要改的时间类型,value是新设置的时间值(BCD格式)。
0x02:秒/0x03:分/0x04:小时/0x05:日/0x06:星期/0x07:月(世纪)/0x08:年
---------------------------------------------------------------------------------*/
void SetPCF8563(unsigned char timetype,unsigned char value)
{
I2CStart();
I2CSendByte(0xA2);
WaitAck();
I2CSendByte(timetype);
WaitAck();
I2CSendByte(value);
WaitAck();
I2CStop();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -