7219芯片驱动LED的电子时钟
2013-10-23 16:35
387 查看
/***************时钟采用定时中断方式,50MS一次******完整可用,硬件实验通过**********************/
#include <REG51.H>
#include <stdio.h>
#include <intrins.h>
/***********************************************************************/
#define uchar unsigned char
#define uint unsigned int
//common part
#define HIGH 1
#define LOW 0
#define TRUE 1
#define FALSE 0
#define ZERO 0
#define MSB 0x80
#define LSB 0x01
//max7219 part
#define REG_NO_OP 0x00 // 定义空操作
#define DIG_1 0x01 // 定义数码管1
#define DIG_2 0x02 // 定义数码管2
#define DIG_3 0x03 // 定义数码管3
#define DIG_4 0x04 // 定义数码管4
#define DIG_5 0x05 // 定义数码管5
#define DIG_6 0x06 // 定义数码管6
#define DIG_7 0x07 // 定义数码管7
#define DIG_8 0x08 // 定义数码管8
#define DECODE_MODE 0x09
#define INTENSITY 0x0A
#define SCAN_LIMIT 0x0B
#define SHUT_DOWN 0x0C
#define DISPLAY_TEST 0x0F
uchar deda,sec,min,hour,week=1;
/***********************************************************************/
//change this part at different board
sbit LOAD=P2^7; //MAX7219 Load-Data Input: rising edge pin 12
sbit DIN=P2^5; //MAX7219 Serial-Data Input: rising edge pin 1
sbit CLK=P2^6; //MAX7219
sbit TT=P1^4;
sbit QQ=P3^6;
sbit RR=P3^7;
//function define
/***********************************************************************/
void Write_Max7219_byte(unsigned char temp);//write max7219 a byte
void Write_Max7219(unsigned char address,unsigned char dat);//write max7219 command and data
void Init_Max7219(void);//Initize max7219
//test program display from 1~8
/***********************************************************************/
/***********************************************************************/
void Write_Max7219_byte(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++)
{
CLK=LOW;
DIN=(bit)(temp&MSB);
temp<<=1;
CLK=HIGH;
}
}
/***********************************************************************/
void Write_Max7219(unsigned char address,unsigned char dat)
{
LOAD=LOW;
Write_Max7219_byte(address);
Write_Max7219_byte(dat);
LOAD=HIGH;
}
/***********************************************************************/
void Init_Max7219(void)
{
Write_Max7219(SHUT_DOWN, 0x01); //Normal Operation XXXXXXX1 Shutdown Mode XXXXXXXX0
Write_Max7219(DISPLAY_TEST, 0x00); //Normal Operation XXXXXXX0 Display Test Mode
Write_Max7219(DECODE_MODE, 0xff); //Decode Mode Select D7~D0 1 B decode 0 No decode
Write_Max7219(SCAN_LIMIT, 0x07); //SCAN LIMIT 0~7 0xX0~0xX7
Write_Max7219(INTENSITY, 0x04);
Write_Max7219(DIG_4,0x02); Write_Max7219(DIG_3,0x01);
Write_Max7219(DIG_6,0x07); Write_Max7219(DIG_5,0x05);
Write_Max7219(DIG_7,0x01);
}
/*****************************************************/
void init(void)
{
TMOD=0x01;
TH0=-(50000/256);
TL0=-(50000%256);
ET0=1;
TR0=1;
EA=1;
TT=0;
QQ=0;
RR=0;
Init_Max7219();
}
/******************************************/
void time0(void) interrupt 1
{
TH0=-(50000/256);
TL0=-(50000%256);
deda++;
}
/***************************************/
void conv(void)
{
if(deda>=20){deda=0;sec++;Write_Max7219(DIG_8,sec%10); Write_Max7219(DIG_7,sec/10); }
if(sec>=60){sec=0;min++; Write_Max7219(DIG_6,min%10); Write_Max7219(DIG_5,min/10);}
if(min>=60){min=0;hour++; Write_Max7219(DIG_4,hour%10); Write_Max7219(DIG_3,hour/10);}
if(hour>=24){hour=0;week++; Write_Max7219(DIG_2,week%10);}
if(week>7){week=1;}
if(hour==3) TT=1;
}
/*****************************************/
void delay(uint k)
{
uint data i,j;
for(i=0;i<k;i++){
for(j=0;j<121;j++)
{;}}
}
/**********************************************/
uchar scan_key(void)
{
uchar temp;
P3=0x3f;
temp=P3;
if(temp!=0x3f)
{delay(20);
temp=P3;
if(temp!=0x3f) return temp;
}
return 0x3f;
}
/********************************************/
void main(void)
{uchar key_flag;
init();
while(1)
{
conv();
key_flag=scan_key();
switch(key_flag)
{
case 0x3b:if(++min>59)min=0; delay(300); Write_Max7219(DIG_6,min%10); Write_Max7219(DIG_5,min/10);break;
case 0x37:if(++hour>23)hour=0; delay(300);Write_Max7219(DIG_4,hour%10); Write_Max7219(DIG_3,hour/10);break ;
case 0x2f:if(++week>7)week=1 ; delay(300); Write_Max7219(DIG_2,week%10);break;
default: break;
}
}
}
#include <REG51.H>
#include <stdio.h>
#include <intrins.h>
/***********************************************************************/
#define uchar unsigned char
#define uint unsigned int
//common part
#define HIGH 1
#define LOW 0
#define TRUE 1
#define FALSE 0
#define ZERO 0
#define MSB 0x80
#define LSB 0x01
//max7219 part
#define REG_NO_OP 0x00 // 定义空操作
#define DIG_1 0x01 // 定义数码管1
#define DIG_2 0x02 // 定义数码管2
#define DIG_3 0x03 // 定义数码管3
#define DIG_4 0x04 // 定义数码管4
#define DIG_5 0x05 // 定义数码管5
#define DIG_6 0x06 // 定义数码管6
#define DIG_7 0x07 // 定义数码管7
#define DIG_8 0x08 // 定义数码管8
#define DECODE_MODE 0x09
#define INTENSITY 0x0A
#define SCAN_LIMIT 0x0B
#define SHUT_DOWN 0x0C
#define DISPLAY_TEST 0x0F
uchar deda,sec,min,hour,week=1;
/***********************************************************************/
//change this part at different board
sbit LOAD=P2^7; //MAX7219 Load-Data Input: rising edge pin 12
sbit DIN=P2^5; //MAX7219 Serial-Data Input: rising edge pin 1
sbit CLK=P2^6; //MAX7219
sbit TT=P1^4;
sbit QQ=P3^6;
sbit RR=P3^7;
//function define
/***********************************************************************/
void Write_Max7219_byte(unsigned char temp);//write max7219 a byte
void Write_Max7219(unsigned char address,unsigned char dat);//write max7219 command and data
void Init_Max7219(void);//Initize max7219
//test program display from 1~8
/***********************************************************************/
/***********************************************************************/
void Write_Max7219_byte(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++)
{
CLK=LOW;
DIN=(bit)(temp&MSB);
temp<<=1;
CLK=HIGH;
}
}
/***********************************************************************/
void Write_Max7219(unsigned char address,unsigned char dat)
{
LOAD=LOW;
Write_Max7219_byte(address);
Write_Max7219_byte(dat);
LOAD=HIGH;
}
/***********************************************************************/
void Init_Max7219(void)
{
Write_Max7219(SHUT_DOWN, 0x01); //Normal Operation XXXXXXX1 Shutdown Mode XXXXXXXX0
Write_Max7219(DISPLAY_TEST, 0x00); //Normal Operation XXXXXXX0 Display Test Mode
Write_Max7219(DECODE_MODE, 0xff); //Decode Mode Select D7~D0 1 B decode 0 No decode
Write_Max7219(SCAN_LIMIT, 0x07); //SCAN LIMIT 0~7 0xX0~0xX7
Write_Max7219(INTENSITY, 0x04);
Write_Max7219(DIG_4,0x02); Write_Max7219(DIG_3,0x01);
Write_Max7219(DIG_6,0x07); Write_Max7219(DIG_5,0x05);
Write_Max7219(DIG_7,0x01);
}
/*****************************************************/
void init(void)
{
TMOD=0x01;
TH0=-(50000/256);
TL0=-(50000%256);
ET0=1;
TR0=1;
EA=1;
TT=0;
QQ=0;
RR=0;
Init_Max7219();
}
/******************************************/
void time0(void) interrupt 1
{
TH0=-(50000/256);
TL0=-(50000%256);
deda++;
}
/***************************************/
void conv(void)
{
if(deda>=20){deda=0;sec++;Write_Max7219(DIG_8,sec%10); Write_Max7219(DIG_7,sec/10); }
if(sec>=60){sec=0;min++; Write_Max7219(DIG_6,min%10); Write_Max7219(DIG_5,min/10);}
if(min>=60){min=0;hour++; Write_Max7219(DIG_4,hour%10); Write_Max7219(DIG_3,hour/10);}
if(hour>=24){hour=0;week++; Write_Max7219(DIG_2,week%10);}
if(week>7){week=1;}
if(hour==3) TT=1;
}
/*****************************************/
void delay(uint k)
{
uint data i,j;
for(i=0;i<k;i++){
for(j=0;j<121;j++)
{;}}
}
/**********************************************/
uchar scan_key(void)
{
uchar temp;
P3=0x3f;
temp=P3;
if(temp!=0x3f)
{delay(20);
temp=P3;
if(temp!=0x3f) return temp;
}
return 0x3f;
}
/********************************************/
void main(void)
{uchar key_flag;
init();
while(1)
{
conv();
key_flag=scan_key();
switch(key_flag)
{
case 0x3b:if(++min>59)min=0; delay(300); Write_Max7219(DIG_6,min%10); Write_Max7219(DIG_5,min/10);break;
case 0x37:if(++hour>23)hour=0; delay(300);Write_Max7219(DIG_4,hour%10); Write_Max7219(DIG_3,hour/10);break ;
case 0x2f:if(++week>7)week=1 ; delay(300); Write_Max7219(DIG_2,week%10);break;
default: break;
}
}
}
相关文章推荐
- [转贴]采用实时时钟芯片DS1302+AT89C2051的红外遥控LED电子钟
- 时钟驱动芯片参数
- PCF8563 时钟芯片驱动代码
- 桌面小部件----LED电子时钟实现
- 学习单片机之后的第一个作品——基于DS12C887芯片的电子时钟
- 辉光管电子时钟DIY记录-静态扫描驱动方式
- LED PWM控制芯片PCA9685的Linux 驱动
- rtc时钟芯片驱动(Linux驱动6)
- TLC59731 LED 驱动芯片 C语言驱动程序
- LED段码驱动芯片(国产,性能不错,用的人挺多)
- 用74HC595芯片驱动LED的电路设计
- 使用Arduino和DS12C887芯片制作电子时钟(附Arduino源代码)
- beaglebone增加PCF8563时钟芯片 i2c驱动子系统分析
- 基于STM32的DS1302时钟芯片驱动
- TM1668 Led 驱动芯片源程序
- 控制Windows Mobile的LED之三:SN3101芯片驱动(内核和BOOTLOADER)
- 辉光管电子时钟DIY记录-动态扫描驱动方式
- 嵌入式Linux驱动开发(二)——字符设备驱动之控制LED
- mini6410 Led驱动详解
- 在QT2440上添加LED驱动和应用程序