📄 lhj.c
字号:
}
break;
case 0x01://按1键设置跳变时间
ET1=0;
l_key=0xff;
while(1){
l_tmpdisplay[0]=l_timer/10;
l_tmpdisplay[1]=l_timer%10;
display(l_tmpdisplay,2);
if(l_key==0x0a){
l_key=0xff;
if(l_timer<255)
l_timer++;
}
if(l_key==0x0b){
l_key=0xff;
if(l_timer>1)
l_timer--;
}
if(l_key==0x0c){
l_key=0xff;
ET1=1;
break;
}
}
break;
case 0x0e: //按#键调入写数据处理,可对相应段的64字节进行修改保存
ET1=0;
l_key=0xff;
_24c02wdate(tmp);
l_key=0xfe;
break;
case 0xfe:
ET1=0;
l_key=0xff;
for(j=0;j<8;j++){
I2C_start();
I2C_write(W24C02);
I2C_ACK(0);
I2C_write(tmp*64+j*8);
I2C_ACK(1);
I2C_stop();
I2C_start();
I2C_write(R24C02);
for(i=0;i<8;i++){
I2C_ACK(0);
l_lhj[j*8+i]=I2C_read();
}
I2C_ACK(1);
I2C_stop();
for(i=0;i<50;i++){}
}
l_tmpdate[0]=0;
l_tmpdate[1]=0;
l_tmpdate[2]=0;
TMOD&=0X2F;
TL1=0x01;
TH1=0x01;
ET1=1;
TR1=1;
break;
}
}
}
void _24c02wdate(unsigned char tmp)//对数据的修改保存处理
{
unsigned char i,j,tmp2=0;
while(1){
P2=~l_lhj[tmp2];
if (l_key==0x0c){
l_key=0xff;
break;
}
if(l_key==0x0e){
l_key=0xff;
for(j=0;j<8;j++){
I2C_start();
I2C_write(W24C02);
I2C_ACK(0);
I2C_write(tmp*64+j*8);
for(i=0;i<8;i++){
I2C_ACK(0);
I2C_write(l_lhj[j*8+i]);
}
I2C_ACK(1);
I2C_stop();
for(i=0;i<100;i++){
leday();
}
}
break;
}
if(l_key==0x0b){
l_key=0xff;
if(tmp2<63)
tmp2++;
}
if(l_key==0x0a){
l_key=0xff;
if(tmp2>0)
tmp2--;
}
if((l_key<0x09)&&(l_key>0)){ //每一字节可按相应的位来改相应某位的值
i=1;
l_key--;
i<<=l_key;
l_lhj[tmp2]=l_lhj[tmp2]^i;
l_key=0xff;
}
}
}
void I2C_write(unsigned char tmp)
{
unsigned char i;
for(i=0;i<8;i++){
SCL=0;
_nop_();
_nop_();
_nop_();
SDA=(bit)(tmp&0x80);
tmp<<=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
}
SCL=0;
}
unsigned char I2C_read(void)
{
unsigned char i,tmp;
tmp=0;
for(i=0;i<8;i++){
SCL=0;
_nop_();
_nop_();
_nop_();
SDA=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
tmp<<=1;
if(SDA==1)
tmp++;
}
SCL=0;
return tmp;
}
void I2C_ACK(bit tmp)
{
SDA=tmp;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=0;
}
void I2C_start(void)
{
SDA=1;
_nop_();
SCL=1;
_nop_();
SDA=0;
_nop_();
SCL=0;
_nop_();
}
/*********/
void I2C_stop(void)
{
SDA=0;
_nop_();
SCL=1;
_nop_();
SDA=1;
_nop_();
SCL=0;
_nop_();
}
void ad0831menu(void)//数模转换器的数据采集
{
unsigned char i,tmp;
tmp=0;
while (1){
if(l_key==0x0c){
l_key=0xff;
break;
}
i++;
if(i==255){
tmp=ad0831read();
i=0;
l_tmpdate[0]=tmp/100;
tmp=tmp%100;
l_tmpdate[1]=tmp/10;
l_tmpdate[2]=tmp%10;
}
display(l_tmpdate,3);
}
}
unsigned char ad0831read(void)
{
unsigned char i=0,tmp=0;
SDA2=1;
CS2=0;
_nop_();
_nop_();
SCL2=0;
_nop_();
_nop_();
SCL2=1;
_nop_();
_nop_();
SCL2=0;
_nop_();
_nop_();
SCL2=1;
_nop_();
_nop_();
SCL2=0;
_nop_();
_nop_();
for(i=0;i<8;i++){
tmp<<=1;
if(SDA2)
tmp++;
SCL2=1;
_nop_();
_nop_();
SCL2=0;
_nop_();
_nop_();
}
CS2=1;
return tmp;
}
void ds1302menu(void)//时钟读取,可修改,按A、B键更改显示时间还是日期,再按#键可对其做修改
{
unsigned char i,tmp,temp,oldtimer=0;
tmp=0;
while (1){
Read_RTC();
if((tmp==0)&&(oldtimer!=l_tmpdate[0])){
oldtimer=l_tmpdate[0];
l_tmpdisplay[0]=l_tmpdate[2]/16;
l_tmpdisplay[1]=l_tmpdate[2]&0x0f;
l_tmpdisplay[2]=10;
l_tmpdisplay[3]=l_tmpdate[1]/16;
l_tmpdisplay[4]=l_tmpdate[1]&0x0f;
l_tmpdisplay[5]=10;
l_tmpdisplay[6]=l_tmpdate[0]/16;
l_tmpdisplay[7]=l_tmpdate[0]&0x0f;
}
if((tmp==1)&&(oldtimer!=l_tmpdate[3])){
oldtimer=l_tmpdate[3];
l_tmpdisplay[0]=l_tmpdate[6]/16;
l_tmpdisplay[1]=l_tmpdate[6]&0x0f;
l_tmpdisplay[2]=10;
l_tmpdisplay[3]=l_tmpdate[4]/16;
l_tmpdisplay[4]=l_tmpdate[4]&0x0f;
l_tmpdisplay[5]=10;
l_tmpdisplay[6]=l_tmpdate[3]/16;
l_tmpdisplay[7]=l_tmpdate[3]&0x0f;
}
display(l_tmpdisplay,8);
display(l_tmpdisplay,8);
display(l_tmpdisplay,8);
display(l_tmpdisplay,8);
if(l_key==0x0c){
l_key=0xff;
break;
}
if(l_key==0x0e){
l_key=0xff;
for(i=0;i<7;i++){
temp=l_tmpdate[i]/16; //数据处理,在前程序讲过,时钟IC它是以十进制对数据存储,所以要将它转为二进制
l_tmpdate[i]=l_tmpdate[i]%16;
l_tmpdate[i]=temp*10+l_tmpdate[i];
}
i=0;
while(1){
if(l_key==0x0c){
l_key=0xff;
break;
}
if(l_key==0x0e){ //按#键对修改的数据进行写入时钟IC1302
l_key=0xff;
Set_RTC();
break;
}
switch(l_key){
case 0x01: //按1键对小时,或年的加1
l_key=0xff;
if(tmp==0){
if(l_tmpdate[2]<23)
l_tmpdate[2]++;
}
else{
if(l_tmpdate[6]<99)
l_tmpdate[6]++;
}
break;
case 0x02: //按2键对分钟,或月的加1
l_key=0xff;
if(tmp==0){
if(l_tmpdate[1]<59)
l_tmpdate[1]++;
}
else{
if(l_tmpdate[4]<12)
l_tmpdate[4]++;
}
break;
case 0x03: //按3键对秒,或日的加1
l_key=0xff;
if(tmp==0){
if(l_tmpdate[0]<59)
l_tmpdate[0]++;
}
else{
if(l_tmpdate[3]<31)
l_tmpdate[3]++;
}
break;
case 0x04: //按4键对小时,或年的减1
l_key=0xff;
if(tmp==0){
if(l_tmpdate[2]>0)
l_tmpdate[2]--;
}
else{
if(l_tmpdate[6]>0)
l_tmpdate[6]--;
}
break;
case 0x05: //按5键对分钟,或月的减1
l_key=0xff;
if(tmp==0){
if(l_tmpdate[1]>0)
l_tmpdate[1]--;
}
else{
if(l_tmpdate[4]>0)
l_tmpdate[4]--;
}
break;
case 0x06: //按6键对秒,或日的减1
l_key=0xff;
if(tmp==0){
if(l_tmpdate[0]>0)
l_tmpdate[0]--;
}
else{
if(l_tmpdate[3]>0)
l_tmpdate[3]--;
}
break;
}
ds1302play(tmp);
}
}
if(l_key==0x0a){
l_key=0xff;
tmp=0;
}
if(l_key==0x0b){
l_key=0xff;
tmp=1;
}
}
}
void Write_Ds1302_Byte(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++) //循环8次 写入数据
{
SCL2=0;
SDA2=temp&LSB; //每次传输低字节
temp>>=1; //右移一位
SCL2=1;
}
}
/****************************************************************************/
void Write_Ds1302( unsigned char address,unsigned char dat )
{
RST=0;
_nop_();
SCL2=0;
_nop_();
RST=1;
_nop_(); //启动
Write_Ds1302_Byte(address); //发送地址
Write_Ds1302_Byte(dat); //发送数据
RST=0; //恢复
}
/****************************************************************************/
unsigned char Read_Ds1302 ( unsigned char address )
{
unsigned char i,temp=0x00;
RST=0;
_nop_();
SCL2=0;
_nop_();
RST=1;
_nop_();
Write_Ds1302_Byte(address);
for (i=0;i<8;i++) //循环8次 读取数据
{
SCL2=1;
_nop_();
if(SDA2)
temp|=0x80; //每次传输低字节
SCL2=0;
temp>>=1; //右移一位
}
RST=0;
_nop_();
SCL2=1;
SDA2=0;
return (temp); //返回
}
/****************************************************************************/
void Read_RTC(void) //读取 日历
{
unsigned char i,*p;
p=read_rtc_address; //地址传递
for(i=0;i<7;i++) //分7次读取 年月日时分秒星期
{
l_tmpdate[i]=Read_Ds1302(*p);
p++;
}
}
/***********************************************************************/
void Set_RTC(void) //设定 日历
{
unsigned char i,*p,tmp;
for(i=0;i<7;i++){
tmp=l_tmpdate[i]/10;
l_tmpdate[i]=l_tmpdate[i]%10;
l_tmpdate[i]=l_tmpdate[i]+tmp*16;
}
Write_Ds1302(0x8E,0X00);
p=write_rtc_address; //传地址
for(i=0;i<7;i++) //7次写入 年月日时分秒星期
{
Write_Ds1302(*p,l_tmpdate[i]);
p++;
}
Write_Ds1302(0x8E,0x80);
}
void ds1302play(unsigned char tmp)
{
if(tmp==0){
l_tmpdisplay[0]=l_tmpdate[2]/10;
l_tmpdisplay[1]=l_tmpdate[2]%10;
l_tmpdisplay[2]=10;
l_tmpdisplay[3]=l_tmpdate[1]/10;
l_tmpdisplay[4]=l_tmpdate[1]%10;
l_tmpdisplay[5]=10;
l_tmpdisplay[6]=l_tmpdate[0]/10;
l_tmpdisplay[7]=l_tmpdate[0]%10;
}
else{
l_tmpdisplay[0]=l_tmpdate[6]/10;
l_tmpdisplay[1]=l_tmpdate[6]%10;
l_tmpdisplay[2]=10;
l_tmpdisplay[3]=l_tmpdate[4]/10;
l_tmpdisplay[4]=l_tmpdate[4]%10;
l_tmpdisplay[5]=10;
l_tmpdisplay[6]=l_tmpdate[3]/10;
l_tmpdisplay[7]=l_tmpdate[3]%10;
}
display(l_tmpdisplay,8);
}
void jdq(void) //继电器
{
while(1){
if(JDQ){
displaystr(OFF,3);
}
else{
displaystr(ON,2);
}
if(l_key==0x0c){
l_key=0xff;
break;
}
if(l_key==0x01){ //按1键开关继电器
l_key=0xff;
JDQ=~JDQ;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -