做个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这些基本的程序都没有问题的。主要是不是我上面的逻辑有错误?谢谢
|