中级会员
- 积分
- 247
- 金钱
- 247
- 注册时间
- 2021-6-27
- 在线时间
- 35 小时
|
5金钱
本帖最后由 ShineY 于 2021-11-25 23:07 编辑
原理图如图所示;数码管不会亮,用debug调试一直停在void TM1637_Ack(void)函数中的这一步while(TM1637_READ_DIO);求解
代码如下
#include "TM1637.h"
#include "delay.h"
/** Write multiple bits in an 8-bit device register.
* @param slaveAddr I2C slave device address
* @param regAddr Register regAddr to write to
* @param bitStart First bit position to write (0-7)
* @param length Number of bits to write (not more than 8)
* @param data Right-aligned value to write
*/
unsigned char temp=0xCF;//显示跳动的冒号
unsigned char 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
void TM1637_Delay_us(unsigned int Nus)
{
for(;Nus>0;Nus--)
{
__nop();
}
}
void TM1637_Start(void)
{
TM1637_DIO_OUT();
TM1637_CLK = 1;
TM1637_DIO = 1;
TM1637_Delay_us(2);
TM1637_DIO = 0;
}
void TM1637_Ack(void)
{
TM1637_DIO_IN();
TM1637_CLK = 0;
TM1637_Delay_us(5);
while(TM1637_READ_DIO);
TM1637_CLK = 1;
TM1637_Delay_us(2);
TM1637_CLK = 0;
}
void TM1637_Stop(void)
{
TM1637_DIO_OUT();
TM1637_CLK = 0;
TM1637_Delay_us(2);
TM1637_DIO = 0;
TM1637_Delay_us(2);
TM1637_CLK = 1;
TM1637_Delay_us(2);
TM1637_DIO = 1;
}
void TM1637_WriteByte(unsigned char oneByte)
{
unsigned char i;
TM1637_DIO_OUT();
// TM1637_Start();
for(i=0;i<8;i++)
{
TM1637_CLK = 0;
// TM1637_Delay_us(6);
// TM1637_DIO = oneByte&0x01;
if(oneByte&0x01)
{
TM1637_DIO = 1;
}
else
{
TM1637_DIO = 0;
}
TM1637_Delay_us(3);
oneByte=oneByte>>1;
TM1637_CLK = 1;
TM1637_Delay_us(3);
}
}
unsigned char TM1637_ScanKey(void)
{
unsigned char reKey,i;
TM1637_Start();
TM1637_WriteByte(0x42);
TM1637_Ack();
TM1637_DIO = 1;
TM1637_DIO_IN();
for(i=0;i<8;i++)
{
TM1637_CLK = 0;
reKey=reKey>>1;
TM1637_Delay_us(30);
TM1637_CLK = 1;
if(TM1637_READ_DIO)
{
reKey=reKey|0x80;
}
else
{
reKey=reKey|0x00;
}
TM1637_Delay_us(30);
}
TM1637_Ack();
TM1637_Stop();
return(reKey);
}
void TM1637_NixieTubeDisplayChar(unsigned char ch,unsigned char 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();
}
void TM1637_NixieTubeDisplay(void)
{
TM1637_Start();
TM1637_WriteByte(0x40);//0x40则采用显示地址自加1模式
TM1637_Ack();
TM1637_Stop();
TM1637_Start();
TM1637_WriteByte(0xC0);//0X00地址开始显示
TM1637_Ack();
TM1637_WriteByte(0x06);//显示1
TM1637_Ack();
temp^=0x80;
TM1637_WriteByte(temp);//显示2和跳动的冒号
TM1637_Ack();
TM1637_WriteByte(0x06);//显示1
TM1637_Ack();
TM1637_WriteByte(0x66);//显示4
TM1637_Ack();
TM1637_WriteByte(0xFF);
TM1637_Ack();
TM1637_WriteByte(0xFF);
TM1637_Ack();
TM1637_Stop();
TM1637_Start();
TM1637_WriteByte(0x8f);
TM1637_Ack();
TM1637_Stop();
}
void Display(unsigned char dat) //显示函数
{
unsigned char n;
TM1637_Start();
TM1637_WriteByte(0x40);//数据命令-40H 地址自动加1 模式,44H 固定地址模式,本程序采用自加1 模式
TM1637_Ack();
TM1637_Stop();
TM1637_Start();
TM1637_WriteByte(0xC0);//地址命令-设置首地址
TM1637_Ack();
for(n=0;n<6;n++)//共六个字节单元-这里选取了6个
{
TM1637_WriteByte(dat);
TM1637_Ack();
}
TM1637_Stop();
TM1637_Start();
TM1637_WriteByte(0x8f);//开显示命令-消光数量设置:开显示,并配置最大亮度
TM1637_Ack();
TM1637_Stop();
}
void TM1637_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4; //DIO CLK
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
#ifndef TM1637_H
#define TM1637_H
#include "sys.h"
#define TM1637_CLK PBout(3)
#define TM1637_DIO PBout(4)
#define TM1637_READ_DIO PBin(4)
//IO方向设置
#define TM1637_DIO_IN() {GPIOB->CRL&=0XFFF0FFFF;GPIOB->CRL|=8<<16;}
#define TM1637_DIO_OUT() {GPIOB->CRL&=0XFFF0FFFF;GPIOB->CRL|=3<<16;}
extern unsigned char NumDis[24];
void TM1637_Delay_us(unsigned int Nus);
void TM1637_Start(void);
void TM1637_Ack(void);
void TM1637_Stop(void);
void TM1637_WriteByte(unsigned char oneByte);
unsigned char TM1637_ScanKey(void);
void TM1637_NixieTubeDisplay(void);
void TM1637_NixieTubeDisplayChar(unsigned char ch,unsigned char p);
void TM1637_Init(void);
void Display(unsigned char dat); //显示函数
#endif
#include "sys.h"
#include "TM1637.h"
/************************************************
ALIENTEK战舰STM32开发板实验1
跑马灯实验
技术支持:www.openedv.com
淘宝店铺:http://eboard.taobao.com
关注微信公众平台微信号:"正点原子",免费获取STM32资料。
广州市星翼电子科技有限公司
作者:正点原子 @ALIENTEK
************************************************/
int main(void)
{
TM1637_Init();
TM1637_NixieTubeDisplay();
while(1)
{
Display(NumDis[0]); //显示函数
}
}
|
-
|