TA的每日心情 | 奋斗 2020-5-27 15:41 |
---|
签到天数: 868 天 连续签到: 1 天 [LV.10]以坛为家III
|
论坛里[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 ,即便用洞洞板制作也很简单。
- #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);
- }
- 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);
- }
复制代码- 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);
- }
- 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++;
- }
- }
-
- }
- 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);
- }
- 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)
- {
- }
- }
复制代码 |
|