金牌会员
- 积分
- 1027
- 金钱
- 1027
- 注册时间
- 2021-2-4
- 在线时间
- 146 小时
|
19金钱
初学51单片机 用仿真搭建了一个TM1637的电路 使用的代码是厂家手册里的
但是我发现发送数据的第一位会被置位(最低位)
想让数码管显示一个1 发送了0x06 但是显示的是7 我看了一下码表 数字7是0x07
想问一下大家这是什么情况
/*
*版权信息: 深圳天微电子
*文件名: TM1637
*当前版本: 1.0
*单片机型号: AT89S52
*开发环境: Keil uVision3
*晶震频率: 11.0592M
*程序功能: 把TM1637 所有显示寄存器地址全部写满数据0xff,并开显示,然后再读按键值。
*/
#include <reg52.h>
#include <intrins.h>
//定义端口
sbit clk = P3 ^ 3;
sbit dio = P3 ^ 2;
char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
///=======================================
void Delay_us(unsigned int i) // nus 延时
{
for (; i > 0; i--)
_nop_();
}
void Delay_ms(unsigned int i)
{
for (; i > 0; i--)
Delay_us(1000);
}
///======================================
void I2CStart(void) // 1637 开始
{
clk = 1;
dio = 1;
Delay_us(2);
dio = 0;
}
///=============================================
void I2Cask(void) // 1637 应答
{
clk = 0;
Delay_us(5); //在第八个时钟下降沿之后延时5us,开始判断ACK 信号
while (dio)
;
clk = 1;
Delay_us(2);
clk = 0;
}
///========================================
void I2CStop(void) // 1637 停止
{
clk = 0;
Delay_us(2);
dio = 0;
Delay_us(2);
clk = 1;
Delay_us(2);
dio = 1;
}
///=========================================
void I2CWrByte(unsigned char oneByte) //写一个字节
{
unsigned char i;
for (i = 0; i < 8; i++)
{
clk = 0;
if (oneByte & 0x01) //低位在前
{
dio = 1;
}
else
{
dio = 0;
}
Delay_us(3);
oneByte = oneByte >> 1;
clk = 1;
Delay_us(3);
}
}
///================================================
void SmgDisplay(int addr,int num) //写显示寄存器
{
// unsigned char i;
I2CStart();
I2CWrByte(0x44); // 40H 地址自动加1 模式,44H 固定地址模式,本程序采 用自加1 模式
I2Cask();
I2CStop();
I2CStart();
I2CWrByte(addr); //设置地址,
I2Cask();
I2CWrByte(num); //送数据
I2Cask();
I2CStop();
I2CStart();
I2CWrByte(0x8f); //开显示 ,最大亮度
I2Cask();
I2CStop();
}
void main(void)
{
SmgDisplay(0xc0,table[1]); //写寄存器并开显示
while (1)
{
}
}
|
|