标题:
单片机+TM1637数码管冒号如何弄成闪烁?
[打印本页]
作者:
oycc
时间:
2021-12-31 18:12
标题:
单片机+TM1637数码管冒号如何弄成闪烁?
/****-----请阅读ReadMe.txt进行实验-----***********/
#define MAIN_Fosc 11059200L //定义主时钟
#include "15W4KxxS4.H"
#include "tm1637.h"
u8 min=59;sec=50;
u8 count=0;
void Timer0Init(void) //20??@11.0592MHz
{
AUXR &= 0x7F; //?????12T??
TMOD &= 0xF0; //???????
TL0 = 0x00; //???????
TH0 = 0xB8; //???????
TF0 = 0; //??TF0??
TR0 = 1; //???0????
}
/***********************
功能描述:主函数
入口参数:无
返回值:无
************************/
int main()
{
u8 ch=0, p=0;
P0M1 = 0; P0M0 = 0; //设置P0.0~P0.7为准双向口
P1M1 = 0; P1M0 = 0; //设置P1.0~P1.7为准双向口
P2M0 = 0; P2M1 = 0; //设置P2.0~P2.7为准双向口
P3M1 = 0; P3M0 = 0; //设置P3.0~P3.7为准双向口
P4M1 = 0; P4M0 = 0; //设置P4.0~P4.7为准双向口
P5M1 = 0; P5M0 = 0; //设置P5.0~P5.7为准双向口
Timer0Init();
EA=1;ET0=1;
TM1637_NixieTubeDisplay();
TM1637_NixieTubeDisplayChar(min/10,0);
TM1637_NixieTubeDisplayChar(min%10,1);
TM1637_NixieTubeDisplayChar(sec/10,2);
TM1637_NixieTubeDisplayChar(sec%10,3);
while(1)
{
// if(fls==2)
// {
// maohao1();
// fls=0;
//}
}
}
void timer0_ISR() interrupt 1
{
count++;
if(count==50)
{
count=0;
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
}
TM1637_NixieTubeDisplayChar(min/10,0);
TM1637_NixieTubeDisplayChar(min%10,1);
}
TM1637_NixieTubeDisplayChar(sec/10,2);
TM1637_NixieTubeDisplayChar(sec%10,3);
}
}
#include "tm1637.h"
u8 NumDis[24]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0X6F,\
0x77,0x7C,0x39,0x5E,0x79,0x71,\
0x08,0x48,0x49,\
0x76,0x38,0x0E,0x50,0x37
};//0123456789ABCDEF一二三HLJRS
/**************************************
功能描述:延时函数
入口参数:u16 x ,该值为1时,延时1ms
返回值:无
***************************************/
void delay_ms(u16 x)
{
u16 j,i;
for(j=0;j<x;j++)
{
for(i=0;i<1100;i++);
}
}
/**************************************
功能描述:延时函数
入口参数:u16 x ,该值为1时,延时us
返回值:无
***************************************/
void delay_us(u16 n)
{
u16 j,i;
for(j=0;j<n;j++)
{
for(i=0;i<7;i++);
}
}
/**************************************
功能描述:TM1637开始函数
入口参数:无
返回值:无
***************************************/
void TM1637_Start(void)
{
TM1637_DIO_OUT();
TM1637_CLK = 1;
TM1637_DIO = 1;
delay_us(2);
TM1637_DIO = 0;
}
/**************************************
功能描述:TM1637应答函数
入口参数:无
返回值:无
***************************************/
void TM1637_Ack(void)
{
TM1637_DIO_IN();
TM1637_CLK = 0;
delay_us(5); //在第8个时钟下降沿之后延时5us,开始判断ACK信号
while(TM1637_READ_DIO);
TM1637_CLK = 1;
delay_us(2);
TM1637_CLK = 0;
}
/**************************************
功能描述:TM1637停止函数
入口参数:无
返回值:无
***************************************/
void TM1637_Stop(void)
{
TM1637_DIO_OUT();
TM1637_CLK = 0;
delay_us(2);
TM1637_DIO = 0;
delay_us(2);
TM1637_CLK = 1;
delay_us(2);
TM1637_DIO = 1;
}
/**************************************
功能描述:向TM1637写一个字节
入口参数:u8 oneByte
返回值:无
***************************************/
void TM1637_WriteByte(u8 oneByte)
{
u8 i;
TM1637_DIO_OUT();
for(i=0;i<8;i++)
{
TM1637_CLK = 0;
if(oneByte&0x01) //低位在前
{
TM1637_DIO = 1;
}
else
{
TM1637_DIO = 0;
}
delay_us(3);
oneByte=oneByte>>1;
TM1637_CLK = 1;
delay_us(3);
}
}
/**************************************
功能描述:写显示寄存器
入口参数:无
返回值:无
***************************************/
void TM1637_NixieTubeDisplay(void)
{
u8 i;
TM1637_Start();
TM1637_WriteByte(0x40);//40H显示地址自加1模式
TM1637_Ack();
TM1637_Stop();
TM1637_Start();
TM1637_WriteByte(0xC0); //设置首地址
TM1637_Ack();
for(i=0;i<6;i++) //地址自加,不必每次都写地址
{
TM1637_WriteByte(0xff); //送数据
TM1637_Ack();
}
TM1637_Stop();
TM1637_Start();
TM1637_WriteByte(0x8f); //开显示,最大亮度
TM1637_Ack();
TM1637_Stop();
}
/**************************************
功能描述:向指定地址显示一个字节内容
入口参数:u8 ch,u8 p
返回值:无
***************************************/
void TM1637_NixieTubeDisplayChar(u8 ch,u8 p)
{
if(ch>23) ch=0;//防止数组越界
TM1637_Start();
TM1637_WriteByte(0x44);//0x44固定模式有利于控制显示位,0x40则采用显示地址自加模式这里不使用
TM1637_Ack();
TM1637_Stop();
TM1637_Start();
TM1637_WriteByte(0xC0+p);//0X00地址开始显示
TM1637_Ack();
TM1637_WriteByte(NumDis[ch]);//显示
TM1637_Ack();
TM1637_Stop(); //V1.1
}
复制代码
作者:
Hephaestus
时间:
2021-12-31 21:47
TM1637_NixieTubeDisplayChar函数里面加上利用count的值让对应的灯点亮或者熄灭的代码即可。
作者:
188610329
时间:
2021-12-31 22:50
看你要闪烁的周期,
发送 TM1637_WriteByte(0x80); 关闭显示
一定时间后 发送 TM1637_WriteByte(0x8f); 打开显示
达到闪烁的目的。
作者:
wulin
时间:
2022-1-1 07:08
/****-----请阅读ReadMe.txt进行实验-----***********/
#define MAIN_Fosc 11059200L //定义主时钟
#include "15W4KxxS4.H"
#include "tm1637.h"
//tm1637.c 中数码管数组移到这里,TM1637_NixieTubeDisplayChar(u8 ch,u8 p)函数的形参ch直接传递段码
u8 NumDis[24]={//0123456789ABCDEF一二三HLJRS
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
0x7F,0X6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
0x08,0x48,0x49,0x76,0x38,0x0E,0x50,0x37};
u8 min=59;sec=50;
u8 count=0;
void Timer0Init(void) //20??@11.0592MHz
{
AUXR &= 0x7F; //?????12T??
TMOD &= 0xF0; //???????
TL0 = 0x00; //???????
TH0 = 0xB8; //???????
TF0 = 0; //??TF0??
TR0 = 1; //???0????
}
/***********************
功能描述:主函数
入口参数:无
返回值:无
************************/
int main()
{
u8 ch=0, p=0;
P0M1 = 0; P0M0 = 0; //设置P0.0~P0.7为准双向口
P1M1 = 0; P1M0 = 0; //设置P1.0~P1.7为准双向口
P2M0 = 0; P2M1 = 0; //设置P2.0~P2.7为准双向口
P3M1 = 0; P3M0 = 0; //设置P3.0~P3.7为准双向口
P4M1 = 0; P4M0 = 0; //设置P4.0~P4.7为准双向口
P5M1 = 0; P5M0 = 0; //设置P5.0~P5.7为准双向口
Timer0Init();
EA=1;ET0=1;
TM1637_NixieTubeDisplay();
TM1637_NixieTubeDisplayChar(NumDis[min/10],0);
TM1637_NixieTubeDisplayChar(NumDis[min%10]|0x80,1);//加冒号
TM1637_NixieTubeDisplayChar(NumDis[sec/10],2);
TM1637_NixieTubeDisplayChar(NumDis[sec%10],3);
while(1)
{
// if(fls==2)
// {
// maohao1();
// fls=0;
//}
}
}
void timer0_ISR() interrupt 1
{
count++;
if(count==50)
{
count=0;
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
}
}
}
TM1637_NixieTubeDisplayChar(NumDis[min/10],0);
if(count<25) TM1637_NixieTubeDisplayChar(NumDis[min%10]|0x80,1);//加冒号
else TM1637_NixieTubeDisplayChar(NumDis[min%10],1);//不加冒号
TM1637_NixieTubeDisplayChar(NumDis[sec/10],2);
TM1637_NixieTubeDisplayChar(NumDis[sec%10],3);
}
/*
void TM1637_NixieTubeDisplayChar(u8 ch,u8 p)
{
if(ch>23) ch=0;//防止数组越界
TM1637_Start();
TM1637_WriteByte(0x44);//0x44固定模式有利于控制显示位,0x40则采用显示地址自加模式这里不使用
TM1637_Ack();
TM1637_Stop();
TM1637_Start();
TM1637_WriteByte(0xC0+p);//0X00地址开始显示
TM1637_Ack();
// TM1637_WriteByte(NumDis[ch]);//显示
TM1637_WriteByte(ch);//显示
TM1637_Ack();
TM1637_Stop(); //V1.1
}*/
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1