小弟新学单片机,用ds1302和单片机做了一个时钟,采用24小时模式,一共六个数码管,显示时分秒,并可调整时间!显示已经正常,就是在做调整时间那一部分的时候,当按下set_mod_key的时候时钟停止读取,定格在最后显示上面,秒部分清零;然后按下sel_led_key的时候选择对哪个数码管进行调整,并且要调整的数码管进行闪烁(只调整小时和分钟);当按下display_inc_key的时候当前闪烁的数码管会加一;当按下ok_set键的时候就会把修改的数据写入ds1302中,并启动时钟,目前遇到的情况就是不能实现闪烁,并且不能进行调整!程序如下,求高手帮助,感激,谢谢!
#include <at89x52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
void write_byte(uchar byte); //向ds1302中写入一个字节
uchar read_byte(uchar byte);//从ds1302中读出一个字节
void init_ds1302();//对ds1302中存放的时、分、秒进行初始化
void display();//在数码管上进行显示
void read_to_exchange();//把从ds1302中读取的数据转换为数码管输出需要的数据
void key_set();//四个按键设置
void write_data(uchar addr,uchar w_data);//写入寄存器地址并写入数据
uchar read_data(uchar addr);//写入一个寄存器地址并读取其中数据
void delay1ms(uint time); //约延时time微秒
sbit CE = P1^0;//复位总线,用P1的第零位进行操作
sbit SCLK = P1^1; //时钟控制总线,用P1的第一位来进行操作
sbit IO_DATA = P1^2;//数据传送线
sbit sel_mod_key = P3^0;//开始进行时间设置
sbit display_inc_key = P3^2;//数码管显示的数据循环加一
sbit ok_key = P3^3;//确定修改
sbit sel_led_key = P3^1;//选择要修改的数码管
bit C = 0;
//数字0~9在数码管上显示时代替的值
uchar disbuf_code[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//从ds1302中读取信息并转换成数码管显示的值
uchar disbuf[6] = {0x00};
//选择哪个数码管显示
uchar sel_chip[6] = {0x01,0x02,0x04,0x08,0x10,0x20};
//读命令地址
uchar read_add[3] = {0x81,0x83,0x85};
//写命令地址
uchar write_add[3] = {0x80,0x82,0x84};
uchar time_sbuf[3] = {0x00}; //暂时存放读取的时,分,秒数据
uchar position = 0;//用来控制显示数码管
uchar set_flag = 0;//用来确定进行调整,当其按下时,开始进行时间调整
uchar mod_flag = 3;//标志位,用来确定哪个数码管闪烁,并对其进行调整
uchar k = 0;
/*void uartinit()
{
TMOD=0x20; //T1方式2
TH1=0xFD; //24M 9600 F3
TL1=0xFD;
SCON=0xd8; //d8
// PCON=0x80; //80
TR1=1;
// ES = 1;
}
void uartsendchar(uchar a)
{
SBUF=a;
while(TI==0);
TI=0;
} */
void main()
{
CE = 0;
SCLK = 0;
init_ds1302();
TMOD = 0x01;//设置定时器T0为方式1,并写入初值,以及定时器允许设置和启动
TH0 = 0xfd;
TL0 = 0xcc;
EA = 1;
ET0 = 1;
TR0 = 1;
// uartinit();
while(1)
{
read_to_exchange();
key_set();
}
}
void read_to_exchange()//从ds1302中读取数据,并转化成可在数码管上显示的数据
{
// write_data(0x8e,0x00);
time_sbuf[2] = read_data(read_add[0]);
time_sbuf[1] = read_data(read_add[1]);
time_sbuf[0] = read_data(read_add[2]);
// write_data(0x8e, 0x80);
disbuf[0] = disbuf_code[time_sbuf[0]>>4];
disbuf[1] = disbuf_code[time_sbuf[0]&0x0f] | 0x80;
disbuf[2] = disbuf_code[time_sbuf[1]>>4];
disbuf[3] = disbuf_code[time_sbuf[1]&0x0f] | 0x80;
disbuf[4] = disbuf_code[time_sbuf[2]>>4];
disbuf[5] = disbuf_code[time_sbuf[2]&0x0f];
}
uchar read_byte()
{
uchar receive_data = 0;
uchar k;
EA = 0;
IO_DATA = 1;
for(k = 0; k < 8; k++)
{
receive_data >>= 1;
SCLK = 1;
_nop_();
_nop_();
SCLK = 0;
C = IO_DATA;
_nop_();
if(C == 1)
{
receive_data |= 0x80;
}
else
{
receive_data &= 0x7f;
}
SCLK = 1;
_nop_();
_nop_();
}
SCLK = 0;
_nop_();
_nop_();
EA = 1;
return receive_data;
}
void write_byte(uchar byte)
{
uchar j;
EA=0;
for(j = 0; j < 8; j++)
{
SCLK = 0;
_nop_();
_nop_();
if(byte & 0x01)
{
C = 1;
}
else
{
C = 0;
}
IO_DATA = C;
_nop_();
_nop_();
SCLK = 1;
_nop_();
_nop_();
byte = byte >> 1;
}
EA=1;
}
uchar read_data(uchar addr)
{
uchar r_data;