|
用DS1302做东西,先在开发板上调试。所以1302的时间直接在代码里面写死。反复读时间然后扫描显示数码管。数码管是2个四位的,共八位。用其中的6位。
首先,开发板MCU是STC89LE52RC,整个开发板功能完全正常没有问题。
代码如下,可以正常编译,下载。功能完全正常,所有预期目标都有实现。但是有如下问题。
可以看到,代码里完全没有用到定时器和中断。但是,如果在代码中将 EA=1;ET0=1; TR0=1; 这三句中的任何一句、两句或者三句都注释掉的话,数码管的显示就不正常了,具体表现为,表示时、分的四位都正常,表示秒的十位也正常,但是个位显示莫名的不在 led_ca_table 里面的符号。
如果加入串口调试信息,可以看到hour,min,sec三个变量的值依然是对的。dis_index对应的led_an_table的值也是正确的。但是display[5]的值异常。但是仅仅是显示异常。每秒钟sec_led对应的LED灯亮灭,10秒钟,60秒钟数码管的进位等等行为正常。
也试过数码管扫描不用延时用T0的中断,现象类似。同样是秒个位显示异常。
各位帮忙看看这到底是什么情况呃osz
#include
sbit CE = P4^0;
sbit IO = P4^1;
sbit SCLK = P4^2;
sbit sec_led = P1^7;
void reset();
unsigned char read_byte();
unsigned char sec,min,hour,date,month,day,year,pre_sec,dis_index,i,j;
unsigned char code led_ca_table[]={0xC0,0xCF,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
unsigned char code led_an_table[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB};
unsigned char display[5];
void write_byte(unsigned char W_Byte);
void release();
void initial();
void main()
{
P2=0xFF;
P1=0x80;
EA=1;
dis_index=0;
pre_sec=99;
initial();
reset();
write_byte(0x8E);
write_byte(0);
reset();
write_byte(0xBE); //burst write
write_byte(0); //sec
write_byte(0x01); //minute
write_byte(0x01); //hour 24mode
write_byte(0x01); //date
write_byte(0x05); //month
write_byte(0x04); //day
write_byte(0x14); //year
write_byte(0x80); //control write protect
release();
ET0=1;
TR0=1;
while(1)
{
reset();
write_byte(0xBF); //butst read
sec=read_byte();
min=read_byte();
hour=read_byte();
date=read_byte();
month=read_byte();
day=read_byte();
year=read_byte();
release();
if (sec!=pre_sec)
{
sec_led=~sec_led;
pre_sec=sec;
display[0]=led_ca_table[hour/0x10];
display[1]=led_ca_table[hour%0x10];
display[2]=led_ca_table[min/0x10];
display[3]=led_ca_table[min%0x10];
display[4]=led_ca_table[sec/0x10];
display[5]=led_ca_table[sec%0x10];
}
for (dis_index=0;dis_index<6;dis_index++)
{
P0=display[dis_index];
P2=led_an_table[dis_index];
for (i=0;i<5;i++)
for (j=0;j<110;j++);
}
}
}
void initial()
{
reset();
write_byte(0x8E);
write_byte(0); /* disable write protect */
reset();
write_byte(0x90); /* trickle charger register */
write_byte(0xA6); /* enable, 1 diodes, 4K resistor */
reset();
write_byte(0x8E);
write_byte(0x80); /* enable write protect */
release();
}
unsigned char read_byte() /* ------- read one byte from DS1302 -------- */
{
unsigned char i,R_Byte,temp;
R_Byte = 0x00;
IO = 1;
for(i = 0; i < 8; i++)
{
SCLK = 1;
SCLK = 0;
temp = (unsigned char)IO;
temp <<= 7;
R_Byte >>= 1;
R_Byte |= temp;
}
return R_Byte;
}
void reset() /* ----- reset and enable the 3-wire interface ------ */
{
SCLK = 0;
CE = 0;
CE = 1;
}
void release()
{
SCLK = 0;
CE = 0;
IO = 0;
}
void write_byte(unsigned char W_Byte) /* ------ write one byte to DS1302 ------- */
{
unsigned char i;
for(i = 0; i < 8; i++)
{
IO = 0;
if(W_Byte & 0x01)
IO = 1;
SCLK = 0;
SCLK = 1;
W_Byte >>= 1;
}
}
|
|