STM32F302 驱动 LCD1602

平台:stm32f302,    屏幕:  LCD1602 ,

1 #ifndef __LCD1602_H__
2 #define __LCD1602_H__
3 #include "stm32f30x.h"
4 void lcd1602_init(void);
5 void lcd1602_display(u8*string);
6 void lcd1602_display_pos(int row,int column, u8*string);
7 #endif

  1 #include "LCD1602.h"
  2
  3 #define L_SHIFT     0X0
  4 #define R_SHIFT     0X1
  5
  6 #define DISPLAY_ON  0X1
  7 #define DISPLAY_OFF 0X0
  8
  9 #define DATA_WIDTH_8BITS    0X1
 10 #define DATA_WIDTH_4BITS    0X0
 11
 12 #define ROW_NUM_2   0X1
 13 #define ROW_NUM_1   0X0
 14
 15 #define DOT_MATRIC_5_7 0X0
 16 #define DOT_MATRIC_5_10 0X1
 17
 18 #define     CMD_CLR             0X1
 19 #define     CMD_CARET_REWIND    0X2
 20 #define     CMD_CARET_SHIFT(X)  (0X4|(X<<1))
 21 #define     CMD_DISP_ONOFF(X)   (0X8|(X<<2))
 22 #define     CMD_SC_LR(S,L)      (0X10|(S<<3)|(L<<2))
 23 #define     CMD_FUN_SET(DL,N,F) (0X20|(DL<<4)|(N<<3)|(F<<2))
 24 #define     CMD_CGRAM(ADDR)     (0X40|ADDR)
 25 #define     CMD_DDRAM(ADDR)     (0X80|ADDR)
 26
 27 #define LCD1602_EN_HIGH()   GPIOB->BSRR = GPIO_Pin_6
 28 #define LCD1602_EN_LOW()    GPIOB->BRR = GPIO_Pin_6
 29
 30 #define LCD1602_RS_HIGH() GPIOB->BSRR = GPIO_Pin_8
 31 #define LCD1602_RS_LOW() GPIOB->BRR = GPIO_Pin_8
 32
 33 #define STCP_595_HIGH()   GPIOB->BSRR = GPIO_Pin_9
 34 #define STCP_595_LOW()   GPIOB->BRR = GPIO_Pin_9
 35
 36 #define SHCP_595_HIGH()   GPIOB->BSRR = GPIO_Pin_5
 37 #define SHCP_595_LOW()   GPIOB->BRR = GPIO_Pin_5
 38
 39 #define DS_595_HIGH()   GPIOB->BSRR = GPIO_Pin_4
 40 #define DS_595_LOW()   GPIOB->BRR = GPIO_Pin_4
 41
 42 //#define LCD1602_RW PBout(8)
 43 //#define LCD1602_DATA
 44
 45 static void delayus(int us)
 46 {
 47     int i = 0;
 48     while(us--)
 49     {
 50         for(i=10;i;--i);
 51     }
 52 }
 53 static void writeByte(u8 ch)
 54 {
 55    int i = 0;
 56    STCP_595_LOW();
 57    SHCP_595_LOW();
 58    for(i=8;i;--i)
 59    {
 60     if(ch&0x80)
 61     {
 62         DS_595_HIGH();
 63     }
 64     else
 65     {
 66         DS_595_LOW();
 67     }
 68     SHCP_595_HIGH();
 69     ch <<= 1;
 70     SHCP_595_LOW();
 71    }
 72    STCP_595_HIGH();
 73 }
 74
 75 void LCD1602_writeCmd(u8 cmd)
 76 {
 77     LCD1602_EN_HIGH();
 78     LCD1602_RS_LOW();
 79     writeByte(cmd);
 80     LCD1602_EN_LOW();
 81     delayus(1000);
 82 }
 83
 84 void LCD1602_writeData(u8 data)
 85 {
 86     LCD1602_EN_HIGH();
 87     LCD1602_RS_HIGH();
 88     writeByte(data);
 89     LCD1602_EN_LOW();
 90     delayus(1000);
 91 }
 92
 93 static void hw_init(void)
 94 {
 95   GPIO_InitTypeDef  GPIO_InitStructure;
 96
 97   /* Enable the GPIO Clock */
 98   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
 99
100   /* Configure the GPIO pin */
101   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_5|GPIO_Pin_4;
102   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
103   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
104   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
105   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
106   GPIO_Init(GPIOB, &GPIO_InitStructure);
107 }
108
109 void lcd1602_init(void)
110 {
111    hw_init();
112
113    LCD1602_writeCmd(CMD_CARET_SHIFT(R_SHIFT));
114    LCD1602_writeCmd(CMD_DISP_ONOFF(DISPLAY_ON));
115    LCD1602_writeCmd(CMD_FUN_SET(DATA_WIDTH_8BITS,ROW_NUM_2,DOT_MATRIC_5_10));
116    LCD1602_writeCmd(CMD_CLR);
117    LCD1602_writeCmd(CMD_CARET_REWIND);
118 }
119
120 /* u8 lcd1602_ReadStatus(void)
121 {
122     LCD1602_RS = 0;
123     LCD1602_RW = 1;
124     return (LCD1602_DATA&0X80)?1:0;
125 } */
126
127 void lcd1602_display(u8*string)
128 {
129     int i = 0;
130     LCD1602_writeCmd(CMD_CLR);
131     LCD1602_writeCmd(CMD_CARET_REWIND);
132     while(*string)
133     {
134        LCD1602_writeData(*string++);
135        ++i;
136        if(i == 16) LCD1602_writeCmd(CMD_DDRAM(0x40));
137     }
138 }
139
140 void lcd1602_display_pos(int row,int column, u8*string)
141 {
142     int pos = (row-1)*0x40+column;
143     LCD1602_writeCmd(CMD_DDRAM(pos));
144     while(*string)
145     {
146        LCD1602_writeData(*string++);
147     }
148 }

LCD1602.C

时间: 2024-10-25 03:01:29

STM32F302 驱动 LCD1602的相关文章

LCD1602液晶显示模块深入详解之软件篇(AVR)

LCD1602液晶显示模块的驱动虽然比七段数码管之类的显示要复杂一些,但实际上也并不是很难,最主要的还是初始化,为什么这么说呢?我们在调试一块新液晶屏的时候,都会先初始化看看有没有光标在闪,没有光标前是一番努力(PROTEUS上也是这么做的),光标出来之后就相对很容易了. 那初始化的流程是怎么样的呢?我们还是看看HD44780的数据手册吧,如下图所示: 可以看到,初始化的主要步骤如下: (1)上电:这特么也算是一个步骤么?是的!如果你用的是其它液晶模块,比如LCD12864,会发现有一个复位引脚

FPGA驱动lLCD1602

今天抽空写了个驱动LCD1602的小程序.众所周知,FPGA的优势在于并行处理,对于并行的任务FPGA是在擅长不过的了.由于 FPGA 的并行性, 不管是扫描键盘, 还是扫描 VGA,还是LED等, 都可以把它们做成独立的模块, 时间上没有冲突, 每个模块可以同时执行.有优势当然也就存在劣势.对于那列串行的顺序控制就是他的不足.办法总比问题多,我们可以用2种方法解决顺序控制的问题:    1.状态机设计    可以用Verilog编写状态机代码来实现顺序控制,所谓的状态机,就是通过控制状态的跳转

Arduino下LCD1602综合探究(中)——如何减少1602的连线,LiquidCrystal库,LiquidCrystal库中bug的解决方法

一.前言: 上文中,笔者系统的阐述了1602的两种驱动方式,并简单的提到了Arduino的LiquidCrystal库.本文紧接上文,对以下两个问题进行更加深入的探讨:如何能够使1602对Arduino的端口占用降到最少?LiquidCrystal库到底应该如何学习?在Arduino下LCD1602综合探究(下)中,笔者拟介绍一个1602的综合性实验,以期对前文的内容加以综合应用和总结.闲话少说,下面开始进入正文. 二.减少1602对Arduino的端口占用 <1>不使用I2C 在上文中,笔者

如何为编程爱好者设计一款好玩的智能硬件(八)——LCD1602点阵字符型液晶显示模块驱动封装(中)

六.温湿度传感器DHT11驱动封装(下):如何为编程爱好者设计一款好玩的智能硬件(六)——初尝试·把温湿度给收集了(下)! 七.点阵字符型液晶显示模块LCD1602驱动封装(上):如何为编程爱好者设计一款好玩的智能硬件(七)——LCD1602点阵字符型液晶显示模块驱动封装(上) 八.LCD1602点阵字符型液晶显示模块驱动封装(中) 已经有好一阵子没写了,一方面是因为最近闲杂的事特多,另一方面(主要方面)是因为我卡在了LCD1602驱动的权衡上面——总共3个控制线和一个8位并行的数据线,放在51

LCD1602液晶显示模块深入详解篇一

(本文以HD44780主控芯片的LCD1602为蓝本进行描述,其中的截图也来自HD44780数据手册,用户可自行搜索其datasheet,有部分整理网上的,但绝对要比你看到的要深入得多) 一.接口 LCD1602是很多单片机爱好者较早接触的字符型液晶显示器,它的主控芯片是HD44780或者其它兼容芯片.刚开始接触它的大多是单片机的初学者.由于对它的不了解,不能随心所欲地对它进行驱动.经过一段时间的学习,我对它的驱动有了一点点心得,今天把它记录在这里,以备以后查阅.与此相仿的是LCD12864液晶

CB1 驱动NRF24L01 无线模块 通信成功

系统:lubuntu 官方  (喜欢cb官方原版)硬件: cb   NRF24L01*2   51开发板一块   杜邦线若干 CB1 驱动NRF24L01 无线模块与STC51单片机通信成功!!! 1.废话不多说,上图上代码: 2.自制51单片机开发板:(24L01在右下角,有内置接口)   3.来张清晰的图,上面手抖了,      LCD1602显示温度,并实时通过无线发给cubieboard 1   4. 下图,第一位是正负温度指示,0x00代表正 ,0xff代表零下  . 后两位分别代表温

arduino驱动oled

OLED一款小巧的显示屏,感觉可以做出很可爱的东西. 这次实验的这款是128X64的OLED屏幕 , 芯片是SSD1306,请确认自家模块芯片型号,不然对不上号啊 使用IIC的方法,简单实验显示示例程序. (请确认你手头上的模块可以IIC连接,若干不支持那只能SPI方式接线) 先实现连接与显示,之后再进行更深入的应用. 任意门: Arduino Uno 驱动OLED进阶 显示中英文字 Arduino Uno 驱动OLED进阶 显示图片 Arduino Uno 驱动OLED进阶 显示几何动画 编译

单片机显示原理(LCD1602)

一.接口 LCD1602是很多单片机爱好者较早接触的字符型液晶显示器,它的主控芯片是HD44780或者其它兼容芯片.与此相仿的是LCD12864液晶显示器,它是一种图形点阵显示器,能显示的内容比LCD1602要丰富得多,除了普通字符外,还可以显示点阵图案,带有汉字库的还可以显示汉字,它的并行驱动方式与LCD1602相差无几,所以,在这里花点时间是值得的. 一般来说,LCD1602有16条引脚,据说还有14条引脚的,与16脚的相比缺少了背光电源A(15脚)和地线K(16脚).这块LCD1602的型

android系统平台显示驱动开发简要:LCD基本原理篇『一』

平台信息:内核:linux3.4.39系统:android4.4 平台:S5P4418(cortex a9) 作者:瘋耔(欢迎转载,请注明作者) 欢迎指正错误,共同学习.共同进步!! 关注博主新浪博客:http://weibo.com/cpjphone 从在校时玩单片机的点阵屏,到工作后android系统下的LCD,他们像一条流水线,顺应,简单的原理构成了复杂的结构: 我们来梳理一下: 玩51用的点阵 玩51用的lcd1602 玩51.32用的TFT彩屏 对于点阵的原理相比大多数朋友都非常熟悉,