请教!
不知道我这个程序出错出在哪里,请各位大侠帮帮小妹我!
谢谢··!!
#include <reg52.h>
#include <intrins.h>
//#define uint unsigned int
//下面是引脚连接关系
sbit scl_ds1302 =p3^2;
sbit io_ds1302 =p3^3;
sbit rst_ds1302 =p3^4;
sbit wr = p3^6;
sbit b0=p1^0;
sbit button1=p1^4;
sbit button2=p1^5;
sbit button3=p1^6;
sbit button4=p1^7;
unsigned int data display_buffer1[8],display_buffer2[8];
unsigned char bdata data_ds1302;
sbit bit_data0=data_ds1302^0;
sbit bit_data7=data_ds1302^7;
unsigned char bdata x;
sbit x0 =x^0;
sbit x7 =x^7;
void open_write_bit();
void initial_ds1302();
unsigned char read_ds1302(char command);
void open_write_bit();
void close_write_bit();
void read_time();
void set_time();
unsigned int zhuanhuan( unsigned int b);
void display1();
void display2();
void button();
void main( void)
{
initial_ds1302(); //上电启用,否则不走时
read_time(); //读取当前的年月日时分秒在数组
b0=0;
display_buffer2[5]=0x00;
display_buffer2[4]=0x03;
display_buffer2[3]=0x00;
display_buffer2[2]=0x06;
display_buffer2[1]=0x01;
display_buffer2[0]=0x04;
display_buffer1[5]=0x00;
display_buffer1[4]=0x08;
display_buffer1[3]=0x01;
display_buffer1[2]=0x00;
display_buffer1[1]=0x05;
display_buffer1[0]=0x08; //将03年6月14日08时10分58秒设置为当前时间
set_time(); //将数组中的时间置入ds1302
while(1)
{
button();
read_time();
}
}
void display1()
{
unsigned int *p;
unsigned int i, j, k;
p = display_buffer1;
j = 0xa0;
for(i=0;i <8;i++)
{
k = *p;
k = zhuanhuan( k);
p2 = j;
wr = 0;
// while(1);
_nop_( ); _nop_( ); _nop_( ); _nop_( );
p0 = k;
_nop_( ); _nop_( );
wr = 1;
p = p + 1;
j = j + 4;
}
}
void display2()
{
unsigned int *p;
unsigned int i, j, k;
p = display_buffer2;
j = 0xa0;
for(i=0;i <8;i++)
{
k = *p;
k = zhuanhuan( k);
p2 = j;
wr = 0;
// while(1);
_nop_( ); _nop_( ); _nop_( ); _nop_( );
p0 = k;
_nop_( ); _nop_( );
wr = 1;
p = p + 1;
j = j + 4;
}
}
unsigned int zhuanhuan( unsigned int b)
{
switch( b)
{
case 0: b = 0xc0; break;
case 1: b = 0xf9; break;
case 2: b = 0xa4; break;
case 3: b = 0xb0; break;
case 4: b = 0x99; break;
case 5: b = 0x92; break;
case 6: b = 0x82; break;
case 7: b = 0xf8; break;
case 8: b = 0x80; break;
case 9: b = 0x98; break;
default: break;
}
return b;
}
void close_write_bit()
{
char i;
scl_ds1302=0;
_nop_();
rst_ds1302=1;
_nop_();_nop_();
data_ds1302=0x8e; //write control redister
for (i=1;i <=8;i++) {
scl_ds1302=0;io_ds1302=bit_data0;
_nop_();scl_ds1302=1;
data_ds1302=data_ds1302> > 1;
}
data_ds1302=0x80; //close write protect bit
io_ds1302=0;
for (i=1;i <=8;i++) {
scl_ds1302=0;io_ds1302=bit_data0;
_nop_();scl_ds1302=1;
data_ds1302=data_ds1302> > 1;
}
}
void open_write_bit()
{
char i;
scl_ds1302=0;
_nop_();
rst_ds1302=1;
_nop_();_nop_();
data_ds1302=0x8e; //write control redister
for (i=1;i <=8;i++) {
scl_ds1302=0;io_ds1302=bit_data0;
_nop_();scl_ds1302=1;
data_ds1302=data_ds1302> > 1;
}
data_ds1302=0x00; //open write protect bit
io_ds1302=0;
for (i=1;i <=8;i++) {
scl_ds1302=0;io_ds1302=bit_data0;
_nop_();scl_ds1302=1;
data_ds1302=data_ds1302> > 1;
}
}
void initial_ds1302()
{
unsigned char i;
scl_ds1302=0;
_nop_();
rst_ds1302=1;
_nop_();_nop_();
data_ds1302=0x8e; //write control redister
for (i=1;i <=8;i++) {
scl_ds1302=0;io_ds1302=bit_data0;
_nop_();scl_ds1302=1;
data_ds1302=data_ds1302> > 1;
}
data_ds1302=0x80; //close write protect bit
io_ds1302=0;
for (i=1;i <=8;i++) {
scl_ds1302=0;io_ds1302=bit_data0;_nop_();
scl_ds1302=1;data_ds1302=data_ds1302> > 1;
}
rst_ds1302=0;
_nop_();
scl_ds1302=0;
scl_ds1302=0;
_nop_();
rst_ds1302=1;
_nop_();_nop_();
data_ds1302=0x90; //recharge register
for (i=1;i <=8;i++) {
scl_ds1302=0;io_ds1302=bit_data0;_nop_();
scl_ds1302=1;data_ds1302=data_ds1302> > 1;
}
data_ds1302=0xa4; //no rechaarge for battery
for (i=1;i <=8;i++) {
scl_ds1302=0;io_ds1302=bit_data0;
_nop_();scl_ds1302=1;
data_ds1302=data_ds1302> > 1;
}
rst_ds1302=0;
_nop_();
scl_ds1302=0;
scl_ds1302=0;
_nop_();
rst_ds1302=1;
_nop_();_nop_();
data_ds1302=0x80;
for (i=1;i <=8;i++) {
scl_ds1302=0;io_ds1302=bit_data0;
_nop_();scl_ds1302=1;
data_ds1302=data_ds1302> > 1;
}
data_ds1302=0x80;
for (i=1;i <=8;i++) {
scl_ds1302=0;io_ds1302=bit_data0;
_nop_();scl_ds1302=1;
data_ds1302=data_ds1302> > 1;
}
rst_ds1302=0;
_nop_();
scl_ds1302=0;
}
unsigned char read_ds1302(char command)
{
char i;
data_ds1302=(command < <1)|0x81;
scl_ds1302=0;
_nop_();
rst_ds1302=1;
for (i=1;i <=8;i++) {
scl_ds1302=0;io_ds1302=bit_data0;
_nop_();scl_ds1302=1;
data_ds1302=data_ds1302> > 1;
}
scl_ds1302=1;
for (i=1;i <=8;i++) {
data_ds1302=data_ds1302> > 1;
scl_ds1302=0;_nop_();
bit_data7=io_ds1302;scl_ds1302=1;
}
rst_ds1302=0;
_nop_();
scl_ds1302=0;
return(data_ds1302);
}
void write_ds1302(unsigned char address,unsigned char numb) //写入时间
{
char i;
rst_ds1302=0;
scl_ds1302=0;
rst_ds1302=0;
rst_ds1302=1;
data_ds1302=0x80|(address < <1);
for (i=1;i <=8;i++) {
scl_ds1302=0;io_ds1302=bit_data0;
_nop_();scl_ds1302=1;
data_ds1302=data_ds1302> > 1;
}
data_ds1302=numb;
for (i=1;i <=8;i++) {
scl_ds1302=0;io_ds1302=bit_data0;
_nop_();scl_ds1302=1;
data_ds1302=data_ds1302> > 1;
}
rst_ds1302=0;
scl_ds1302=1;
}
void read_time() //读取时间
{
unsigned char second,minute,hour,date,month,year,d;
second=0; //read second address
d=read_ds1302(second);
display_buffer1[0]=d&0x0f;
display_buffer1[1]=d> > 4;
minute=1; //read minute address
d=read_ds1302(minute);
display_buffer1[2]=d&0x0f;
display_buffer1[3]=(d> > 4);
hour=2; //read hour address
d=read_ds1302(hour);
display_buffer1[4]=d&0x0f;
display_buffer1[5]=(d> > 4);
date=3;
d=read_ds1302(date);
display_buffer2[0]=d&0x0f;
display_buffer2[1]=(d> > 4); //read data address
month=4;
d=read_ds1302(month);
display_buffer2[2]=d&0x0f;
display_buffer2[3]=(d> > 4); //read month address
year=6;
d=read_ds1302(year);
display_buffer2[4]=d&0x0f;
display_buffer2[5]=(d> > 4); //read year address
}
void set_time()
{
unsigned char data temp;
unsigned char data hour_address,minute_address,second_address,year_address,month_address,date_address;
year_address=6;
month_address=4;
date_address=3;
hour_address = 2;
minute_address = 1;
open_write_bit();
temp=(display_buffer2[5] < <4)|display_buffer2[4];
write_ds1302(year_address,temp);
temp=(display_buffer2[3] < <4)|display_buffer2[2];
write_ds1302(month_address,temp);
temp=(display_buffer2[1] < <4)|display_buffer2[0];
write_ds1302(date_address,temp);
temp=(display_buffer1[5] < <4)|display_buffer1[4];
write_ds1302(hour_address,temp);
temp=(display_buffer1[3] < <4)|display_buffer1[2];
write_ds1302(minute_address,temp);
temp=(display_buffer1[1] < <4)|display_buffer1[0];
write_ds1302(second_address,temp);
close_write_bit();
}
void button()
{
unsigned char data button1,button2,button3,button4;
char i;
if(button1=0)
{
for(i=0;i <8;i++)
{
display_buffer1[i]=0;
display2();
}
}
else if(button2=0)
{ display_buffer1[5]=display_buffer1[5]+1; }
else if(button3=0)
{ display_buffer1[3]=display_buffer1[3]+1; }
else if(button4=0)
{ display_buffer2[1]=display_buffer2[1]+1; }
else{ display1(); }
}
发表时间:2003年6月6日19:26:10