| 
 
| 是这样的,用到了HL9576,用STM32F051的IO口模拟IIC驱动这个片子,结果发现要么就是不显示,要么就是感觉地址不对, SCLK 用的是PB10,SDA用的是PB11 ,下面是我的驱动和显示。不知道这个有没有问题,大牛们给看看
 void Init_HL9576(void)
 {
 IIC_Start();
 IIC_Send_Byte(0x70); //器件地址
 IIC_Wait_Ack();
 IIC_Send_Byte(0xd8); //工作模式 省电模式
 IIC_Wait_Ack();
 IIC_Send_Byte(0xf0); //不闪烁命令
 IIC_Wait_Ack();
 for(i=0;i<20;i++)        //清屏
 IIC_Send_Byte(0x00);
 IIC_Wait_Ack();
 IIC_Stop();
 }
 void DisPlayDate(void)
 {
 u8 i=0;
 IIC_Start();
 IIC_Send_Byte(0x70); //发送被控器件总线地址
 IIC_Wait_Ack();
 IIC_Send_Byte(0xd8); //工作模式 省电模式
 IIC_Wait_Ack();
 IIC_Send_Byte(0x00); //首位地址 0开始
 IIC_Wait_Ack();
 for(i=0;i<5;i++)     //前5个地址全部点亮
 IIC_Send_Byte(0xff);
 IIC_Wait_Ack();
 IIC_Stop();
 }
 
 
 //下面是我的IIC
 #define IIC_SDA_OUT_HIGH         GPIO_SetBits(GPIOB,GPIO_Pin_11)
 #define IIC_SDA_OUT_LOW          GPIO_ResetBits(GPIOB,GPIO_Pin_11)
 #define IIC_SCL_OUT_HIGH        GPIO_SetBits(GPIOB,GPIO_Pin_10)
 #define IIC_SCL_OUT_LOW         GPIO_ResetBits(GPIOB,GPIO_Pin_10)
 #define        READ_IIC_SDA                        (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11))
 //初始化IIC
 void IIC_Init(void)
 {
 GPIO_InitTypeDef GPIO_InitStructure;
 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
 
 GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;                        //输出模式
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                        //推挽输出
 GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;                                //上拉模式
 GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_10|GPIO_Pin_11;
 GPIO_Init(GPIOB, &GPIO_InitStructure);
 }
 void IIC_SDA_IO_OUT(void)
 {
 GPIO_InitTypeDef GPIO_InitStructure;
 
 GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;                        //输出模式
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                        //推挽输出
 GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;                                //上拉模式
 GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_11;
 GPIO_Init(GPIOB, &GPIO_InitStructure);
 }
 
 void IIC_SDA_IO_IN(void)
 {
 GPIO_InitTypeDef GPIO_InitStructure;
 GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN;                        //输入模式
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
 //GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                        //输入模式下无效
 GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;//GPIO_PuPd_UP;                                //上拉模式
 GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_11;
 GPIO_Init(GPIOB, &GPIO_InitStructure);
 }
 
 //开始IIC
 void IIC_Start(void)
 {
 IIC_SDA_IO_OUT();//SDA???
 IIC_SDA_OUT_HIGH;
 IIC_SCL_OUT_HIGH;
 delay_us(8);
 IIC_SDA_OUT_LOW;//START:when CLK is high,DATA change form high to low
 delay_us(4);
 IIC_SCL_OUT_LOW;//钳住I2C总线,准备发送或接收数据
 }
 //停止IIC
 void IIC_Stop(void)
 {
 IIC_SDA_IO_OUT();//sda线输出
 IIC_SCL_OUT_LOW;
 IIC_SDA_OUT_LOW;//STOP:when CLK is high DATA change form low to high
 delay_us(8);
 IIC_SCL_OUT_HIGH;
 IIC_SDA_OUT_HIGH;
 delay_us(4);
 }
 //等待应答信号到来
 //返回值:1,接收应答失败
 //        0,接收应答成功
 u8 IIC_Wait_Ack(void)
 {
 u8 ucErrTime=0;
 
 IIC_SDA_OUT_HIGH;delay_us(1);
 IIC_SCL_OUT_HIGH;delay_us(1);
 
 IIC_SDA_IO_IN();      //SDA输入
 while(READ_IIC_SDA)
 {
 ucErrTime++;
 if(ucErrTime>250)
 {
 IIC_Stop();
 return 1;
 }
 }
 IIC_SCL_OUT_LOW;//时钟输出0
 IIC_SDA_IO_OUT();
 return 0;
 }
 //产生ACK应答
 void IIC_Ack(void)
 {
 IIC_SCL_OUT_LOW;
 IIC_SDA_IO_OUT();
 IIC_SDA_OUT_LOW;
 delay_us(8);
 IIC_SCL_OUT_HIGH;
 delay_us(4);
 IIC_SCL_OUT_LOW;
 }
 //不产生ACK应答
 void IIC_NAck(void)
 {
 IIC_SCL_OUT_LOW;
 IIC_SDA_IO_OUT();
 IIC_SDA_OUT_HIGH;
 delay_us(8);
 IIC_SCL_OUT_HIGH;
 delay_us(4);
 IIC_SCL_OUT_LOW;
 }
 //IIC发送一个字节
 //返回从机有无应答
 //1,有应答
 //0,无应答
 void IIC_Send_Byte(u8 txd)
 {
 u8 t;
 IIC_SDA_IO_OUT();
 IIC_SCL_OUT_LOW;//拉低时钟开始数据传输
 delay_us(4);
 for(t=0;t<8;t++)
 {
 if(txd&0x80)
 IIC_SDA_OUT_HIGH;
 else
 IIC_SDA_OUT_LOW;
 txd<<=1;
 delay_us(8);   //?TEA5767?3????????
 IIC_SCL_OUT_HIGH;
 delay_us(4);
 IIC_SCL_OUT_LOW;
 delay_us(4);
 }
 }
 //读1个字节,ack=1时,发送ACK,ack=0,发送nACK
 u8 IIC_Read_Byte(unsigned char ack)
 {
 unsigned char i,receive=0;
 IIC_SDA_IO_IN();//SDA设置为输入
 for(i=0;i<8;i++ )
 {
 IIC_SCL_OUT_LOW;
 delay_us(4);
 IIC_SCL_OUT_HIGH;
 
 receive<<=1;
 if(READ_IIC_SDA)
 receive++;
 delay_us(2);
 }
 
 if (!ack)
 IIC_NAck();//发送nACK
 else
 IIC_Ack(); //发送ACK
 IIC_SDA_IO_OUT();
 delay_us(4);
 return receive;
 }
 
 | 
 |