前段时间学习12887后来有事耽搁了,现在重新学习,程序和电路都焊好了,可是一开机分钟就一直在2和4之间跳,秒就没变化,硬件接线我都跟网上的对了没什么问题,程序看了好久也找不出问题。希望搞过个这个的前辈指点一下兄弟谢谢了!
/*
DS12887时钟
*/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uint shi_jian;
sbit CS=P2^3; // 片选
sbit DS=P2^6; // 读允许
sbit AS=P2^4; // 地址锁存
sbit RW=P2^5; // 写允许
sbit h_gao=P3^1; // 数码管小时位-1
sbit h_di=P3^2; // 数码管小时位-2
sbit m_gao=P3^4; // 数码分钟位-1
sbit m_di=P3^5; // 数码分钟位-2
/* 子函数 */
void init(); //初始化函数
void write_887(uchar add,uchar date); //写12887函数
uchar read_887(uchar add); // 读12887函数
void delay(uchar k); //延时函数
void display(); //数码管显示函数
unsigned char table[]= //数组
{0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90}; //0~~9段码 共阳极
void main()
{
init(); //开机初始化
while(1)
{
display(); //数码管循环显示时间
}
}
/* 写入函数 */
void write_887(uchar add,uchar date)
{
CS=0;
DS=1;
RW=1;
AS=1;
P1=add;
AS=0;
RW=0;
P1=date;
RW=1;
AS=1;
CS=1;
}
/* 读取函数 */
uchar read_887(uchar add)
{
CS=0;
DS=1;
RW=1;
AS=1;
P1=add;
AS=0;
DS=0;
shi_jian=P1;
DS=1;
AS=1;
CS=1;
return shi_jian;
}
/* 延时函数 */
void delay(uchar k)
{
uchar x,y;
for(x=k;x>0;--x)
{
for(y=110;y>0;--y)
{}
}
}
void init()
{
write_887(0x0A,0x20); //开启震荡器
write_887(0x0B,0x86); //10000110 禁止更新数据,二进制,24小时制,
write_887(0x02,0x0c); //初始时间 分=12
write_887(0x04,0x0c); //初始时间 时=12
write_887(0x0B,0x06); // 00000110 二进制数据;24小时格式;无中断输出 ;
}
//*********** 显示函数 ************
void display()
{
uchar shi_gao,shi_di,fen_gao,fen_di;
uint time_date;
time_date=read_887(0x02); //读取12887的时间
shi_gao=time_date/10; //分离高位
shi_di=time_date%10; //分离低位
P0=table[shi_gao ]; // 高位段码数据
h_gao=1; //位选
delay(2);
h_gao=0; // 显示小时
P0=table[shi_di]; // 低位段码数据
h_di=1; //位选
delay(2);
h_di=0;
/********************/
time_date=read_887(0x00); //读取12887的时间
fen_gao=time_date/10; //分离高位
fen_di=time_date%10; //分离低位
P0=table[fen_gao ]; // 高位段码数据
m_gao=1; //位选
delay(2);
m_gao=0; // 显示分钟
P0=table[fen_di]; // 低位段码数据
m_di=1;
delay(2);
m_di=0;
}
很简单的程序,没什么调时功能,我只是想把它正确的读出来,有过的朋友麻烦帮帮忙!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>