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的啊,我怎么做都控制不好,不知道是哪里错了等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)