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

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

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

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

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

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

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

12864还有并口转串口?是串行、并行选择吧?

PSB就是并行、串行选择引脚,PSB=1代表并行模式,PSB=0代表串行模式。

你可以用微处理器的I/O引脚连接PSB,达到串行、并行可选。

#include <pic18fxx2h>

#define nop() asm("nop")

#define uint unsigned int

#define uchar unsigned char

#define LcdData PORTD

#define LcdRS RE0 //指令数据口

#define LcdRW RE1 //读写控制口

#define LcdEn RE2 //使能端口

#define LcdPS RB4 //串并口选择

#define LcdRst RB5 // 复位端

#define Busy RD7 //忙标志位

#define dat 1

#define comm 0

#define x1 0x80

#define x2 0x88

#define y 0x80

void delay(uint Deconst);

void chk_busy(void);//测忙程序

void send2lcd(uchar dat_comm,uchar content);//向lcd发送指令数据程序

void init_port(void);

void init_lcd(void);

void lat_disp(uchar data1,uchar data2);//点阵

//--------------------------------------------------------

void delay(uint Deconst)

{

while(Deconst--);

}

//--------------------------------------------------------

void chk_busy(void)

{

TRISD=0xff;//RD为输入

LcdRS=0;

LcdRW=1;

LcdEn=1;

while(Busy==1); //!!!!!!!!!!!!!!!!!!就卡在这了!!!!!!!

LcdEn=0;

TRISD7=0x00;//RD恢复为输出

}

//---------------------------------------------------------

void send2lcd(uchar dat_comm,uchar content)

{

chk_busy();//忙标志检查

if (dat_comm)

{

LcdDC=1;

LcdRW=0;

}

else

{

LcdDC=0;

LcdRW=0;

}

PORTD=content;

LcdEn=1;

delay(5);

LcdEn=0;

}

//---------------------------------------------------------

void init_port(void)//IO口初始化

{

TRISD=0x00;

TRISE=0x00;

TRISB4=0;

TRISB5=0;

}

//----------------------------------------------------------

void init_lcd(void)

{

LcdRst=1;//禁用复位

LcdPS=1;//选择并口工作方式

delay(50);

send2lcd(comm,0x30);

delay(250);//

send2lcd(comm,0x30);

delay(90);//

send2lcd(comm,0x3C);//

send2lcd(comm,0x38);//

send2lcd(comm,0x01);//

}

//---------------------------------------------------------

void lat_disp(uchar data1,uchar data2)

{

uchar i,j,k,x;

x=x1;

for (k=0;k<2;k++)

{

for(j=0;j<16;j++)

{

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

{

send2lcd(comm,0x34);

send2lcd(comm,y+j2);

send2lcd(comm,x+i);

send2lcd(comm,0x30);

send2lcd(dat,data1);

send2lcd(dat,data1);

}

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

{

send2lcd(comm,0x34);

send2lcd(comm,y+j2+1);

send2lcd(comm,x+i);

send2lcd(comm,0x30);

send2lcd(dat,data2);

send2lcd(dat,data2);

}

}

x=x2;

}

send2lcd(comm,0x36);

}

main(void)

{

INTCON=0x00;

init_port();

init_lcd();

send2lcd(comm,0x01);

send2lcd(comm,0x06);

send2lcd(comm,0x0c);

lat_disp(0x00,0x00);

while(1);

}

12864要看液晶屏的驱动IC是什么,不同的话,肯定不通用。

另外,它的指令多,因为复位的时候,大多指令都会自动设到默认值。程序初始化的时候,只需要更改其中几个。

比如显示指令,复位后,默认值是 显示关闭。初始化就要,显示打开。

我看你的命令像是,ST7920这款IC控制的(猜测),带中文字库的吧?网上驱动很多,有串并口都有。

/////////////////////////////////////////////////////////////////////////////////

//基于arduino 平台的KS0180芯片12864并口显示LCD测试程序by 王瑾 2014/9/27

//程序较大使用小RAM芯片可能无法运行,如无法运行可将调用logo部分删除,会大幅减小RAM使用

//因为uno 坏了只在mega 2560测试成功

//和ST7920芯片主要是RAM地址的分布不同注意分析RAM地址写程序

//程序没有采用库文件,显示程序也没有另写子程序,主要是为了个人修改方便

//////////////////////////////////////////////////////////////////////////////

//

int CS1=A0;//左半屏,高电平有效

int CS2=A1;//右半屏,高电平有效

int RS = 12;

int RW = 11;

int DB[] = {3, 4, 5, 6, 7, 8, 9, 10};//使用数组来定义总线需要的管脚DB 0-7

int Enable = 2;

/////////////////////////////////////////////////////////////////////////

// Bitmap点阵数据表 //

// 内容为:南京舟芯电子,TEL025-66085988 //

// 尺寸: 128 64 //

/////////////////////////////////////////////////////////////////////////

unsigned char logo1[] =

{

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00

};

////////////////////////////////////////////////////////

//写命令子程序

///////////////////////////////////////////////////////

void LcdCommandWrite(int value) {

digitalWrite(RS, 0);

digitalWrite(RW, 0);

int i = 0;

for (i=3; i <= 10; i++) //总线赋值

{

digitalWrite(i,value & 01);//value与0001相与赋予i

value >>= 1;//value右移一位

}

digitalWrite(Enable,1);

delayMicroseconds(1);

digitalWrite(Enable,LOW);

delayMicroseconds(1);

}

//////////////////////////////////////////////////////

//写数据子程序

/////////////////////////////////////////////////////

void LcdDataWrite(int value) {

// 定义所有引脚

int i = 0;

digitalWrite(RS, 1);

digitalWrite(RW, 0);

//digitalWrite(DI, HIGH);

//digitalWrite(RW, LOW);

for (i=DB[0]; i <= DB[7]; i++) {

digitalWrite(i,value & 01);

value >>= 1;

}

digitalWrite(Enable,HIGH);

delayMicroseconds(1);

digitalWrite(Enable,LOW);

delayMicroseconds(1); // 延时百万分之一秒

}

///////////////////////////////////////////////////

//输出引脚声明

//////////////////////////////////////////////////

void setup (void) {

int i = 0;

for (i=Enable; i <= 12; i++) {

pinMode(i,OUTPUT);

}

pinMode(A0,OUTPUT);

pinMode(A1,OUTPUT);

}

////////////////////////////////////////////

//循环主程序

/////////////////////////////////////////////////

void loop (void) {

///////////////////////////////////////////////////////////////////////////////////////////

//初始化,因为KS0108芯片无初始化命令需要对整个屏幕赋值0x00, 不然的话会有杂点

//没有查到KS0108芯片的始化命令,位图调用一直有杂点,采用REST复位也不能解决,所以采用此方法

//////////////////////////////////////////////////////////////////////////////////////////

digitalWrite(CS1,1);

digitalWrite(CS2,1);

LcdCommandWrite(0x3e); // 显示关

int i = 0;

int yg,x,y;

int temp;

int tmp;

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

{

x=yg+0xb8; //0xb8为首页地址

y=0x40; //0x40为首列地址注意分析规格书RAM地址分布图

LcdCommandWrite(x); //写入y轴坐标

LcdCommandWrite(y); //写入x轴坐标

tmp=yg64;

for(i=0;i<64;i++)

{

LcdDataWrite(0x00);

tmp++;

}

}

LcdCommandWrite(0x3f); //显示图象

delay(1);

//////////////////////////////////////////////////////////

//显示ZXET logo

///////////////////////////////////////////////////////////

digitalWrite(CS1,1); //先显示左半屏

digitalWrite(CS2,0);

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

{

x=yg+0xb8;

y=0x40;

LcdCommandWrite(x); //写入y轴坐标

LcdCommandWrite(y); //写入x轴坐标

tmp=2yg64;

for(i=0;i<64;i++)

{

LcdDataWrite(logo[tmp]);

tmp++;

}

}

LcdCommandWrite(0x3f); //此处无需延迟直接接右半屏显示程序

////////////////////////

digitalWrite(CS1,0); //显示右半屏

digitalWrite(CS2,1);

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

{

x=yg+0xb8;

y=0x40;

LcdCommandWrite(x); //写入y轴坐标

LcdCommandWrite(y); //写入x轴坐标

tmp=(2yg+1)64;

for(i=0;i<64;i++)

{

LcdDataWrite(logo[tmp]);

tmp++;

}

}

LcdCommandWrite(0x3f);

delay(3000);

///////////////////////////////////////////////////////////////

//显示 文字,依然采用位图数据调用,KS0108无字库只能采用这种办法

///////////////////////////////////////////////////////////////

digitalWrite(CS1,1);

digitalWrite(CS2,0);

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

{

x=yg+0xb8;

y=0x40;

LcdCommandWrite(x); //写入y轴坐标

LcdCommandWrite(y); //写入x轴坐标

tmp=2yg64;

for(i=0;i<64;i++)

{

LcdDataWrite(logo1[tmp]);

tmp++;

}

}

LcdCommandWrite(0x3f);

//////////////////////////////////////

digitalWrite(CS1,0);

digitalWrite(CS2,1);

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

{

x=yg+0xb8;

y=0x40;

LcdCommandWrite(x); //写入y轴坐标

LcdCommandWrite(y); //写入x轴坐标

tmp=(2yg+1)64;

for(i=0;i<64;i++)

{

LcdDataWrite(logo1[tmp]);

tmp++;

}

}

LcdCommandWrite(0x3f);

delay(3000);

///////////////////////////////////////////////////////

//测试画面 :全黑

////////////////////////////////////////////////////////

digitalWrite(CS1,1);

digitalWrite(CS2,1);

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

{

x=yg+0xb8;

y=0x40;

LcdCommandWrite(x); //写入y轴坐标

LcdCommandWrite(y); //写入x轴坐标

for(i=0;i<64;i++)

{

LcdDataWrite(0xFF);

}

}

LcdCommandWrite(0x3f);

delay(3000);

///////////////////////////////////////////////////////

//测试画面 :全白

////////////////////////////////////////////////////////

digitalWrite(CS1,1);

digitalWrite(CS2,1);

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

{

x=yg+0xb8;

y=0x40;

LcdCommandWrite(x); //写入y轴坐标

LcdCommandWrite(y); //写入x轴坐标

for(i=0;i<64;i++)

{

LcdDataWrite(0x00);

}

}

LcdCommandWrite(0x3f);

delay(3000);

///////////////////////////////////////////////////////

//测试画面 :数条纹

////////////////////////////////////////////////////////

digitalWrite(CS1,1);

digitalWrite(CS2,1);

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

{

x=yg+0xb8;

for(i=0;i<32;i++)

{

y=0x40+2i;

LcdCommandWrite(x); //写入y轴坐标

LcdCommandWrite(y); //写入x轴坐标

LcdDataWrite(0xFF);

}

}

LcdCommandWrite(0x3f);

delay(3000);

}

以上就是关于stm32接12864液晶,用串口好,还是并口好串口速度能有多快能满足哪些方面的需求谢谢!全部的内容,包括:stm32接12864液晶,用串口好,还是并口好串口速度能有多快能满足哪些方面的需求谢谢!、你的12864并口转串口电路怎么转,那个PSB电路怎么连的、有谁会控制km12864的啊,我怎么做都控制不好,不知道是哪里错了等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9367228.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存