st7565 调试
这是我在USB电话开发中的显示屏幕驱动笔记的摘抄.
Skype-usb电话一般使用小黑白lcd,我选了一些lcd,最终确定使用了一款ST7565核心的点阵lcd,屏幕大小是128x64.本来想选oled的,可是成本比较高,我06年问的一个双128x64大小的oled一般卖到17块左右,用不起中= =b.而同样大小的lcd一般只有10块左右.
这里首先说一下我选lcd调试时遇到的一些问题,帮助大家少走一些弯路.因为单片机的io往往比较有限,所以我们在选这种小lcd的时候往往使用串行控制的lcd,一般都是标准的spi接口的.而一些初次尝试驱动小lcd的朋友通常回想到,在没有spi的单片机用io模拟时序略显复杂,所以想直接选用并行数据控制的lcd,这种小黑白lcd往往使用一组8位的数据总线D0--D7来交互显示数据,看起来io写时序控制比较容易.我起初也是用了一款并行数据控制的lcd,然而却没调试成功.问题出在时序的匹配上.我们必须考虑lcd所能接受的最慢时序单片机性能是否能满足.如果单片机不仅仅用来显示,而还要同时完成一些其他的必须及时进行的操作,这个问题尤其突出.所以,最终我的感觉是,能用spi则用spi,否则也还是用io模拟串行时序做起来简单一些,否则一但遇到性能问题,将十分棘手.一般来说,如果你纯粹使用io做时序,连接一个使用ST7565核心的lcd需要使用至少5个io管脚,分别接lcd的信号SI(串行数据),SCL(串行时钟),A0(数据指令选择),\RES(复位),CS(片选).
下面说一下ST7565P的使用中遇到的一些问题.首先,l cd要使用一般必须外部接电容构成正倍压电路,有了pump才能显示.我在开发usb电话时使用了一组datasheet上说明的4倍压电路.在用电容时遇到了问题,一般我们调试的时候喜欢焊接直插件,而电容一般有极性.很多ST7565P核心的lcd在管脚标识的时候,正负号与电容的正负正好相反,所以出现调试的时候倍压不能的情况,一般显示器的厂商会提醒全部使用无极性电容,一般直接用产品化后设定的贴片电容来焊接即可,不需要刻意买一些直插的.
我使用的holtek hr82a832r单片机来做的usb电话,这个片子有现成的spi接口,所以使用lcd 不需要使用io模拟,比较容易.用io模拟时序的方式我也试了,完全可行.用单片机的spi记得调整SCL上升沿还是下降沿锁定数据,否则这样的低级错误被遗忘会浪费不少时间迷茫~ 其他时序完全参照mcu和lcd核心i c的datasheet搞定即可.
一般屏幕的初始化和显示测试程序可以向lcd提供商索要,他们一般有pic或是普通51的测试程序.有了初始化的demo做起来省很多时间.这里还要补充一点,如果屏幕初始化了不显示,各种电气信号又都测量出正常,不要着急,调整一下lcd的显示亮度.我一开始就是因为lcd的显示对比度设置不妥当,导致全是黑屏.对于ST7565P,微调指令是0x81 0xmm (mm=00--3f) 粗调指令是0x2n (n=0--7),我使用不同厂家的屏幕,发现显示对比度设置后,效果差距较大,一个设置0x0d 0x26正好,一个需要设置0x0a 0x27才可以,第一个屏幕使用第二条设置会几乎黑屏. 调试ok以后,显示几个图形,心情很不错.
串行驱动方式,唯一要注意的一点就是WR和RD这两个引脚虽然用不到,但是要接地,否则无法正常显示。当时调了很久。不知道其他厂家的是否也这样。
很多程序都没有用,但是参照这些,起码可以驱动起来了。对刚拿到片子的或点不亮的希望有点帮助吧。
lcd.h里面有硬件连接图。
/************************lcd.h*************************/
#ifndef __LCD_H__
#define __LED_H__
sbit LCDCS = P0^7;
sbit LCDA0 = P0^6;
sbit LCDSK = P3^7;
sbit LCDSI = P1^7;
sbit LCDRS = P1^6;
void LCDInit();
void LCDWriteByte(char dat,char command);
void LCDShiftWrite(char dat);
void LCDSetXY(char x, char y);
void LCDc ls(char);
void menushow(char line,char num,char state);
void gbshow(char x,char y,unsigned char *p);
void asc1632show(char x,char y,unsigned char *p);
void asc816show(char x,char y,unsigned char *p);
void asc1632bottom(char x,char state);
#endif
/**************************************lcd.c************************************/
#include <reg52.h>
#include <intrins.h>
#include "lcd.h"
#include "app.h"
extern unsigned char code hzcode[][128];
extern unsigned char code gbcode[][32];
extern unsigned char code asc816code[][16];
extern unsigned char code asc1832code[][64];
extern unsigned char code arrow[];
void LCDInit()
{
LCDRS = 0;
Delayms(100);
LCDRS = 1;
Delayms(100);
LCDWriteByte(0xe2,1);
Delayms(100);
LCDWriteByte(0x84,0);
LCDWriteByte(0x07,0);
LCDWriteByte(0x82,0);
LCDWriteByte(0x03,0);
LCDWriteByte(0x85,0);
LCDWriteByte(0x0a,0);
LCDWriteByte(0xa0,0);
LCDWriteByte(0xc0,0);
LCDWriteByte(0xa6,0);
LCDWriteByte(0x26,0);
LCDWriteByte(0x81,0);
LCDWriteByte(0x0f,0);
LCDWriteByte(0x2f,0);
LCDWriteByte(0xa4,0);
LCDcls(0);
LCDWriteByte(0xaf,0);
}
void LCDWriteByte(char dat,char command) {
LCDCS = 0; //CS=0
if(command == 0)
{
LCDA0 = 0; //A0=0,命令
LCDShiftWrite(dat);
}
else
{
LCDA0 = 1; //A0=1,数据
LCDShiftWrite(dat);
}
LCDCS = 1; //CS=1;
}
void LCDShiftWrite(char dat)
{
unsigned char i;
unsigned char Series,Temp;
LCDSK = 0; //SCL=0
Series = dat;
for(i=0; i<8; i++)
{
LCDSK = 0; //SCL=0
Temp=Series & 0x80;
if(Temp)
{
LCDSI = 1;//SI=1
}
else
{
LCDSI = 0;//SI=0
}
LCDSK = 1; //SCL=1
Series = Series << 1;
}
}
void LCDSetXY(char x, char y)
{
LCDWriteByte(0xB0|y,0);// Page(Row)
LCDWriteByte(0x10|(x>>4),0);// Column high LCDWriteByte(0x00|(x&0x0f),0);// Column low }
void LCDc ls(char value)
{
unsigned char i,n;
for(i=0;i<9;i++)
{
LCDSetXY(0,i);
for(n=0;n<128;n++)
{
LCDWriteByte(value,1);
}
}
}
void menushow(char line,char num,char state)
{
/***************************************************** line 取值0-2,显示的行号
num 所对应的字在字库里面的偏移
state 是否反显 1 = 反显
*****************************************************/ unsigned char i;
LCDSetXY(32,line*2+2);
for(i=0; i<64; i++)
{
if(state)
{
LCDWriteByte((~hzcode[num][i*2]),1);
}
else
{
LCDWriteByte((hzcode[num][i*2]),1);
}
}
LCDSetXY(32,line*2+3);
for(i=0; i<64; i++)
{
if(state)
{
LCDWriteByte((~hzcode[num][i*2+1]),1);
}
else
{
LCDWriteByte((hzcode[num][i*2+1]),1);
}
三星s7568怎么样}
}
void gbshow(char x,char y,unsigned char *p)
{
unsigned char i;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论