感谢各位的帮助!
对照1650资料和网上的示例,编写了一个程序,STC89C52+1650+2位数码管,已搭建实物,运行成功。
说明一点:个人习惯,All.h 里面包含了所有用到的头文件。
#include "All.h"
//----P0为开漏模式,需+4.7k上拉----
sbit SCL = P0^0; //时钟
sbit SDA = P0^1; //数据
//----定义数码管代码(是固定的)----
#define DIG1 0x68
#define DIG2 0x6A
//#define DIG1 0x6C
//#define DIG2 0x6E
//----共阴,无小数点----
uchar code Seg[] = {
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
// 0 1 2 3 4 5 6 7 8 9 熄灭
//---约20us,晶振12----
void delay_us()
{
uchar a;
for(a=1;a>0;a--);
}
//---- I2C起始信号 ----
void I2C_Start()
{
SDA = 1;
SCL = 1;
_nop_();_nop_();_nop_();_nop_();
SDA = 0;
SCL = 0;
_nop_();_nop_();_nop_();_nop_();
}
//---- I2C停止信号 ----
void I2C_Stop()
{
SCL = 1;
SDA = 1;
_nop_();_nop_();_nop_();_nop_();
}
//---- I2C发送应答 ----
void I2C_Ack()
{
SDA = 0;
_nop_();_nop_();
SCL = 1;
delay_us(); //19us
SCL = 0;
_nop_();_nop_();
}
//---- I2C发送一个字节 ----
void I2C_SendByte(uchar datt)
{
uchar i;
for(i=0;i<8;i++)
{
SDA = (datt & 0x80)? 1:0; //高位先发
_nop_();_nop_();_nop_();_nop_();
SCL = 1; //低电平准备
datt <<=1;
delay_us();
SCL = 0;
}
}
//---- 写数据 ----
void TM1650_Write(uchar addr,uchar dat)
{
I2C_Start();
I2C_SendByte(addr); //发送地址(命令模式+显存地址)
I2C_Ack(); //等待应答
I2C_SendByte(dat); //发送数据
I2C_Ack();
I2C_Stop();
}
//---- 1650初始化:开显示、7段、亮度6级 ----
void TM1650_Init()
{
//命令(0x48,固定数字):开显示,7段,亮度6级(0x69)
TM1650_Write(0x48,0x69);
P0 = 0xff; //端口初始化
}
//---- 数码管显示数字 -----
void DisplayDigits(uchar dat)
{
uchar num1,num2; //num3,num4; 显示几位开几位
num1 = dat%10; //个位
if(dat <10) //一位数,十位是0,不显示
num2 = 10;
else //两位数及以上数
num2 = dat/10%10;
TM1650_Write(DIG1,Seg[num1]); //第一位数码管地址0x68 //个位
TM1650_Write(DIG2,Seg[num2]); //第二位0x6a //十位
// TM1650_Write(DIG1,Seg[num3]); //0x6c 用几位开几位
// TM1650_Write(DIG2,Seg[num4]); //0x6e
}
#include "All.h"
void main()
{
TM1650_Init(); //初始化
while(1)
{
DisplayDigits(47); //举例47,5,123
delay_1ms(500);
}
}
|