| 
 
| 做个ds1302的可调时钟,两个键。一个负责调整该调时,分,秒等,另一个按键负责加。 //选择设置那个项目1,2,3,4,5,6对应秒,分,时;日,月,年
 void ProChs(void)
 {
 if(keyNum == 1)
 {
 keyNum = 0;
 func++;
 if(func > 1)
 led0 = 0;
 if(func > 6)
 func = 0;
 }
 }
 
 data[]是个全局变量
 void AdjusProject(void)
 {
 u8 low = 0;
 u8 hgt = 0;  //BCD 码最低位加到9后就会进位,我用16进制的话要加到15才进位,所以这里设置BCD高位和低位
 switch(func)
 {
 case 1://这是秒钟设置
 {
 low = (data[0] & 0x0f);
 hgt = (data[0] >> 4);    //BCD 处理
 if(keyNum == 2)//加键按下
 {
 keyNum = 0;
 hgt += 1;//实际上每次调10秒
 if(hgt > 5)
 {
 hgt = 0;
 low = 0;
 data[0] = 0;
 }
 data[0] = hgt << 4 + low;
 disp();  //显示数据这里实际上仅仅是刷新屏幕,并没有操作芯片
 WriteData();//把调整完的数据写进芯片
 }
 
 }break;
 case 2://这是分钟设置
 {
 low = (data[1] & 0x0f);
 hgt = (data[1] >> 4);
 if(keyNum == 2)//加键按下
 {
 keyNum = 0;
 low++;
 LcdShowNum(low,0xc8); //这句是想测试low到底有没有增加
 if(low > 9)
 {
 low = 0;
 hgt++;
 if(hgt > 5)
 {
 hgt = 0;
 }
 }
 data[1] = hgt << 4 + low;
 disp();  //显示数据这里实际上仅仅是刷新屏幕,并没有操作芯片
 WriteData();//把调整完的数据写进芯片
 
 }
 }break;
 case 3://这是时设置
 {
 low = (data[2] & 0x0f);
 hgt = (data[2] >> 4);
 if(keyNum == 2)//加键按下
 {
 keyNum = 0;
 low++;
 if(low > 9)
 {
 low = 0;
 hgt++;
 if(hgt > 2)
 {
 hgt = 0;
 }
 }
 data[2] = hgt << 4 + low ;
 disp();  //显示数据这里实际上仅仅是刷新屏幕,并没有操作芯片
 WriteData(); //把调整完的数据写进芯片
 }
 }break;
 default:break;
 }
 }
 
 
 主函数中
 while(1)
 {
 ProChs(); //调整
 ReadData();
 AdjusProject();
 disp();
 }
 问题:首先请大家看看我的这个思路是否有问题?先通过功能键选择要调那个项目,然后到那个项目下按加键调节
 2,为什么在走到分设置时,按加键,始终不能加?
 3,为什么每次进入调时间的时候,该调的项就显示为0,我先读的初始化中数据啊,一按下加键,至少是在原来初始化数据的基础上变化吧为什么直接跳到0?
 4,当时,分的数据跳到0后,再怎么按键数据都不会变化?
 
 ds1302,按键检测,lcd这些基本的程序都没有问题的。主要是不是我上面的逻辑有错误?谢谢
 
 | 
 |