#include"reg51.h"
sbit LOAD=P2^1; //MAX7219片选 12脚
sbit DIN=P2^0; //MAX7219串行数据 1脚
sbit CLK=P2^2;//MAX7219串行时钟 13脚
sbit k1=P2^5;
sbit k2=P2^6;
sbit k3=P2^7;
//寄存器宏定义
#define DECODE_MODE 0x09 //译码控制寄存器
#define INTENSITY 0x0A //亮度控制寄存器
#define SCAN_LIMIT 0x0B //扫描界限寄存器
#define SHUT_DOWN 0x0C //关断模式寄存器
#define DISPLAY_TEST 0x0F //测试控制寄存器
//定义全局变量
unsigned char hour=0,minute=0,second=0,time=0,delaytime=0;
unsigned char code value[]={0,1,2,3,4,5,6,7,8,9};
//函数声明
void Write7219(unsigned char address,unsigned char dat);
void Initial(void);
void Key(void);
void delay(void);
//下面开始使用定时器进行延时。
void delay()
{
delaytime=0; // 初始化延时变量。
while(delaytime<5);
}
//地址、数据发送子程序
void Write7219(unsigned char address,unsigned char dat)
{
unsigned char i;
LOAD=0; //拉低片选线,选中器件
//发送地址
for (i=0;i<8;i++)//移位循环8次
{
CLK=0; //清零时钟总线
DIN=(bit)(address&0x80); //每次取高字节
address<<=1; //左移一位
CLK=1; //时钟上升沿,发送地址
}
//发送数据
for (i=0;i<8;i++)
{
CLK=0;
DIN=(bit)(dat&0x80);
dat<<=1;
CLK=1;//时钟上升沿,发送数据
}
LOAD=1;//发送结束,上升沿锁存数据
}
//MAX7219初始化,设置MAX7219内部的控制寄存器
void Initial(void)
{
Write7219(SHUT_DOWN,0x01); //开启正常工作模式(0xX1)
Write7219(DISPLAY_TEST,0x00); //选择工作模式(0xX0)
Write7219(DECODE_MODE,0xff); //选用全译码模式
Write7219(SCAN_LIMIT,0x07); //8只LED全用
Write7219(INTENSITY,0x04); //设置初始亮度
}
//按键程序
void Key(void)
{
if(P2&0xE0==0xE0) continue;//如果没有按下任何按键就跳出去,否者执行下面的按键操作,这么写就是为了消除抖动
{
if(k1==0) second=0; //秒针清零
if(k2==0) minute++;delay();
if(k3==0) hour++; delay();
}
}
void main(void)
{
TMOD=0x01;
EA=1;ET0=1;
TH0=(65536-46086)/256;
TL0=(65536-46086)%256;
TR0=1;
Initial(); //MAX7219初始化
while(1)
{
Key();
Write7219(1, value[hour/10] );
Write7219(2, value[hour%10] );
Write7219(3,10 );
Write7219(4,value[minute/10] );
Write7219(5,value[minute%10] );
Write7219(6,10);
Write7219(7,value[second/10] );
Write7219(8,value[second%10] );
}
}
void TimeInterrupt (void) interrupt 1 using 1
{
TH0=(65536-46086)/256;
TL0=(65536-46086)%256;
time++;
delaytime++; //此处开始延时,当调用延时时候会初始化,其他时间跑空
if(time==20)
{time=0; second++;}
if(second==60)
{second=0;minute++;}
if(minute==60)
{minute=0; hour++;}
if(hour==24) hour=0;
}
|