173 2438 5004
KEROS加密芯片——品牌直销 | 免费样品 | 技术支持
当前位置:网站首页 > 资讯中心 正文 资讯中心

用stm32怎么控制12864原理

keros@mark 2023-03-19 资讯中心

有关stm32驱动5V的12864液晶电路和程序

12864的使用的芯片种类不同驱动程序也不同,常见的有ST7920、KS0108等你先确认一下12864使用的芯片在贴上STM32的程序。

stm32怎么用spi接口控制12864屏

可以。51试过以前使用12864液晶时使用单片机IO口模拟SPI总线,导致显示程序耗时多,频繁刷新屏幕有闪烁。STC新的单片机(比如STC12C5A60S2)自带有SPI总线接口,用SPI硬件驱动LCD无疑是一个很好的选择。做过LCD功能扩展的朋友们知道,LCD驱动程序的核心就是SPI通讯部分,我们只用改写这一部分程序就可以,其他程序不变。这里我参考了STC的数据手册和网友的一个程序,还有一个小问题就是丛机的片选端在STC的头文件中是P1.4,但给的演示程序中改为了P1.3,这点要注意。可以发现使用SPI总线驱动时执行效率很高,使用单片机口线最少,十分便于程序编写。

stm32f407vet6 驱动 oled12864 问题

1.确定电路连接是否正确

2.确定电源是否正常,复位是否正常,D/C使能是否正常

3.确定SPI的是否有输出

在初始化SPI后加入下面语句,用示波器测量MOSI,SCK,是否有输出,数值是否正确,触发波形是否正确(一般是SCK上升沿输入MOSI数据)

while(1)

{

LCD_WrDat(0xca);

}

4.OLED初始化是否正确

详细参考:

现在手上有一个stm32最小系统板,有一个12864模块,我想把它用起来,该怎么接线呢

用IO口直接连12864就可以,记住哪些口是数据传输,哪些口是控制的。同时别忘了共地。就就行了。12864的驱动和操作网上一般都有程序,不难,祝早日调出来

stm32并口驱动12864,求大神看看我的程序错在哪了?编译通过但是屏幕上没显示~搞了两天了,头疼死我了、

我有51的程序,可供参考。

#include "lcd12864.h"

#include "ziku.h"

#include string.h

static void delay(uint j) //延时

{

uchar i;

for(; j!=0; j--)

for(i=0; i100; i++);

}

void busy(void)

{

uchar i;

for(i=0;i50;i++)

_nop_();

}

void wdata(uchar wdata)

{

busy(); //忙提示

LCD_RW=0;

LCD_DI=1;

P0=wdata;

LCD_EN=0;

LCD_EN=1;

LCD_EN=0;

}

void wcode(uchar wcode)

{

busy();

LCD_RW=0;

LCD_DI=0;

P0=wcode;

LCD_EN=0;

LCD_EN=1;

LCD_EN=0;

}

void subinit()

{

delay(10);

wcode(0xc0);//设置显示初始行

}

//设置显示位置

void setxy(uchar x,uchar y)

{

if ((y=0)(y=63))

{

LCD_CSA=0;

LCD_CSB=1;

}

else //if (y=127)

{

LCD_CSA=1;

LCD_CSB=0;

}

wcode(0x40|(y%64));

wcode(0xb8|x);

P0=0xff;

}

void wdram(uchar x,uchar y,uchar dd)

{

setxy(x,y);

wdata(dd);

P0=0xff;

LCD_CSA=1;

LCD_CSB=1;

}

//复位.

void Lcd_RST(void)

{

//rst=0;

LCD_REST=0;

delay(50);

LCD_REST=1;

Lcd_Clear(0,7,0,128);

wcode(0x3f);//开显示

}

//LCD初始化

void Lcd_Init(void)

{

LCD_POR=0;

Lcd_RST();

LCD_CSA=0;

LCD_CSB=1;

wcode(0x3e);subinit();

LCD_CSA=1;

LCD_CSB=0;

wcode(0x3e);subinit();

Lcd_Clear(0,7,0,128);

LCD_CSA=0;

LCD_CSB=1;

wcode(0x3f);//开显示

LCD_CSA=1;

LCD_CSB=0;

wcode(0x3f);//开显示

}

void Lcd_On(void)

{

LCD_CSA=0;

LCD_CSB=1;

wcode(0x3f);//开显示

LCD_CSA=1;

LCD_CSB=0;

wcode(0x3f);//开显示

}

//LCD 清显示屏

void Lcd_Clear(uchar StartLine,uchar StopLine,uchar StartRow,uchar StopRow)

{

uchar x,y;

for(x=StartLine; xStopLine+1; x++)

{

for(y=StartRow; yStopRow; y++)

{

wdram(x,y,0);

}

}

}

//显示一个汉字

void Lcd_DispOneChar(uchar x,uchar y,uchar * hz,uchar disp_mode,uchar Width)

{

uchar i;

for(i=0; iWidth; i++)

{

if(disp_mode==WHITE)

{

wdram(x,y+i,*(hz+i));

wdram(x+1,y+i,*(hz+Width+i));

}

else

{

wdram(x,y+i,0xff-*(hz+i));

wdram(x+1,y+i,0xff-*(hz+Width+i));

}

}

if(Width==12)

{

for(i=12; i14; i++)

{

if(disp_mode==WHITE)

{

wdram(x,y+i,0);

wdram(x+1,y+i,0);

}

else

{

wdram(x,y+i,0xff);

wdram(x+1,y+i,0xff);

}

}

for(i=1; i4; i++)

{

if(disp_mode==WHITE)

{

wdram(x,y-i,0);

wdram(x+1,y-i,0);

}

else

{

wdram(x,y-i,0xff);

wdram(x+1,y-i,0xff);

}

}

}

}

void Lcd_Disp_String(uchar x,uchar y,char *pString,uchar disp_mode)

{

uchar i,j;

uchar LineDispCode[16];

//strlen(),为字符串长度测量。

memset(LineDispCode,0,16); //清零数组

strcpy(LineDispCode,pString); //字符串之间的相互复制。

for(i=0; istrlen(pString); i++)

{

LineDispCode[i]=*(pString+i);

}

i=0;

while(LineDispCode[i]!=0)

{

if(LineDispCode[i]=0xA0)

{

//显示的是汉字

for(j=0; jZIMO_NUM; j++)

{

if(GB_12[j].Index[0]==LineDispCode[i]

GB_12[j].Index[1]==LineDispCode[i+1])

{

//显示的是汉字

Lcd_DispOneChar(x,y,GB_12[j].Msk,disp_mode,12);

y+=16;

break;

}

}

i+=2;

}

else

{

//显示的是ASCII编码

for(j=0; jASC_NUM; j++)

{

if(ASC_12[j].Index==LineDispCode[i])

{

//显示的是汉字

Lcd_DispOneChar(x,y,ASC_12[j].Msk,disp_mode,8);

y+=8;

break;

}

}

i++;

}

if(i=16)

{

break;

}

}

}

//显示数字.

void Lcd_Disp_OneNum(uchar x,uchar y,uchar num,uchar disp_mode)

{

switch(num)

{

case 0:{Lcd_Disp_String(x,y,"0",disp_mode);}break;

case 1:{Lcd_Disp_String(x,y,"1",disp_mode);}break;

case 2:{Lcd_Disp_String(x,y,"2",disp_mode);}break;

case 3:{Lcd_Disp_String(x,y,"3",disp_mode);}break;

case 4:{Lcd_Disp_String(x,y,"4",disp_mode);}break;

case 5:{Lcd_Disp_String(x,y,"5",disp_mode);}break;

case 6:{Lcd_Disp_String(x,y,"6",disp_mode);}break;

case 7:{Lcd_Disp_String(x,y,"7",disp_mode);}break;

case 8:{Lcd_Disp_String(x,y,"8",disp_mode);}break;

case 9:{Lcd_Disp_String(x,y,"9",disp_mode);}break;

default: break;

}

}

//显示二位数。

void Disp_2num(uchar x,uchar y,uchar num,uchar disp_mode)

{

uchar ch[2];

ch[0]=num%10;

ch[1]=num/10;

Lcd_Disp_OneNum(x,y,ch[1],disp_mode);

Lcd_Disp_OneNum(x,y+8,ch[0],disp_mode);

}

//*****************************************************

//显示三位数。

void Disp_3num(uchar x,uchar y,uint num,uchar disp_mode)

{

uchar ch[2];

ch[0]=num/100;

ch[1]=num%100;

if(ch[0])

Lcd_Disp_OneNum(x,y, ch[0],disp_mode);

else

Lcd_Disp_String(x,y," ",disp_mode);

Disp_2num(x,y+8, ch[1],disp_mode);

}

//*****************************************************

//显示四位数。

void Disp_4num(uchar x,uchar y,uint num,uchar disp_mode)

{

uchar ch[4],tmp;

tmp=num/100;

ch[0]=tmp/10;

ch[1]=tmp%10;

tmp=num%100;

ch[2]=tmp/10;

ch[3]=tmp%10;

Lcd_Disp_OneNum(x,y,ch[0],disp_mode);

Lcd_Disp_OneNum(x,y+8,ch[1],disp_mode);

Lcd_Disp_OneNum(x,y+16,ch[2],disp_mode);

Lcd_Disp_OneNum(x,y+24,ch[3],disp_mode);

}

void Lcd_DispIco2(uchar x,uchar y,uchar *pIco)//显示老肯图标

{

uchar i,j;

for(i=0; i4; i++)

{

for(j=0; j32; j++)

{

wdram(x+i,y+j,*pIco);

pIco++;

}

}

}

//*****************************************************

//显示多位数。 disp_mode0x10==1时,进行即每位都显示,否则大于0的位置不显示。

void Disp_NumGB16(uchar x,uchar y,ulong Data,uchar num,uchar disp_mode)

{

uchar idata ch=0,i,tmp;

for(i=0;inum;i++)

{

tmp=Data%10;

Data/=10;

if((disp_mode0x10)||tmp0||Data0||num=2)

Lcd_Disp_OneNum(x,y+(num-i-1)*8,tmp,disp_mode%10);

else

Lcd_Disp_String(x,y+(num-i-1)*8," ",disp_mode%10);

}

}

stm32接12864液晶,用串口好,还是并口好?串口速度能有多快?能满足哪些方面的需求?谢谢!

12864液晶单屏数据是8K字节,如每秒刷新10次,即80K字节的数据量。

如果使用并口,即每秒大概有80K组操作;如果是模拟并口,大概是320K次操作

如果使用串口,操作次数是并口的8倍速左右,即每秒不会超过5M次。

而stm32的运行速度可以达到70MIPS,远远高于上述的5M次,所以无论是使用并口,还是模拟并口,还是串口,在速度上都是没有问题的。

我有产品中用过STM32模拟并口和模拟串口来驱动12864,都没有问题。

本文标签:用stm32怎么控制12864原理

产品列表
产品封装
友情链接