IIC模式驱动1602不显示

2019-07-20 10:42发布

已下是IIC模式驱动1602代码,大神们给看看
#include "stm32f4xx.h"
#include "lcd1602.h"
#include "delay.h"

#define uchar unsigned char
#define uint unsigned int

void lcd1602_init(void)
{
   GPIO_InitTypeDef GPIO_Initlcd1602;
   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);  //使能PE口
   GPIO_Initlcd1602.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;
   GPIO_Initlcd1602.GPIO_Mode=GPIO_Mode_OUT;
   GPIO_Initlcd1602.GPIO_OType=GPIO_OType_PP;
   GPIO_Initlcd1602.GPIO_PuPd=GPIO_PuPd_UP;
   GPIO_Initlcd1602.GPIO_Speed=GPIO_Speed_50MHz;
   GPIO_Init(GPIOE,&GPIO_Initlcd1602);
   GPIO_SetBits(GPIOE,GPIO_Pin_6|GPIO_Pin_7);

}
void transfer(int data1)   //写指令/数据
{
u8 i, n=8;                                                       
  SDA_OUT();
  IIC_SCL=0;                           //拉低时钟开始数据传输       
  for(i=0;i<n;i++)                      //向SDA发送一个字节数据,8位
    {
     IIC_SDA=(data1&0x80)>>7;
         data1=data1<<1;
         delay_ms(2);                     
         IIC_SCL=1;
         delay_ms(2);
         IIC_SCL=0;       
         delay_ms(2);
          
        }
}

void start_flag()       //I2C 启动   
{
   SDA_OUT();          //SDA口为输出
   IIC_SDA=1;
   delay_ms(1);
   IIC_SCL=1;
   delay_ms(5);                                                                          
   IIC_SDA=0;
   delay_ms(4);
   IIC_SCL=0;
   delay_ms(1);        
}

void stop_flag()       //I2C禁止
{
   SDA_OUT();          //SDA口为输出
  IIC_SDA=0;
  delay_ms(2);
  IIC_SCL=1;                                                                       
  delay_ms(5);
  IIC_SDA=1;                                                                          
  delay_ms(5);
}

void initial_lcd()     //初始化子函数
{
start_flag(); /*开始标志*/
transfer(0x78); /*选择SLAVE ADDRESS*/
transfer(0x00); /*控制字节:Co=0,A0=0,表示以下传输的N 个字节是指令*/
transfer(0x38);//Function set
transfer(0x0c);//Display ON/OFF
transfer(0x01);//Clear display
transfer(0x06);//Entry mode set
stop_flag(); /*结束标志*/
}


/*在指定行和列位置显示指定的字母、数字(5*7 点阵的)*/
void disp_char(int line,int column,char *dp)
{
int i;
start_flag();
transfer(0x78); /*选择SLAVE ADDRESS*/
transfer(0x80); /*控制字节:Co=1,A0=0,表示以下传输的1 个字节是指令*/
transfer(0x80+(line-1)*0x40+(column-1)); //设置DDRAM ADDRESS:第几行,第几列
transfer(0x40); /*控制字节:Co=0,A0=1,表示以下传输的n 个字节是数据*/
for(i=0;i<16;i++)
{
transfer(*dp);
dp=dp+1;
}
stop_flag();
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。