历史上的今天
返回首页

历史上的今天

今天是:2025年07月30日(星期三)

正在发生

2019年07月30日 | STM32驱动LCD12864显示屏

2019-07-30 来源:eefocus

我们做一个电子产品,往往需要实现人机交互的功能。那么人机交互的方式除了输出到上位机通过电脑去显示,显示器也是一个很不错的方式,可用于一些不能使用电脑的场合。LCD12864显示器中的一种,具有价格低廉,操作简单的优点。今天就为大家带来一个STM32驱动12864的例程,使用SPI串行通信,仅仅需要三根数据线就可以完成通信。废话不多说,进入正题。


接线:         RS----PB15

RW----PB14

EN----PB13

PSB---GND


1.初始化IO口以及显示屏


void Lcd_Init(void) 

    GPIO_InitTypeDef  GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);//使能端口时钟

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //端口配置

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz

    GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIO

    GPIO_SetBits(GPIOA,GPIO_Pin_0); //输出高

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;//端口配置

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz

    GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIO

    GPIO_SetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); //输出高

    LCD_PSB_0; //一直拉低,用串口方式驱动 (可直接接地)

    LCD_RS_1;  //CS一直拉高,使能液晶(可直接接VCC)

 

    Lcd_Write_Cmd(0x30); 

    delay_us(10000);

    Lcd_Write_Cmd(0x01);

    delay_us(10000);

    Lcd_Write_Cmd(0x02);

    delay_us(10000);

    Lcd_Write_Cmd(0x06);

    delay_us(10000);

    Lcd_Write_Cmd(0x0c);

    delay_us(10000);

    Lcd_Write_Cmd(0x34); //图形开启(不显示)

    delay_us(10000);

    Lcd_Fill(0x00);    //清空屏内RAM

    delay_us(10000);

    Lcd_Write_Cmd(0x36); //图形开启(开显示)

    delay_us(10000);

}

2.向LCD12864写字节函数

void SendByte(uchar Dbyte)  

{

     uchar i;

     for(i=8;i>0;i--)

     {

       if (Dbyte&0x80)  LCD_SID_1;

       else  LCD_SID_0; 

       LCD_SCLK_1; //如果显示有问题,则需在此后加延迟

       delay_us(1); //72MHZ速度太快,M0的48MHZ就无需加

       LCD_SCLK_0;

       Dbyte<<=1;

     }

}

3.写命令和数据函数

void Lcd_Write_Cmd(uchar Cbyte )

{

    

     SendByte(0xf8);              //11111,RW(0),RS(0),0

     SendByte(0xf0&Cbyte);        

     SendByte(0xf0&Cbyte<<4);   

    

}

 

void Lcd_Write_Data(uchar Dbyte )

{    

     SendByte(0xfa);              //11111,RW(0),RS(1),0

     SendByte(0xf0&Dbyte);        

     SendByte(0xf0&Dbyte<<4);  

}

4.设置显示起始地址函数

void LCD_Set_XY(uchar x,uchar y) 

{

    unsigned char k = 0;   

switch(x)

{

case 1: 

    k = 0x80 + y;

    break;

        case 2: 

k = 0x90 + y;

break;    

case 3: 

k = 0x88 + y;

break;  

        case 4: 

k = 0x98 + y;

break;

default:

k = 0x80 + y;

}

    Lcd_Write_Cmd(k);

}

5.显示汉字函数

void hanzi_Disp(unsigned char x,unsigned char y,unsigned char *s)

Lcd_Write_Cmd(0x30); //进入标准模式

LCD_Set_XY(x,y);

while (*s)  

{

Lcd_Write_Data(*s);

s++;

}

Lcd_Write_Cmd(0x36); //返回图形模式

}

6.再写一个清屏函数

void Lcd_Fill(uchar color) //填充屏内RAM

{  

  uchar x,y,i;

  Lcd_Write_Cmd(0x34);  

   for(i=0;i<9;i=i+8)   

   for(y=0;y<0x20;y++)

   {     

   for(x=0;x<8;x++)

       { 

        Lcd_Write_Cmd(y+0x80);       

        Lcd_Write_Cmd(x+0x80+i);      

        Lcd_Write_Data(color);   

        Lcd_Write_Data(color);   

       }

   } 

  Lcd_Write_Cmd(0x36);

}

上面是一些函数的定义,最后我们在主函数里点用这些函数,就能显示我们想要显示的内容了。

最后补充一个显示变量的小技巧,采用sprintf函数先将变量存在字符串里面,然后我们去调用显示字符串函数就行了。



推荐阅读

史海拾趣

台湾凌通(Generalplus)公司的发展小趣事
检查控制电路中的其他元件(如继电器、晶体管等)是否工作正常,有无损坏或接触不良的情况。
Global Mixed-Mode Technology Inc公司的发展小趣事
报警灯的颜色和数量可以根据实际需求来设定。通常,为了区分不同的缺相情况,可以使用不同颜色的报警灯来对应不同的缺相相别。例如,黄色灯表示L1相缺相,绿色灯表示L2相缺相,红色灯表示L3相缺相。数量上,一般至少需要一个报警灯来指示缺相状态,但也可以设置多个报警灯以增加冗余或提供额外的视觉提示。
Antenna Factor公司的发展小趣事

Antenna Factor公司最初由几位热衷于无线通信技术的工程师创立。创业初期,他们面临着资金短缺、技术难题和市场认可度低等多重挑战。然而,他们凭借着对技术的执着和不懈的努力,成功开发出了一款具有高性价比的天线产品,并获得了市场的初步认可。这一突破性的产品为公司的发展奠定了坚实的基础。

Aromat Corp公司的发展小趣事

为了进一步提升公司的竞争力,Aromat Corp开始实施国际化战略。公司积极拓展海外市场,通过设立海外分支机构、与当地企业合作等方式,将产品推向全球。同时,Aromat Corp还加强了与国际同行的交流与合作,学习借鉴先进的经验和技术,不断提升自身的综合实力。

APM Hexseal公司的发展小趣事

APM Hexseal的产品很快在军事领域获得了广泛应用。公司的密封靴子通过了严格的军事检查和独立的QPL等效项,证明了其卓越的性能和可靠性。此外,APM Hexseal还协助开发了MIL-B-5423规范(现为MIL-DTL-5423),为军方的新设备保护要求设定了初始标准。这一合作不仅提升了APM Hexseal在军事领域的影响力,也为其在电子行业中的发展打开了新的大门。

General Semiconductor ( Vishay )公司的发展小趣事

Vishay一直致力于技术创新和产品升级。在2001年,公司收购了全球二极管和整流器领先制造商General Semiconductor,这一收购极大地增强了Vishay在二极管和整流器领域的实力。同时,Vishay还通过收购RFWaves公司,涉足无线领域,为公司带来了新的增长动力。此外,Vishay还在全球范围内布局制造基地和销售办事处,确保能够为客户提供优质的产品和服务。

问答坊 | AI 解惑

综合布线系统施工秘诀【转帖】

 第一部分 给电缆做标识,省时省力 一.问题 连接到工作站的电缆没有标签或标签不好在安装过程或安装结束后,会增加人工消耗。例如,不恰当的标注意味着商人在拉好电缆后必须使用音频发生器和感应捧来识别电缆。 最近一项工作安装了1000多根电缆 ...…

查看全部问答>

关于RAM使用量!

在WindwosCE中,有没有能够取得RAM总量,当前RAM使用量和使用率得API函数啊! 取得FalshROM的函数可以使用KernelIoControl 直接就全部取得了。 RAM方面应该有相应的函数吧! 请各位帮忙。 …

查看全部问答>

变频器基础知识18个问题------供初学者参考

1、什麽是变频器? 变频器是利用电力半导体器件的通断作用将工频电源变换为另一频率的电能控制装置。2、PWM和PAM的不同点是什麽? PWM是英文Pulse Width Modulation(脉冲宽度调制)缩写,按一定规律改变脉冲列的脉冲宽度,以调 ...…

查看全部问答>

学习Hercules 用户手册( 中文)

这2份中文资料,可以提高对Hercules的了解!…

查看全部问答>

UART配送的程序突然不能向PC发送字符了

之前使用配送的UART程序,用的是TKS的串口调试工具可以接受PC发来的字符,也可以向PC发送字符;在使用SecureCRT_CN之后,只能接受PC发送的字符,而不能向PC发送字符了,这是什么原因?望高手指导,不胜感激…

查看全部问答>

PIC241HJ64GP504引脚问题

PIC241HJ64GP504的UART引脚和CAN模块引脚具体是哪个啊…

查看全部问答>

求助!!为啥用orcad capture 打不开.dsn文件

求助了,各位大神,为啥我用orcad capture 打不开.dsn文件,orcad capture 16.2精简版的 …

查看全部问答>

求指导,程序是对的,可是1602没有反应,这个是怎么回事

/******************************************* 开发坏境:CCSv5.4 开发板:TIVA C Launchpad(TM4C123GH6PM) 程序功能:ADC模数转换器 程序说明:ADC采样,12864显示电压 编程者:Linchpin ********************************************/ #incl ...…

查看全部问答>