?? lhj.c
字號:
l_key=0xff;
if(tmp<3){
tmp++;
l_key=0xfe;
}
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 + -