这是我的源程序,一运行6位数码管全部显示0,是不是因为IO不该用RC4啊,因为我看网上好多人都用RC5作为IO,求救啊,最近要交货了,连这个小程序都弄不出来 哎呀
附:源代码
#include "pic.h"
#include"math.h"
#define IO RC4 //定义DS1302的数据口
#define CLK RC3 //定义DS1302的时钟口
#define RST RC2 //定义DS1302的复位口
#define uchar unsigned char //宏定义uchar为无符号字符型
#define uint unsigned int //宏定义uint为无符号整型
uchar ACC;
const uchar table2[]={0x22,0x22,0x10,0x11,0x00,0x11,0x00}; //初值显示
uchar table1[7]; //总缓存数组
uchar set_tab[7]; //调整时间后的缓存数组
const char table[] = { 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00};
unsigned char TABLE_BIT_SELECT[]={0x01,0x02,0x04,0x20,0x10,0x08};
//unsigned char TABLE_NUMBER[]={ZERO,ONE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE};
unsigned char TABLE_NUMBER[]={0x00,0x08,0x01,0x09,0x02,0x0a,0x03,0x0b,0x04,0x0c};
char sec,min,hou,day,month,week,year,weekadd,week1;//秒,分,时,日,月,星期,年,星期时间选择参数
uchar count,i; //用于计数button2的次数;用于延时计数
uchar a,b; //用于十六进制码转换成BCD码的寄存变量
uchar *pda; //用于设置时间的指针变量
void delay(uchar dly); //延时函数n毫秒
/*******************************************/
// ds1302模块
/*******************************************/
/****************八位数据写入函数*********************/
void inputbyte(uchar cdata)
{
uchar i;
TRISC=0;
ACC=cdata;
for(i=8;i>0;i--)
{
if(ACC&0x01==1)
IO=0x01;
else
IO=0;
CLK=1;
CLK=0;
//delay(50);
ACC=ACC>>1; //在时钟上升沿写入一位数据
}
//CLK=0;////
}
/***************八位数据读出函数*********************/
uchar outputbyte(void)
{
uchar i;
// uchar cdata=0;
TRISC=0x10;
for(i=8;i>0;i--)
{
ACC =ACC >> 1;
if(PORTC&0x10==0x10)
{
ACC|=0x80;
}
else ACC&=0x7f;
CLK = 1;
CLK = 0;
}
return(ACC);
TRISC=0;
}
/*************************************************************/
//名称:re_1302
//功能:读出对应寄存器的内容
//调用:inputbyte(uchar cdata)、outputbyte(void)
/***************************************************************/
uchar re_1302(uchar add)
{
uchar cdata;
TRISC=0;
RST=0;
CLK=0;
RST=1;
inputbyte(add);
cdata = outputbyte();
CLK=1;
RST=0;
delay(40);
return(cdata);
}
/*********************************************************/
//名称:wr_1302
//功能:将指令或数据写入对应寄存器
//调用:inputbyte(uchar cdata)
/******************************************************************/
void wr_1302(uchar add,uchar cdata)
{
TRISC=0;
RST=0;
CLK=0;
RST=1;
inputbyte(add);
inputbyte(cdata);
CLK=1;
RST=0;
//delay(40);
}
/**************************************************************/
//名称:set_1302
//功能:设置时间初值
//调用:wr_1302(uchar add,uchar cdata)
/***************************************************************/
void set_1302(uchar *pda)
{
uchar i;
uchar add=0x80;
wr_1302(0x8e,0x00); //将控制寄存器值设为零,最高位WP=0允许写
for(i=7;i>0;i--) //将七个时间初值写入对应寄存器
{
wr_1302(add,*pda++); //写对应时钟寄存器的值
add+=2;
}
wr_1302(0x8e,0x80); //写保护,防止干扰影响时间值??????????
}
/*******************************************************************/
//名称:get_1302
//功能:读取当前时间值
//调用函数:re_1302() 、 BCD_transform()
/*******************************************************************/
void get_1302()
{
uchar i;
uchar add=0x81;
for(i=0;i<7;i++)
{
table1=re_1302(add); //读对应时钟寄存器的值
add+=2;
}
}
/****************************************************************************
* 名 称:display()
* 功 能:数码管显示
* 入口参数:
* 出口参数:
* 说 明:
****************************************************************************/
void display()
{
int i, temp, temp1; //定义查表变量
i = table1[0] & 0x0f; //求秒的个位
PORTD = TABLE_NUMBER; //点亮秒的个位
//PORTD=i;
PORTA = TABLE_BIT_SELECT[0];
delay(10); //延长一段时间,保证亮度
i = table1[0] & 0xf0; //求秒的十位
i = i >> 4; //右移4位
PORTD =TABLE_NUMBER; //送D口显示
//PORTD=i;
PORTA = TABLE_BIT_SELECT[1]; //点亮秒的十位
delay(10); //延长一段时间,保证亮度
i = table1[1] & 0x0f; //求分的个位
PORTD =TABLE_NUMBER ; //送D口显示,并显示小数点
//PORTD=i;
PORTA = TABLE_BIT_SELECT[2]; //点亮分的个位
delay(10); //延时一定时间,保证亮度
i = table1[1] & 0xf0; //求分的十位
i = i >> 4;
PORTD = TABLE_NUMBER; //送D口显示
//PORTD=i;
PORTA = TABLE_BIT_SELECT[3]; //点亮分的十位
delay(10); //延长一段时间,保证亮度
i = table1[2] & 0x0f; //求时的个位
PORTD = TABLE_NUMBER ; //送D口显示,并加上小数点
//PORTD=i;
PORTA = TABLE_BIT_SELECT[4]; //点亮时的个位
delay(10); //延时一定时间,保证亮度
i = table1[2] & 0xf0; //求时的十位
i = i >> 4;
PORTD =TABLE_NUMBER;
//送D口显示
//PORTD=i;
PORTA = TABLE_BIT_SELECT[5]; //点亮时的十位
delay(10); //延长一段时间,保证亮度
}
/****************************************************************************
* 名 称:ds1302_init()
* 功 能:DS1302初始化
* 入口参数:
* 出口参数:
* 说 明:
****************************************************************************/
void ds1302_init()
{
CLK=0; //拉低时钟信号
RST=0; //复位DS1302
RST=1; //使能DS1302
//inputbyte(0x8e); //发控制命令
//inputbyte(0); //允许写DS1302
RST=0; //复位
}
/****************************************************************************
* 名 称:port_init()
* 功 能:引脚初始化
* 入口参数:
* 出口参数:
* 说 明:
****************************************************************************/
void port_init()
{
ADCON1 = 0X07; //设置A口为普通I/O口
//TRISB = 0X0F; //设置B口低4位为输入//高四位为输出
SSPCON=0;
TRISD = 0; //portd 输出
TRISA = 0; //porta 输出
PORTA = 0x3f; //先关闭所有显示
PORTD = 0x08;
TRISC = 0X00; //rc输出
}
/****************************************************************************
* 名 称:delay()
* 功 能:延时
* 入口参数:
* 出口参数:
* 说 明:
****************************************************************************/
void delay(uchar dly) //延时程序
{ //定义整形变量
for (;dly>0;dly--); //延时
}
/***********************************************************/
//功能:主函数
//调用:set_1302()、get_1302()、display()
/************************************************************/
void main()
{
port_init(); //调用引脚初始化函数
ds1302_init(); //调用DS1302初始化函数
set_1302(table); //调用设置时间函数
while (1)
{ get_1302();
//调用取时间函数
display(); //调用显示函数
}
}
if you are trained as a programmer, you should ask the school for a full refund of your tuition.
having said that, I would suggest that divide up the program in three blocks:
1) display - make sure that if you send it data, it can properly display;
2) 3-wire - make sure that you have a working set of 3-wire routines to communicate to the chip
3) ds1302 - make sure that you can talk to the chip utilizing the 3-wire routines.
otherwise, you are going to have a hard time getting there.
一周热门 更多>