📄 zldlb.c
字号:
{
led[5]=18;//正号//
}
/*************数值处理****************************************************/
if(lcbz==4)
{
led[4]=led2[4];
led[3]=led2[3];
led[2]=led2[2];
led[1]=led2[1]|0x80;
}
if(lcbz==3)
{
led[4]=led2[4];
led[3]=led2[3];
led[2]=led2[2]|0x80;
led[1]=led2[1];
}
if(lcbz==2)
{
led[4]=led2[4];
led[3]=led2[3]|0x80;
led[2]=led2[2];
led[1]=led2[1];
}
if(lcbz==1)
{
led[4]=led2[4]|0x80;
led[3]=led2[3];
led[2]=led2[2];
led[1]=led2[1];
}
}
/***************************************************************************
*名称:read_key()
*功能:读键盘程序
***************************************************************************/
void read_key()
{
unsigned char key1;
unsigned char key2;
key0=P1&0x08;
if(key0==0)
{
key1=P2&0x0f;
delay(50);
key2=P2&0x0f;
if(key1=key2)
{
keydig=key1;
}
}
else
{
keydig=0xff;//清除
}
}
void read_key1()
{
unsigned char key1;
unsigned char key2;
// run=1;
key0=P1&0x08;
if(key0==0x8)
{
key1=P2&0x0f;
delay(50);
key2=P2&0x0f;
if(key1=key2)
{
keydig=key1;
}
}
else
{
keydig=0xff;//清除
}
}
void CH452_I2c_Start_2() //两线制方式,SDA用做中断输出,使用以下两个函数
{ rst_wdog();
CH452_SDA_SET;
CH452_SCL_CLR; //通知CH452,将要对其操作,此段时间不要再产生按键中断
/* do {
DELAY_1US; // 保留足够的时间给CH452产生中断
DELAY_1US;
} while ( CH452_SDA_IN == 0 ); // CH452正在请求中断?
DELAY_1US;
DISABLE_INTERRUPT; */ //禁止键盘中断,防止开始时被CH452中断而进入中断服务程序中的START
CH452_SDA_SET; /*发送起始条件的数据信号*/
CH452_SCL_SET;
DELAY_1US;
CH452_SDA_CLR; /*发送起始信号*/
DELAY_1US;
CH452_SCL_CLR; /*钳住I2C总线,准备发送或接收数据 */
DELAY_1US;
}
void CH452_I2c_Stop_2()
{ rst_wdog();
CH452_SDA_CLR;
DELAY_1US;
CH452_SCL_SET;
DELAY_1US;
CH452_SDA_SET; /*发送I2C总线结束信号*/
DELAY_1US;
// CLEAR_INTER_FLAG; // 清除中断标志,因为通过SDA输出数据所以会误中断
// ENABLE_INTERRUPT;
}
void CH452_I2c_WrByte(unsigned char c) //写一个字节数据
{
unsigned char i;
rst_wdog();
for(i=0;i!=8;i++) // 输出8位数据
{
if(c&0x80)
{CH452_SDA_SET;}
else
{CH452_SDA_CLR;}
CH452_SCL_SET;
c<<=1;
DELAY_1US;
DELAY_1US;
CH452_SCL_CLR;
DELAY_1US;
// DELAY_1US;
}
DELAY_1US;
CH452_SDA_SET;
CH452_SCL_SET; // 接收应答
DELAY_1US;
DELAY_1US;
CH452_SCL_CLR;
DELAY_1US;
}
unsigned char CH452_I2c_RdByte() //读一个字节数据
{
unsigned char c,i;
c=0;
rst_wdog();
for(i=0;i!=8;i++) // 输入8位数据
{
CH452_SDA_SET;
CH452_SCL_SET;
DELAY_1US;
DELAY_1US;
c<<=1;
if(CH452_SDA_IN) c|=0x01; // 输入1位
CH452_SCL_CLR;
DELAY_1US;
// DELAY_1US;
}
DELAY_1US;
CH452_SDA_SET;
CH452_SCL_SET; // 发出无效应答
DELAY_1US;
DELAY_1US;
CH452_SCL_CLR;
DELAY_1US;
return(c);
}
void CH452_Write(unsigned int command) //写命令
{ unsigned char a;
unsigned char b;
CH452_I2c_Start_2(); /*启动总线*/
CH452_I2c_WrByte(((unsigned char)(command>>7)&0x3E)|0x60); // CH452的ADDR=1时(默认)
//debug
a=(((unsigned char)(command>>7)&0x3E)|0x60);
rst_wdog();
CH452_I2c_WrByte((unsigned char)command); /*发送数据*/
//debug
b=(unsigned char)command;
CH452_I2c_Stop_2(); /*结束总线*/
}
unsigned char CH452_Read() //读取按键
{
unsigned char key;
CH452_I2c_Start_2(); /*启动总线*/
CH452_I2c_WrByte(0x6F); // 若有两个CH452并连,当ADDR=0时,此值为0x4F
key=CH452_I2c_RdByte(); /*读取数据*/
CH452_I2c_Stop_2(); /*结束总线*/
return(key);
}
/***************************************************************************
*名称:displa()
*功能:数码管显示子程序
***************************************************************************/
void displa(void)
{
//unsigned char sdate,i,n;
/* unsigned char i;
unsigned char leddispla[6];
rst_wdog();
for(i=5;i>0;i--)
{
switch(led[i])
{
case 0x00:leddispla[i]=0x3f;break;//0
case 0x01:leddispla[i]=0x06;break;
case 0x02:leddispla[i]=0x5B;break;
case 0x03:leddispla[i]=0x4F;break;
case 0x04:leddispla[i]=0x66;break;
case 0x05:leddispla[i]=0x6D;break;
case 0x06:leddispla[i]=0x7D;break;
case 0x07:leddispla[i]=0x07;break;
case 0x08:leddispla[i]=0x7F;break;
case 0x09:leddispla[i]=0x6F;break;
case 0x0a:leddispla[i]=0x77;break;
case 0x0b:leddispla[i]=0x7C;break;
case 0x0c:leddispla[i]=0x39;break;
case 0x0d:leddispla[i]=0x5e;break;
case 0x0e:leddispla[i]=0x79;break;
case 0x0f:leddispla[i]=0x71;break;
case 0x10:leddispla[i]=0xbf;break;
case 0x11:leddispla[i]=0x86;break;
case 0x12:leddispla[i]=0xdb;break;
case 0x13:leddispla[i]=0xcf;break;
case 0x14:leddispla[i]=0xe6;break;
case 0x15:leddispla[i]=0xed;break;
case 0x16:leddispla[i]=0xfd;break;
case 0x17:leddispla[i]=0x87;break;
case 0x18:leddispla[i]=0xff;break;
case 0x19:leddispla[i]=0xef;break;
case 0x1a:leddispla[i]=0xf7;break;
case 0x1b:leddispla[i]=0xfc;break;
case 0x1c:leddispla[i]=0xb9;break;
case 0x1d:leddispla[i]=0xde;break;
case 0x1e:leddispla[i]=0xf9;break;
case 0x1f:leddispla[i]=0xf1;break;//F.
case 0x20:leddispla[i]=0x76;break;//h
case 0x21:leddispla[i]=0x06;break;//I
case 0x22:leddispla[i]=0x0f;break;//j
case 0x23:leddispla[i]=0x73;break;//p
case 0x24:leddispla[i]=0x3e;break;//U
case 0x25:leddispla[i]=0x00;break;//灭
case 0x26:leddispla[i]=0x40;break;//--
case 0x27:leddispla[i]=0x38;break;
case 0x28:leddispla[i]=0x40;break;
case 0x29:leddispla[i]=0xe7;break;
default:break;
}
}
CH452_Write(0x0800+leddispla[0]);
DELAY_1US;*/
CH452_Write(0x0800|led[1]);
DELAY_1US;
CH452_Write(0x0900|led[2]);
DELAY_1US;
CH452_Write(0x0a00|led[3]);
DELAY_1US;
CH452_Write(0x0b00|led[4]);
DELAY_1US;
CH452_Write(0x0c00|led[5]);
DELAY_1US;
/*for(i=5;i>0;i--)
{
sdate=leddispla[i];
for(n=0;n<=7;n++)
{
ACC=sdate;
ACC<<=1;
clke=0;
dat=CY;
_nop_();
clke=1;
sdate=ACC;
}
}*/
}
void main()
{
unsigned char sum;
unsigned char i;
rst_wdog();
CH452_Write(0x0201) ; //inti
delay(100);
CH452_Write(0x0401) ; //SET C OPEN DISPLAY
DELAY_1US;
CH452_Write(0x05D0) ; //SET Code
DELAY_1US;
rst_wdog();
keydig=1;
led[0]=0;
led[1]=0;
led[2]=0;
led[3]=0;
led[4]=0;
led[5]=0;
cbz=0;//存储标志
xbz=0;//查询标志
txbz=0;//未通讯
rdata=0;//接收数据个数
init_port();//端口初始化
init_series();//串口初始化
displa();//显示数据
rst_wdog();
while(1)
{
rst_wdog();
delay(30); //延时
read_key();//读入键盘数据//手动
read_dat();//读入测量数据
rst_wdog(); //看门狗
displa(); //显示处理
read_key1();//读键盘
bell=1;//过量程处理,报警
//over=0;
over=1;
/*******报警处理程序**********/
if(key0==0x0)
{
if(ovr==1)
{
bell=0;//过量程处理,报警
//over=1;//过量程处理,切断电源
over=0;
led[5]=0x08;
led[4]=0x08;
led[3]=0x08;
led[2]=0x08;
led[1]=0x08;
displa();
rst_wdog();
}
}
/*******************************************************/
/*通讯处理*/
/*******************************************************/
if(rdata==5)
{
txbz=0;
rdata=0;
TH0=0X0f;
TL0=0x00;
ET0=0;
TR0=0;
sum=rdat[0]+rdat[1]+rdat[2]+rdat[3];//累加和
bell=1;
/*********************完成数据回复5个数据***************/
if(sum==rdat[4])//数据检效
{
rt485=1;
SBUF=0x01;//站号
delay(30);
SBUF=0x00;//回传命令
delay(30);
SBUF=rdat[2];//其始地址
delay(30);
SBUF=rdat[3];//数据个数
delay(30);
SBUF=led[5];
delay(30);
SBUF=led[4];
delay(30);
SBUF=led[3];
delay(30);
SBUF=led[2];
delay(30);
SBUF=led[1];
delay(30);
SBUF=0x01+rdat[2]+rdat[3]+led[5]+led[4]+led[3]+led[2]+led[1];//这里的值应与地址相符
delay(30);
sum=0;
rt485=0;
}
delay(230);
}
/****************通讯结束****************************/
/*****************自动档位**************************/
if(keydig==0x0e)
{
for(i=0;i<6;i++)
{
memory[cbz][i]=led[5-i]; //存储
}
cbz=cbz+1;
if(cbz>16)
{
cbz=0;
}
led[5]=cbz;
led[4]=16;
led[3]=16;
led[2]=16;
led[1]=16;
xbz=cbz;
displa(); //显示程序
rst_wdog();
delay(230);
delay(230);
rst_wdog();
delay(230);
delay(230);
rst_wdog();
}
if(keydig==0x0d)
{
if(xbz==0)
{
xbz=cbz;
}
xbz=xbz-1;
led[5]=xbz;
led[4]=16;
led[3]=16;
led[2]=16;
led[1]=16;
displa(); //显示程序
rst_wdog();
delay(230);
rst_wdog();
delay(230);
rst_wdog();
delay(230);
rst_wdog();
delay(230);
rst_wdog();
led[5]=memory[xbz][1]; //查询
led[4]=memory[xbz][2];
led[3]=memory[xbz][3];
led[2]=memory[xbz][4];
led[1]=memory[xbz][5];
displa(); //显示程序
rst_wdog();
delay(230);
rst_wdog();
delay(230);
rst_wdog();
delay(230);
rst_wdog();
delay(230);
rst_wdog();
}
if(keydig==0x0b)
{
//选择
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -