已下是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();
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>