- #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;
- }
-
|