查看: 12324|回复: 5

[经验] Arduino IIC/I2C/接口 LCD1602转接板学习

[复制链接]
  • TA的每日心情
    奋斗
    2020-5-27 15:41
  • 签到天数: 868 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2015-12-2 21:23:55 | 显示全部楼层 |阅读模式
    分享到:
    论坛里[Raspberry Pi]写的程序,没学过Raspberry Pi,看不懂,折腾了一下午,基于FRDM-KL02Z的板子终于点亮了
    凡是学过51单片机的,相信你手边一定有块1602 LCD1602.pdf
         顾名思义,它能够同时显示16x02即32个字符。由若干个5X7或者5X10等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。       目前市面上字符液晶绝大多数是基于HD44780 HD44780.pdf液晶芯片的,控制原理是完全相同的,因此基于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位双向数据端。

    第15~16脚:空脚或背灯电源。15脚背光正极,16脚背光负极。
           使用I2C转并口模块可以节约好几个I/O口,真好。主要元件PCF8574A pcf8574a.pdf ,即便用洞洞板制作也很简单。

    未命名.JPG 未命名1.JPG
    1. #include <stdio.h>
    2. #include <string.h>
    3. #include "gpio.h"
    4. #include "common.h"
    5. #include "i2c.h"
    6. #include "uart.h"
    7. void Check_lcd(void)
    8. {     
    9.       uint8_t temp=0;
    10.       I2C_WriteSingleRegister(HW_I2C0, 0x27, 0x00, 0xf8);
    11.       DelayMs(2);
    12.       I2C_ReadSingleRegister(HW_I2C0, 0x27, 0x00, &temp) ;         
    13.       while(temp & 0x80);
    14.       I2C_WriteSingleRegister(HW_I2C0, 0x27, 0x00, 0xf8);
    15. }
    16. void Wcom_lcd(uint8_t Lcd_com,uint8_t BuysC)
    17. {
    18.         uint8_t temp;
    19.         if(BuysC)
    20.         Check_lcd();
    21.         DelayMs(1);
    22.         temp=Lcd_com&0xf0;        
    23.         I2C_WriteSingleRegister(HW_I2C0, 0x27, 0x00, temp);
    24.         I2C_WriteSingleRegister(HW_I2C0, 0x27, 0x00, temp|0x0c);
    25.         I2C_WriteSingleRegister(HW_I2C0, 0x27, 0x00, temp|0x08);
    26.         
    27.         temp= Lcd_com<<4;         
    28.         I2C_WriteSingleRegister(HW_I2C0, 0x27, 0x00, temp);
    29.         I2C_WriteSingleRegister(HW_I2C0, 0x27, 0x00, temp|0x0c);
    30.         I2C_WriteSingleRegister(HW_I2C0, 0x27, 0x00, temp|0x08);
    31. }
    复制代码
    1. void Wdat_lcd(uint8_t Lcd_dat)

    2. {
    3.         uint8_t temp;
    4.         Check_lcd();
    5.         DelayMs(1);
    6.         temp=Lcd_dat&0xf0;
    7.         I2C_WriteSingleRegister(HW_I2C0, 0x27, 0x00, temp);
    8.         I2C_WriteSingleRegister(HW_I2C0, 0x27, 0x00, temp|0x0d);
    9.         I2C_WriteSingleRegister(HW_I2C0, 0x27, 0x00, temp|0x09);
    10.         
    11.         temp= Lcd_dat<<4;      
    12.         I2C_WriteSingleRegister(HW_I2C0, 0x27, 0x00,temp);        
    13.         I2C_WriteSingleRegister(HW_I2C0, 0x27, 0x00, temp|0x0d);               
    14.         I2C_WriteSingleRegister(HW_I2C0, 0x27, 0x00, temp|0x09);
    15. }
    16. void DisplayOneChar(uint8_t X, uint8_t Y, uint8_t DData)
    17. {
    18.         Y &= 0x01;
    19.         X &= 0x0F; //限制X不能大于15,Y不能大于1
    20.         if (Y)
    21.         {
    22.                 X |= 0x40; //当要显示第二行时地址码+0x40;
    23.         }
    24.         X |= 0x80;
    25.         Wcom_lcd(X, 1);
    26.         Wdat_lcd(DData);
    27. }
    28. void DisplayString(uint8_t X, uint8_t Y, char *str)
    29. {
    30.         uint8_t Length=0;        
    31.         Y &= 0x01;
    32.         X &= 0x0F; //限制X不能大于15,Y不能大于1
    33.         while (str[Length]!='\0') //若到达字串尾则退出
    34.         {
    35.                 if (X <= 0x0F) //X坐标应小于0xF
    36.                 {
    37.                         DisplayOneChar(X, Y, str[Length]); //显示单个字符
    38.                         Length++;
    39.                         X++;
    40.                 }
    41.         }
    42.    
    43. }
    44. void Lcd_Init(void)
    45. {
    46.         DelayMs(240);
    47.         DelayMs(240);
    48.         DelayMs(240);        
    49.         Wcom_lcd(0x30,0); //三次显示模式设置,不检测忙信号
    50.         DelayMs(20);
    51.         Wcom_lcd(0x30,0); //三次显示模式设置,不检测忙信号
    52.         DelayMs(20);
    53.         Wcom_lcd(0x30,0); //三次显示模式设置,不检测忙信号
    54.         DelayMs(20);
    55.         Wcom_lcd(0x20,0);
    56.         DelayMs(20);
    57.         Wcom_lcd(0x2c,1); //显示模式设置,开始要求每次检测忙信号,4Bit模式
    58.         Wcom_lcd(0x08,1); //关闭显示        
    59.         Wcom_lcd(0x0C,1); // 显示开及光标设置
    60.         Wcom_lcd(0x06,1); // 显示光标移动设置        
    61.         Wcom_lcd(0x01,1); //显示清屏
    62.         DelayMs(5);   
    63. }
    64. int main(void)
    65. {
    66.    
    67.     /* 开机延时 */
    68.     DelayInit();
    69.     /* UART 初始化 */
    70.     GPIO_QuickInit(HW_GPIOB, 6, kGPIO_Mode_OPP);
    71.     UART_QuickInit(UART0_RX_B2_TX_B1, 9600);
    72. //    UART_ITConfig(HW_UART0, kUART_IT_Rx, true);
    73.     I2C_QuickInit(I2C0_SCL_PB03_SDA_PB04, 576000);
    74.        Lcd_Init();      
    75.        DisplayString(2, 0,"Hello,world!");
    76.        DisplayString(0, 1,"Guess YL-KL26Z!");
    77. while(1)
    78.     {
    79.   }     
    80. }
    复制代码
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2014-2-20 10:23
  • 签到天数: 45 天

    连续签到: 1 天

    [LV.5]常住居民I

    发表于 2015-12-4 10:03:34 | 显示全部楼层
    不错不错真不错
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-4-30 07:54
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2016-4-29 11:45:55 | 显示全部楼层
    为什么你的代码一写就报错啊?


    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-5-27 15:41
  • 签到天数: 868 天

    连续签到: 1 天

    [LV.10]以坛为家III

     楼主| 发表于 2016-4-29 15:40:50 | 显示全部楼层
    yjx189 发表于 2016-4-29 11:45
    为什么你的代码一写就报错啊?

    什么报错            
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-4-30 07:54
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2016-4-30 07:52:10 | 显示全部楼层
    wambob 发表于 2016-4-29 15:40
    什么报错

    就是往里面一写,就报的错,请看:

    skech _apr30a: 73, error. "I2CO_SCL_PBO3_SDA_PB04"was not declared in this scope.


    skech _apr30a: 73, error: "I2C QuickInit" was not declared in this scope.


    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-5-27 15:41
  • 签到天数: 868 天

    连续签到: 1 天

    [LV.10]以坛为家III

     楼主| 发表于 2016-4-30 12:36:11 | 显示全部楼层
    yjx189 发表于 2016-4-30 07:52
    就是往里面一写,就报的错,请看:

    skech _apr30a: 73, error. "I2CO_SCL_PBO3_SDA_PB04"was not declar ...

    1602.rar (721.31 KB, 下载次数: 29)
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-5-7 00:46 , Processed in 0.152574 second(s), 26 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.