打印
[技术问题解答]

【FRDM-KL02】+I2C模块驱动1602

[复制链接]
901|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
quray1985|  楼主 | 2015-12-21 20:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
凡是学过51单片机的,相信你手边一定有块1602。       顾名思义,它能够同时显示16x02即32个字符。由若干个5X7或者5X10等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。       目前市面上字符液晶绝大多数是基于HD44780 液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。

1602采用标准的16脚接口,其中:

第1脚:VSS为电源地
第2脚:VCC接5V电源正极
第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。
第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。
第6脚:E(或EN)端为使能(enable)端,高电平(1)时读取信息,负跳变时执行指令。
第7~14脚:D0~D7为8位双向数据端。

相关帖子

沙发
quray1985|  楼主 | 2015-12-21 20:54 | 只看该作者
第15~16脚:空脚或背灯电源。15脚背光正极,16脚背光负极。
       使用I2C转并口模块可以节约好几个I/O口,真好。主要元件PCF8574Apcf8574a.pdf(1.28 MB, 下载次数: 7),即便用洞洞板制作也很简单。

看看我的实拍图:

使用特权

评论回复
板凳
quray1985|  楼主 | 2015-12-21 20:54 | 只看该作者
#include <stdio.h>
#include <string.h>
#include "gpio.h"
#include "common.h"
#include "i2c.h"
#include "uart.h"
void Check_lcd(void)
{     
      uint8_t temp=0;
      I2C_WriteSingleRegister(HW_I2C0, 0x27, 0x00, 0xf8);
      DelayMs(2);
      I2C_ReadSingleRegister(HW_I2C0, 0x27, 0x00, &temp) ;         
      while(temp & 0x80);
      I2C_WriteSingleRegister(HW_I2C0, 0x27, 0x00, 0xf8);
}

使用特权

评论回复
地板
quray1985|  楼主 | 2015-12-21 20:55 | 只看该作者
void Wcom_lcd(uint8_t Lcd_com,uint8_t BuysC)
{
        uint8_t temp;
        if(BuysC)
        Check_lcd();
        DelayMs(1);
        temp=Lcd_com&0xf0;        
        I2C_WriteSingleRegister(HW_I2C0, 0x27, 0x00, temp);
        I2C_WriteSingleRegister(HW_I2C0, 0x27, 0x00, temp|0x0c);
        I2C_WriteSingleRegister(HW_I2C0, 0x27, 0x00, temp|0x08);
        
        temp= Lcd_com<<4;         
        I2C_WriteSingleRegister(HW_I2C0, 0x27, 0x00, temp);
        I2C_WriteSingleRegister(HW_I2C0, 0x27, 0x00, temp|0x0c);
        I2C_WriteSingleRegister(HW_I2C0, 0x27, 0x00, temp|0x08);
}

使用特权

评论回复
5
quray1985|  楼主 | 2015-12-21 20:56 | 只看该作者
void Wdat_lcd(uint8_t Lcd_dat)

{
        uint8_t temp;
        Check_lcd();
        DelayMs(1);
        temp=Lcd_dat&0xf0;
        I2C_WriteSingleRegister(HW_I2C0, 0x27, 0x00, temp);
        I2C_WriteSingleRegister(HW_I2C0, 0x27, 0x00, temp|0x0d);
        I2C_WriteSingleRegister(HW_I2C0, 0x27, 0x00, temp|0x09);
        
        temp= Lcd_dat<<4;      
        I2C_WriteSingleRegister(HW_I2C0, 0x27, 0x00,temp);        
        I2C_WriteSingleRegister(HW_I2C0, 0x27, 0x00, temp|0x0d);               
        I2C_WriteSingleRegister(HW_I2C0, 0x27, 0x00, temp|0x09);
}

使用特权

评论回复
6
quray1985|  楼主 | 2015-12-21 20:56 | 只看该作者
void DisplayOneChar(uint8_t X, uint8_t Y, uint8_t DData)
{
        Y &= 0x01;
        X &= 0x0F; //限制X不能大于15,Y不能大于1
        if (Y)
        {
                X |= 0x40; //当要显示第二行时地址码+0x40;
        }
        X |= 0x80;
        Wcom_lcd(X, 1);
        Wdat_lcd(DData);
}
void DisplayString(uint8_t X, uint8_t Y, char *str)
{
        uint8_t Length=0;        
        Y &= 0x01;
        X &= 0x0F; //限制X不能大于15,Y不能大于1
        while (str[Length]!='\0') //若到达字串尾则退出
        {
                if (X <= 0x0F) //X坐标应小于0xF
                {
                        DisplayOneChar(X, Y, str[Length]); //显示单个字符
                        Length++;
                        X++;
                }
        }
   
}

使用特权

评论回复
7
quray1985|  楼主 | 2015-12-21 20:57 | 只看该作者
void Lcd_Init(void)
{
        DelayMs(240);
        DelayMs(240);
        DelayMs(240);        
        Wcom_lcd(0x30,0); //三次显示模式设置,不检测忙信号
        DelayMs(20);
        Wcom_lcd(0x30,0); //三次显示模式设置,不检测忙信号
        DelayMs(20);
        Wcom_lcd(0x30,0); //三次显示模式设置,不检测忙信号
        DelayMs(20);
        Wcom_lcd(0x20,0);
        DelayMs(20);
        Wcom_lcd(0x2c,1); //显示模式设置,开始要求每次检测忙信号,4Bit模式
        Wcom_lcd(0x08,1); //关闭显示        
        Wcom_lcd(0x0C,1); // 显示开及光标设置
        Wcom_lcd(0x06,1); // 显示光标移动设置        
        Wcom_lcd(0x01,1); //显示清屏
        DelayMs(5);   
}

使用特权

评论回复
8
quray1985|  楼主 | 2015-12-21 20:57 | 只看该作者
int main(void)
{
   
    /* 开机延时 */
    DelayInit();
    /* UART 初始化 */
    GPIO_QuickInit(HW_GPIOB, 6, kGPIO_Mode_OPP);
    UART_QuickInit(UART0_RX_B2_TX_B1, 9600);
//    UART_ITConfig(HW_UART0, kUART_IT_Rx, true);
    I2C_QuickInit(I2C0_SCL_PB03_SDA_PB04, 576000);
       Lcd_Init();      
       DisplayString(2, 0,"Hello,world!");
       DisplayString(0, 1,"Guess YL-KL26Z!");
while(1)
    {
  }     
}

使用特权

评论回复
9
qagainc| | 2015-12-22 22:45 | 只看该作者
楼主 我是赶上直播了吗。。。楼主 有没有向51一样 直接驱动1602的?并口驱动。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

156

主题

1488

帖子

5

粉丝