×
单片机 > 单片机程序设计 > 详情

51单片机控制+MAX7219+DS1302 电子钟

发布时间:2023-03-23 发布时间:
|

/**************************************************
*程序名称:MAX7219 C语言控制程序
*程序功能: 3线串行控制8位共阴数码管
*3线定义:DIN 串行数据输入
* LOAD数据锁存
* CLK 时钟输入
***************************************************/
#include
#include
#define uchar unsigned char
#define uint unsigned int

sbit sclk=P1^0;
sbit io=P1^1;
sbit ce=P1^2;
uchar time_data[]={13,6,4,17,21,51,30};//? ? ? ? ? ? ?
uchar write_add[]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};
uchar read_add[]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};
sbit pinDIN=P1^3; //串行数据输入端
sbit pinLOAD=P1^4; //数据锁存端
sbit pinCLK=P1^5; //时钟输入端
#define uchar unsigned char
uchar p=0,num;
uchar disp[6];
uchar code LEDcode[]=
{0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,0x00,0x01 /*0,1,2,3,4,5,6,7,8,9,全灭*/
/* 0x77,0x1f,0x4e,0x3d,0x4f,0x47,0x67,0x3e,0xff, */}; /*A,B,C,D,E,F,P,U,全亮*/

delay(uchar x)
{
uchar a,b;
for(a=x;a>0;a--)
for(b=200;b>0;b--);
}

/**************************************************
* 向MAX7219写入字节(8位)函数 *
***************************************************/

void sendbyte (uchar dat)
{
uchar i,temp;
_nop_();
for (i=0;i<8;i++)
{
temp=dat&0x80;
dat=dat<<1;
if(temp)
pinDIN=1;
else
pinDIN=0;
pinCLK=0;
_nop_();
pinCLK=1;
}
}
/**************************************************
* 向MAX7219写入地址和控制字(16位) *
***************************************************/
void sendword (uchar addr,uchar dat)
{
pinLOAD=0;
_nop_();
sendbyte (addr);
_nop_();
sendbyte (dat);
_nop_();
pinLOAD=1; //第16个上升沿之后,第17个上升沿之前必须把pinCLK置高,否则数据丢失
}
/**************************************************
* MAX7219初始化 *
***************************************************/
void init7219 (void)
{
sendword (0x0c,0x01); /*设置电源工作模式 */
sendword (0x0a,0x03); /* 设置亮度19/32 */
sendword (0x0b,0x07); /*设置扫描界限 */
sendword (0x09,0x00); /* 设置译码模式 */
sendword (0x0f,0x00); /*显示测试 00为正常工作状态*/
}
/**************************************************
* MAX7219清除显示 *
***************************************************/
void clear7219(void)
{
uchar i;
for(i=8;i>0;i--)
{
sendword(i,0x00);
}
}



void write_ds1302_byte(uchar add)
{
uchar i;
for(i=0;i<8;i++)
{
sclk=0;
io=add&0x01;
add=add>>1;
sclk=1;
}
}

void write_ds1302(uchar add,uchar dat)
{
ce=0;
sclk=0;
ce=1;
_nop_();
write_ds1302_byte(add);
write_ds1302_byte(dat);
ce=0;
_nop_();
io=1;
sclk=1;
}

uchar read_ds1302(uchar add)
{
uchar i,value;
ce=0;
sclk=0;
ce=1;
_nop_();
write_ds1302_byte(add);
for(i=0;i<8;i++)
{
value=value>>1;
sclk=0;
if(io)
{
value=value|0x80;
}
sclk=1;
}
ce=0;
_nop_();
sclk=0;
_nop_();
sclk=1;
io=1;
return value;
}

void set_rtc()
{
uchar i,j,k;
for(i=0;i<7;i++)
{
j=time_data[i]/10;
k=time_data[i]%10;
time_data[i]=k+j*16;
}
write_ds1302(0x8e,0x00);//?????
for(i=0;i<7;i++)
{
write_ds1302(write_add[i],time_data[i]);
}
write_ds1302(0x8e,0x80);//????
}

void read_rtc()
{
uchar i;
for(i=0;i<7;i++)
{
time_data[i]=read_ds1302(read_add[i]);
}
}


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32中断向量表的位置.重定向