标题:
max7219数码管掉电时钟显示程序
[打印本页]
作者:
hyunim55612
时间:
2019-7-10 11:57
标题:
max7219数码管掉电时钟显示程序
#include<STC15W4K32S4.h> // 引用标准库的头文件
#define uchar unsigned char // 定义一下方便使用
#define uint unsigned int
#define ulong unsigned long
char code dx516[3] _at_ 0x003b;// 这是为了仿真设置的
#define WriteDeviceAddress 0xa0 // 定义器件在 IIC 总线中的地址,且方式为写
#define ReadDeviceAddress 0xa1 // 定义器件在 IIC 总线中的地址,且方式为读
sbit SCL=P1^6; // 串行IIC时钟
sbit SDA=P1^7; // 串行IIC数据、地址
sbit DIN = P0^0; // 串行数据输入
sbit CLK = P0^1; // 串行时钟
sbit LOAD = P4^6; // 显示数据锁存控制
sbit led=P2^6;
/****************************
MAX7219特殊功能寄存器定义
************************/
#define DECODE_MODE 0x09 // 译码模式寄存器
#define INTENSITY 0x0a // 亮度寄存器
#define SCAN_LIMIT 0x0b // 扫描位数寄存器
#define SHUT_DOWN 0x0c // 低功耗模式寄存器
#define DISPLAY_TEST 0x0f // 显示测试寄存器
unsigned int cntb=0 ,n=0,m=0,k=0;
void Write_Max7219_byte(unsigned char temp);
void Write_Max7219(unsigned char address,unsigned char dat);
void Init_Max7219(void);
void delay_ms(unsigned int time);
void Init_interrupt();
void show();
uchar Read24c02(uchar address);
void Write24c02(uchar ch,uchar address);
void DelayMsK(unsigned int number);
/* 主函数 */
void main(void)
{
Init_Max7219(); //7219初始化
Init_interrupt(); //定时器初始化
P1M0=0X00;
P1M1=0X00;
P2M0=0X00;
P2M1=0X00;
n=Read24c02(0x03);
k=Read24c02(0x04);
if(n>59||k>59)
{ //防止首次上电读出的数据出错
n=0;
k=0;
}
while(1)
{
show(); //调用数码管显示
}
}
/*******************************
MAX7219显示子程序
*******************************/
void show()
{
Write24c02(n,0x03); // 写入一个字节到 24c02 中的0x03地址
DelayMsK(8000);
Write_Max7219(4,n%10); //数码管分钟个位数值分离
delay_ms(1);
Write_Max7219(3,n%100/10); //数码管分钟十位数值分离
delay_ms(1);
Write24c02(k,0x04); // 写入一个字节到 24c02 中的0x04地址
DelayMsK(8000);
Write_Max7219(2,k%10); //数码管小时个位数值分离
delay_ms(1);
Write_Max7219(1,k%100/10); //数码管小时十位数值分离
delay_ms(1);
}
/**************************
定时器0初始化子程序
*****************************/
void Init_interrupt()
{
TMOD=0X01;
TH0=(65536-46080)/256; //定时器赋初值11.0592MHZ晶振,赋初值TH0=(65536- 1000*50*(11.0592/12)/256) 50ms
TL0=(65536-46080)/256;
TR0=1;
ET0=1;
IT0=1;
IT1=1;
EX0=1;
EX1=1;
EA=1;
}
/********************************
ms级延时子程序
******************************/
void delay_ms(unsigned int time)
{
unsigned int i,j;
for(i=time;i>0;i--)
for(j=125;j>0;j--);
}
void t0(void) interrupt 1 using 0
{
TH0=(65536-46080)/256;
TL0=(65536-46080)/256;
cntb ++;
m++;
if(m==30) ////m执行30次,led灯1s交替闪烁
{
led=~led;
m=0;
}
if(cntb==1200) //cntb执行1200次,一分钟时间到
{
n=n+1; //分钟变量加1操作
cntb=0; //定时器计数变量清零
}
if(n>59) //分钟 显示大于59秒
{
k=k+1; //小时变量加1操作
n=0; //分钟变量清零
}
if(k>99) //时间显示大于99小时
{
k=99;
}
}
/******************
MAX7219读数据子程序
*********************/
void Write_Max7219_byte(unsigned char temp)
{
unsigned char i;
for(i=0;i<8;i++) //移位循环8次
{
CLK=0; //清零时钟总线
DIN=(bit)(temp&0x80); //每次取高字节亮
temp=temp<<1; //左移移位
CLK=1; //时钟上升沿,发送高字节位
}
}
/*****************************
MAX7219写数据子程序
*************************/
void Write_Max7219(unsigned char address,unsigned char dat)
{
LOAD=0; //拉低片选线,选中器件
Write_Max7219_byte(address); //读取高字节地址位
Write_Max7219_byte(dat); //读取高字节数据位
LOAD=1; //读取结束,上升沿锁存数据
}
/*****************************
MAX7219初始化子程序
*************************/
void Init_Max7219(void)
{
Write_Max7219(SHUT_DOWN,0x01); //开启正常工作模式
Write_Max7219(DISPLAY_TEST,0x00); //选中工作模式
Write_Max7219(DECODE_MODE,0xff); //选用全译码模式
Write_Max7219(SCAN_LIMIT,0x07); //8只LED全用
Write_Max7219(INTENSITY,0x0a); //设置初始亮度
}
// 定时函数
void DelayMsK(unsigned int number)
{
unsigned char temp;
for(;number!=0;number--)
{
for(temp=112;temp!=0;temp--) ;
}
}
// 开始总线
void Start()
{
SDA=1;
SCL=1;
SDA=0;
SCL=0;
}
// 结束总线
void Stop()
{
SCL=0;
SDA=0;
SCL=1;
SDA=1;
}
// 发 ACK0
void NoAck()
{
SDA=1;
SCL=1;
SCL=0;
}
// 测试 ACK
bit TestAck()
{
bit ErrorBit;
SDA=1;
SCL=1;
ErrorBit=SDA;
SCL=0;
return(ErrorBit);
}
// 写入 8 个 bit 到 24c02
void Write8Bit(unsigned char input)
{
unsigned char temp;
for(temp=8;temp!=0;temp--)
{
SDA=(bit)(input&0x80); //input&0x80 结果非零,转换成 bit 即为 1。
SCL=1;
SCL=0;
input=input<<1;
}
}
void Write24c02(uchar ch,uchar address)
{
Start();// 发送起始脉冲
Write8Bit(WriteDeviceAddress); // 发送从器件地址,且方式为写。
while(TestAck()); // 等待应答
Write8Bit(address); // 发送要写入数据的字节地址
while(TestAck()); // 等待应答
Write8Bit(ch); // 发送要写的数据到被寻址的存储单元。
while(TestAck()); // 等待应答
Stop();// 发送停止信号, 24C02开始内部数据的擦写。 在内部擦写过程中 24C02 不再应答主器件的任何请求。
DelayMsK(10);
}
// 从 24c02 中读出 8 个 bit
uchar Read8Bit()
{
unsigned char temp,rbyte=0;
for(temp=8;temp!=0;temp--)
{
SCL=1;
rbyte=rbyte<<1;
rbyte=rbyte|((unsigned char)(SDA));
SCL=0;
}
return(rbyte);
}
// 选择性读操作,从 address 地址中读出 1 个字节
uchar Read24c02(uchar address)
{
uchar ch;
// 伪写操作
Start();
Write8Bit(WriteDeviceAddress); // 发送从器件地址,且方式为写。
while(TestAck()); // 等待应答
Write8Bit(address); // 发送要读的数据地址
while(TestAck()); // 等待应答
// 主器件重新发送起始信号和从器件地址此时 R/W 位置1
Start();
Write8Bit(ReadDeviceAddress); // 发送从器件地址,且方式为读。
while(TestAck()); // 等待应答
ch=Read8Bit(); // 读出 8bit
NoAck();
// 主机不应答
Stop();
// 主机产生停止信号
return(ch);
}
复制代码
作者:
admin
时间:
2019-7-11 15:53
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1