f556 发表于 2020-5-9 14:36 谢谢,懂了 |
benclee 发表于 2020-4-29 08:32 谢谢,懂了 |
BCD码的每4位表示十进制的0~9,超过9则按十进制进位,数字本身按HEX存储,浪费点存储,但人眼可直观查。如: 0x89------>是十进制的89,低4位超过9时,要进位到高4位,按十六进制+6,跳过A BCDEF,而不是0x8a(真HEX) |
十六进制比十进制每一位多六,所以加六。 |
benclee 发表于 2020-4-29 08:32 感谢,这一点我想明白了!! |
这个转法不对吧。如果数大转的就不对了 如 45=0x2d->00101101+00000110=00110011->0x33了。 |
例如为10,就是00001010=0X0A 10=0X0A->00001010+00000110=00010000=0X10 11=0X0B->00001011+00000110=00010001=0X11 12=0X0C->00001100+00000110=00010010=0X12 19=0X13->00010011+00000110=00011001=0X19 |
#include<reg51.h> #include"lcd.h" #include"ds1302.h" sbit K1=P3^1; sbit K2=P3^0; sbit K3=P3^2; sbit K4=P3^3; void Int0Configuration(); void LcdDisplay(); void Keyscan(); bit SetState; unsigned char SetPlace ; void Delay10ms() ; void main() { Int0Configuration(); LcdInit(); Ds1302Init(); while(1) { if(SetState==0) { Ds1302ReadTime(); LcdDisplay(); if(SetState==1) { Keyscan(); } } } } void LcdDisplay() { if(SetState==0) { LcdWriteCom(0x80+0X40); LcdWriteData('0'+TIME[2]/16); //时 LcdWriteData('0'+(TIME[2]&0x0f)); LcdWriteData('-'); LcdWriteData('0'+TIME[1]/16); //分 LcdWriteData('0'+(TIME[1]&0x0f)); LcdWriteData('-'); LcdWriteData('0'+TIME[0]/16); //秒 LcdWriteData('0'+(TIME[0]&0x0f)); LcdWriteCom(0x80); LcdWriteData('2'); LcdWriteData('0'); LcdWriteData('0'+TIME[6]/16); //年 LcdWriteData('0'+(TIME[6]&0x0f)); LcdWriteData('-'); LcdWriteData('0'+TIME[4]/16); //月 LcdWriteData('0'+(TIME[4]&0x0f)); LcdWriteData('-'); LcdWriteData('0'+TIME[3]/16); //日 LcdWriteData('0'+(TIME[3]&0x0f)); LcdWriteCom(0x80+12); switch(TIME[5]&0x0f) //周 { case (1): LcdWriteData('M');LcdWriteData('0');LcdWriteData('N');break; case (2): LcdWriteData('T');LcdWriteData('U');LcdWriteData('E');break; case (3): LcdWriteData('W');LcdWriteData('E');LcdWriteData('D');break; case (4): LcdWriteData('T');LcdWriteData('H');LcdWriteData('U');break; case (5): LcdWriteData('F');LcdWriteData('R');LcdWriteData('I');break; case (6): LcdWriteData('S');LcdWriteData('A');LcdWriteData('T');break; case (7): LcdWriteData('S');LcdWriteData('U');LcdWriteData('N');break; } } if(SetState==1) { switch(SetPlace) { case(0):LcdWriteCom(0x80+0x40+7);LcdWriteCom(0x0e);break; //光标指向--秒// case(1):LcdWriteCom(0x80+0x40+4);break; //光标指向--分// case(2):LcdWriteCom(0x80+0x40+1);break; //光标指向--时// case(3):LcdWriteCom(0x80+9);break; //光标指向--日// case(4):LcdWriteCom(0x80+6);break; //光标指向--月// case(5):LcdWriteCom(0x80+12);break; //光标指向--周// case(6):LcdWriteCom(0x80+3);break; //光标指向--年// } } } void Keyscan() { unsigned char i; if(K4==0) //检测按键K4是否按下 { Delay10ms(); //消除抖动 if(K4==0) { SetPlace++; if(SetState==1) { if(SetPlace>=7) SetPlace=0; } } LcdDisplay(); while((i<50)&&(K4==0)) //检测按键是否松开 { Delay10ms(); i++; } i=0; } if(K1==0) //检测按键K2是否按下 { Delay10ms(); //消除抖动 if(K1==0) { if(SetState==1) { TIME[SetPlace]++; if((TIME[SetPlace]&0x0f)>9) //换成BCD码。 { TIME[SetPlace]=TIME[SetPlace]+6; } if((TIME[SetPlace]>=0x60)&&(SetPlace<2)) //分秒只能到59 { TIME[SetPlace]=0; } if((TIME[SetPlace]>=0x24)&&(SetPlace==2)) //小时只能到23 { TIME[SetPlace]=0; } if((TIME[SetPlace]>=0x32)&&(SetPlace==3)) //日只能到31 { TIME[SetPlace]=0x01; } if((TIME[SetPlace]>=0x13)&&(SetPlace==4)) //月只能到12 { TIME[SetPlace]=0x01; } if((TIME[SetPlace]>=0x8)&&(SetPlace==5)) //周只能到7 { TIME[SetPlace]=0x01; } if((TIME[SetPlace]>=0x9a)&&(SetPlace==6)) //年只能到99 { TIME[SetPlace]=0; } } LcdDisplay(); while((i<50)&&(K1==0)) //检测按键是否松开 { Delay10ms(); i++; } i=0; } } } void Int0() interrupt 0 { Delay10ms(); if(K3==0) { Delay10ms() ; if(K3==0) { SetPlace=0; if(SetState==0) { LcdDisplay(); } if(SetState==1) { SetPlace++; } } }while(!K3); } void Int0Configuration() { //设置INT0 IT0=1;//跳变沿出发方式(下降沿) EX0=1;//打开INT0的中断允许。 EA=1;//打开总中断 } void Delay10ms() //误差 0us { unsigned char a,b,c; for(c=1;c>0;c--) for(b=38;b>0;b--) for(a=130;a>0;a--); } |