📄 20061020123093490.txt
字号:
#include<reg51.h>
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
/***********************************max7219:引脚配置**********************************/
sbit DIN=P2^7;
sbit LOAD=P2^6;
sbit CLK=P2^5;
/***********************************DS1302:引脚配置**********************************/
sbit RST=P2^4;
sbit IO=P2^3;
sbit SCLK=P2^2;
/*********************************************************/
/* DS1302 */
/* */
/********************************************************/
void write_byte(unsigned char da) //DS1302:写入操作
{
unsigned char i;
ACC=da;
for(i=8;i>0;i--)
{
IO=ACC0;
SCLK=0;
SCLK=1;
ACC=ACC>>1;
}
}
unsigned char read_byte(void) //DS1302:读取操作
{
unsigned char i;
for(i=0;i<8;i++)
{
ACC=ACC>>1;
SCLK = 1;
SCLK = 0;
ACC7 = IO;
}
return(ACC);
}
void write_1302(unsigned char addr,unsigned char da) //DS1302:写入数据(先送地址,再写数据?
{
RST=0; //停止工作
SCLK=0;
RST=1; //重新工作
write_byte(addr); //写入地址
write_byte(da);
RST=0;
SCLK=1;
}
unsigned char read_1302(unsigned char addr) //DS1302:读取数据(先送地址,再读数据)
{
unsigned char temp;
RST=0; //停止工作
SCLK=0;
RST=1; //重新工作
write_byte(addr); //写入地址
temp=read_byte();
RST=0;
SCLK=1; //停止工作
return(temp);
}
/**********************************************************/
/* max7219 */
/* */
/*********************************************************/
void write_7219(unsigned int da) //7219:写入数据(上升沿?
{
unsigned int i;
LOAD=0;
for(i=0x8000;i>=0x0001;i=i>>1)
{
if((da&i)==0) DIN=0;
else DIN=1;
CLK=0;
CLK=1;
}
LOAD=1; //16位数据写完
}
/*****************************延时程序=a*1ms**************************************/
void delay(unsigned char a)
{
unsigned char i;
while(a-- !=0)
{
for(i=0;i<125;i++);
}
}
/****************************显示程序******************************************/
void led_disp(unsigned char *poi)
{
write_7219(0x0100+*poi%16); //第1个数码管:显示秒(个位);
delay(3); //持续2ms
write_7219(0x0200+*poi/16); //第2个数码管:显示秒(十位);
delay(3);
poi++;
write_7219(0x0300+*poi%16); //第3个数码管:显示分(个位)
delay(3);
write_7219(0x0400+*poi/16); //第4个数码管:显示分(十位)
delay(3);
poi++;
write_7219(0x0500+*poi%16); //第5个数码管:显示时(个位)
delay(3);
write_7219(0x0600+*poi/16); //第8个数码管:显示时(十位)
delay(3);
}
/*****************************主程序*******************************/
void main(void)
{
unsigned char clk_time[3]={0x00,0x00,0x12}; //秒,分,时寄存器初始值
unsigned char temp=0x80; // 地址80:秒写入寄存器
unsigned char i;
write_1302(0x8e,0x00); //WP=0 写操作
for(i=0;i<3;i++)
{
write_1302(temp,clk_time[i]);
temp+=2;
}
write_1302(0x8e,0x80); //WP=1 写保护
write_7219(0x0c01); //地址0c:开关寄存器 数据01:正常运行
write_7219(0x0a0f); //地址0a:亮度寄存器 数据0f: 最亮
write_7219(0x0b05); //地址0b:位码寄存器 数据05:D0~~D5点亮
write_7219(0x09ff); //地址09:译码寄存器 数据ff: 不译码
while(1)
{
led_disp(clk_time); //形参是指针
temp=0x81; // 地址81:秒写入寄存器
for(i=0;i<3;i++) //更新时间
{
clk_time[i]=read_1302(temp);
temp+=2;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -