Bug也很明显 就是会显示ff 编译没有错误 可运行
main.c
#include <REGX52.H>
#include "ds1302.h"
#include "Nixie.h"
unsigned char Write_address[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
unsigned char Read_address[]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
//Time init 2022.1.18. Saturday .17.59.50
unsigned char Time[7]={0x50,0x59,0x17,0x18,0x01,0x06,0x22};
void DS1302_Init(){
unsigned char i;
Ds1302_Single_Byte_Write(0x8e,0x00);
for(i=0;i<7;i++){
Ds1302_Single_Byte_Write(Write_address[i],Time[i]);
}
Ds1302_Single_Byte_Write(0x8e,0x80);
}
void DS1302_time(){
unsigned char i;
for(i=0;i<7;i++){
Time[i]=Ds1302_Single_Byte_Read(Read_address[i]);
}
}
void main(){
P2=(P2&0x1f)|0x80;
P0=0xff;
P2=(P2&0x1f)|0xa0;
P0=0x00;
DS1302_Init();
while(1){
DS1302_time();
Nixie_Last_three(Time[2],Time[1],Time[0]);
}
}
Nixie.c
#include <REGX52.H>
unsigned char code Nixie_Show[]={
0xC0,0xF9,0xA4,0xB0,0x99,
0x92,0x82,0xF8,0x80,0x90,
0x88,0x80,0xC6,0xC0,0x86,
0x8E,0xBF,0x7F};
void Delay(unsigned char xms) //@12.000MHz
{
unsigned char i, j;
while(xms>0){
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
void NixieShow(unsigned char Locate,Number){
P2=(P2&0x1f)|0xc0;
P0=0x01<<(Locate-1);
P2=(P2&0x1f)|0xe0;
P0=Nixie_Show[Number];
Delay(1);
}
void Nixie_First_three(unsigned char Year,Month,Day){
NixieShow(1,Year/16);
Delay(10);
NixieShow(2,Year%16);
Delay(10);
NixieShow(3,16);
Delay(10);
NixieShow(4,Month/16);
Delay(10);
NixieShow(5,Month%16);
Delay(10);
NixieShow(6,16);
Delay(10);
NixieShow(7,Day/16);
Delay(10);
NixieShow(8,Day%16);
Delay(10);
}
void Nixie_Last_three(unsigned char Hour,Minute,Second){
NixieShow(1,Hour/16);
Delay(10);
NixieShow(2,Hour%16);
Delay(10);
NixieShow(3,16);
Delay(10);
NixieShow(4,Minute/16);
Delay(10);
NixieShow(5,Minute%16);
Delay(10);
NixieShow(6,16);
Delay(10);
NixieShow(7,Second/16);
Delay(10);
NixieShow(8,Second%16);
Delay(10);
}
ds1302.c 这里就是蓝桥杯官方给的底层驱动代码
有一部分乱码是使用了汉字
#include "ds1302.h"
/********************************************************************/
/*µ¥×Ö½ÚдÈëÒ»×Ö½ÚÊý¾Ý*/
void Write_Ds1302_Byte(unsigned char dat)
{
unsigned char i;
SCK = 0;
for (i=0;i<8;i++)
{
if (dat & 0x01) // µÈ¼ÛÓÚif((addr & 0x01) ==1)
{
SDA_SET; //#define SDA_SET SDA=1 /*µçƽÖøß*/
}
else
{
SDA_CLR; //#define SDA_CLR SDA=0 /*µçƽÖõÍ*/
}
SCK_SET;
SCK_CLR;
dat = dat >> 1;
}
}
unsigned char Read_Ds1302_Byte(void)
{
unsigned char i, dat=0;
for (i=0;i<8;i++)
{
dat = dat >> 1;
if (SDA_R) //µÈ¼ÛÓÚif(SDA_R==1) #define SDA_R SDA /*µçƽ¶ÁÈ¡*/
{
dat |= 0x80;
}
else
{
dat &= 0x7F;
}
SCK_SET;
SCK_CLR;
}
return dat;
}
void Ds1302_Single_Byte_Write(unsigned char addr, unsigned char dat)
{
RST_CLR; /*RST½ÅÖõͣ¬ÊµÏÖDS1302µÄ³õʼ»¯*/
SCK_CLR; /*SCK½ÅÖõͣ¬ÊµÏÖDS1302µÄ³õʼ»¯*/
RST_SET; /*Æô¶¯DS1302×ÜÏß,RST=1µçƽÖÃ¸ß */
addr = addr & 0xFE;
Write_Ds1302_Byte(addr); /*дÈëÄ¿±êµØÖ·£ºaddr,±£Ö¤ÊÇд²Ù×÷,д֮ǰ½«×îµÍλÖÃÁã*/
Write_Ds1302_Byte(dat); /*дÈëÊý¾Ý£ºdat*/
RST_CLR; /*Í£Ö¹DS1302×ÜÏß*/
}
/********************************************************************/
/*´ÓDS1302µ¥×Ö½Ú¶Á³öÒ»×Ö½ÚÊý¾Ý*/
unsigned char Ds1302_Single_Byte_Read(unsigned char addr)
{
unsigned char temp;
RST_CLR; /*RST½ÅÖõͣ¬ÊµÏÖDS1302µÄ³õʼ»¯*/
SCK_CLR; /*SCK½ÅÖõͣ¬ÊµÏÖDS1302µÄ³õʼ»¯*/
RST_SET; /*Æô¶¯DS1302×ÜÏß,RST=1µçƽÖÃ¸ß */
addr = addr | 0x01;
Write_Ds1302_Byte(addr); /*дÈëÄ¿±êµØÖ·£ºaddr,±£Ö¤ÊǶÁ²Ù×÷,д֮ǰ½«×îµÍλÖøß*/
temp=Read_Ds1302_Byte(); /*´ÓDS1302ÖжÁ³öÒ»¸ö×Ö½ÚµÄÊý¾Ý*/
RST_CLR; /*Í£Ö¹DS1302×ÜÏß*/
return temp;
}
ds1302.h
#ifndef __DS1302_H__
#define __DS1302_H__
#include<regx52.h>
#include<intrins.h>
sbit SCK=P1^7;
sbit SD=P2^3;
sbit RST=P1^3;
/*¸´Î»½Å*/
#define RST_CLR RST=0 /*µçƽÖõÍ*/
#define RST_SET RST=1 /*µçƽÖøß*/
/*Ë«ÏòÊý¾Ý*/
#define SDA_CLR SD=0 /*µçƽÖõÍ*/
#define SDA_SET SD=1 /*µçƽÖøß*/
#define SDA_R SD /*µçƽ¶ÁÈ¡*/
/*ʱÖÓÐźÅ*/
#define SCK_CLR SCK=0 /*ʱÖÓÐźÅ*/
#define SCK_SET SCK=1 /*µçƽÖøß*/
#define ds1302_sec_addr 0x80 //ÃëÊý¾ÝµØÖ·
#define ds1302_min_addr 0x82 //·ÖÊý¾ÝµØÖ·
#define ds1302_hr_addr 0x84 //ʱÊý¾ÝµØÖ·
#define ds1302_date_addr 0x86 //ÈÕÊý¾ÝµØÖ·
#define ds1302_month_addr 0x88 //ÔÂÊý¾ÝµØÖ·
#define ds1302_day_addr 0x8A //ÐÇÆÚÊý¾ÝµØÖ·
#define ds1302_year_addr 0x8C //ÄêÊý¾ÝµØÖ·
#define ds1302_control_addr 0x8Ee //д±£»¤ÃüÁî×Öµ¥ÔªµØÖ·
#define ds1302_charger_addr 0x90 //丵çÁ÷³äµçÃüÁî×ÖµØÖ·
#define ds1302_clkburst_addr 0xBE //ÈÕÀú¡¢Ê±ÖÓÍ»·¢Ä£Ê½ÃüÁî×ÖµØÖ·
extern void Write_Ds1302_Byte(unsigned char dat);
extern unsigned char Read_Ds1302_Byte(void);
extern void Ds1302_Single_Byte_Write(unsigned char addr, unsigned char dat);
extern unsigned char Ds1302_Single_Byte_Read(unsigned char addr);
#endif
不知道你这个问题是否已经解决, 如果还没有解决的话: