搜索
bottom↓
回复: 40

用mega16L 驱动 OCM12864-9(芯片为ST7565p)

[复制链接]

出0入0汤圆

发表于 2008-9-9 09:54:48 | 显示全部楼层 |阅读模式
前天刚到手一个OCM12864-9(芯片为ST7565p),厂家给的手册是英文多汉语少,看起来太慢,想先找个程序看看显示效果,手册中的程序也不全,于是在本坛搜了一下,发现要资料的同学也不少,而大牛们给的东西也不全,初学者实践起来比较困难.于是把手册中的程序改好了,发上来了.
MCU使用的是mega16L 3.3V 使用内部震荡8MHz ,引脚连接在程序中说明,也可以自己定义.再次说明,程序是我改的手册中的,改正了一些错误,增加了一些注释,非我原创.

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2008-9-9 09:56:08 | 显示全部楼层
/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.7a Evaluation
Automatic Program Generator
?Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date    : 2008-9-8
Author  : Freeware, for evaluation and non-commercial use only
Company :
Comments:


Chip type           : ATmega16L
Program type        : Application
Clock frequency     : 8.000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 256
*****************************************************/

#include <mega16.h>
#include <delay.h>

//以下为连接方式  其中PORTC与数据口连接
#define LCD_RS PORTA.3    //即 A0
#define LCD_RW PORTA.4
#define LCD_CS PORTA.5    //CS1
#define LCD_RES PORTA.6   //RST
#define LCD_E PORTA.7



//忙检测
void check_busy(void)
{
unsigned char read_data=0xff;
DDRC=0x00;
PORTC=0x00;
LCD_RS=0;
LCD_RW=1; //读命令
LCD_CS=0; //片使能
while(read_data&0x80)
{
LCD_E=1;
#asm("nop");
#asm("nop");
read_data=PORTC;
LCD_E=0;
#asm("nop");
#asm("nop");
}
LCD_E=0;
LCD_CS=1; //片禁能
DDRC=0xFF;
}     

//写命令到寄存器
void send_cmd(unsigned char cmd)
{
check_busy();
LCD_RS=0;
LCD_RW=0; //写命令
LCD_CS=0; //片使能
PORTC=cmd;
LCD_E=1;
#asm("nop");
#asm("nop");
LCD_E=0;
#asm("nop");
#asm("nop");
LCD_CS=1; //片禁能
}   

//写数据到DDRAM
void send_dat(unsigned char dat)
{
check_busy();
LCD_RS=1;
LCD_RW=0; //写数据
LCD_CS=0; //片使能
PORTC=dat;
LCD_E=1;
#asm("nop");
#asm("nop");
LCD_E=0;
#asm("nop");
#asm("nop");
LCD_CS=1; //片禁能
}     

//初始化   设置LCD的控制电压, 行 列 页的初始化
void lcd_initial(void)
{
LCD_RES=1;      //复位,延时50ms
delay_ms(50);
send_cmd(0xE2);  //internal reset         
send_cmd(0xA3);  //LCD bias set 1/7 bias  
send_cmd(0xA0);  //ADC select  normal   
send_cmd(0xC8);  //Common output mode select reverse direction
send_cmd(0x24);  //V0 voltage regulator internal resistor ratio set  V0 调压器内部电阻率设定(控制对比度,后三位)
send_cmd(0x81);  //electronic voltage mode set 亮度调整,下一命令是它的具体值
send_cmd(0x14);  // 后6位
send_cmd(0x2C);  //power control set
send_cmd(0x2E);  //from 0x28 to 0x2F
send_cmd(0x2F);  //
send_cmd(0x40);  //Display start line set
send_cmd(0xB0);  //page address set
send_cmd(0x10);  //column address set upper bit
send_cmd(0x00);  //column address set lower bit
send_cmd(0xAF);  //Display ON
}

void clearLCD(void)
{
unsigned char page,seg;

for(page=0xb0;page<0xb8;page++)
{
  send_cmd(page);
  send_cmd(0x10);                            /*列地址高位,D4位为1表示高位地址*/
  send_cmd(0x00);                            /*列地址低位,D4位为0表示低位地址*/
  for(seg=0;seg<128;seg++)
  {
   send_dat(0xFF);
  }
}
}

void main(void)
{

PORTA=0x00;
DDRA=0x8F;

PORTB=0x00;
DDRB=0x00;

PORTC=0x00;
DDRC=0xFF;

PORTD=0x00;
DDRD=0x00;

lcd_initial(); //LCD初始化
clearLCD();    //清屏
while (1)
      {
      // Place your code here

      };
}

出0入0汤圆

 楼主| 发表于 2008-9-9 13:29:51 | 显示全部楼层
增加一个16X16点阵的显示函数:
unsigned char a1[32]={0x20,0x20,0x22,0x22,0xFE,0x21,0x21,0x20,0x20,0xFF,0x20,0x22,0xAC,0x20,0x20,0x00,0x04,0x04,0x42,0x82,0x7F,0x01,0x01,0x10,0x10,0x08,0x07,0x1A,0x21,0x40,0xF0,0x00};  //汉字 “我” 的点阵数据 ,使用 纵向取模 字节倒序

void disphz(unsigned char pages,unsigned char line,unsigned char * zfdz)
{   //  pages页参数可取(0-7),line 列参数可取(0-111),zfdz 点阵指针
unsigned char page,seg,zi,j;
bit ix=0;

for(page=0;page<2;page++)
{
  send_cmd(page+0xb0+pages);
  j = line & 0xf0;
  j = j/16;
send_cmd(0x10|j);                            /*列地址高位,D4位为1表示高位地址*/
send_cmd(0x0f&line);                             /*列地址低位,D4位为0表示低位地址*/

  zi=0;                           
  for(seg=0;seg<16;seg++)
  {
   if(ix)
   zi=16;
   send_dat(zfdz[seg+zi]);
   
  }
  ix=!ix;
}
}

出0入0汤圆

发表于 2008-9-9 14:07:13 | 显示全部楼层
请问ST7565p与ST7565有什么区别啊?这是7565的手册中文的。
点击此处下载 ourdev_409388.pdf(文件大小:239K) (原文件名:st7565中文.pdf)

出0入0汤圆

 楼主| 发表于 2008-9-9 14:46:31 | 显示全部楼层
应该是一样的,有些IC的尾字母都是代表封装,有些代表版本,而且一般都可以兼容.
你哪个不是手册,这个才是http://www.datasheets.org.uk/pdf/3241267.pdf

出0入0汤圆

发表于 2008-9-9 17:49:21 | 显示全部楼层
谢了 这几天刚在研究

出0入0汤圆

发表于 2008-9-10 11:21:56 | 显示全部楼层
我的那个MP3通用的7565的屏没有ENABLE脚啊,他的几根叫是RD,WR,A0,RES,CS1,我用板试了以下,不行,楼主可以把电路图贴出吗,谢

出0入0汤圆

 楼主| 发表于 2008-9-10 20:46:29 | 显示全部楼层
用的都是7565,就应该行,看我的注释

//以下为连接方式  其中PORTC与数据口连接
                          //一下是一些引脚的别名
#define LCD_RS PORTA.3    //即:A0
#define LCD_RW PORTA.4    //   WR
#define LCD_CS PORTA.5    //   CS1
#define LCD_RES PORTA.6   //   RST
#define LCD_E  PORTA.7    //   RD

你只要吧 “RD,WR,A0,RES,CS1”连到对应的PORTx.y 脚上,
然后定义成我程序中的“LCD_E ,LCD_RW,LCD_RS,LCD_RES,LCD_CS”就行

出0入0汤圆

发表于 2008-9-11 09:08:05 | 显示全部楼层
楼主,我的程序如下,应该没有问题吧,可以正确编译的

#include <mega16.h>
#include <delay.h>

//以下为连接方式  其中PORTC与数据口连接
#define LCD_RS PORTA.3    //即 A0
#define LCD_RW PORTA.4    //WR
#define LCD_CS PORTA.5    //CS1
#define LCD_RES PORTA.6   //RST
#define LCD_E PORTA.7    //RD



//忙检测
void check_busy(void)
{
unsigned char read_data=0xff;
DDRC=0x00;
PORTC=0x00;
LCD_RS=0;
LCD_RW=1; //读命令
LCD_CS=0; //片使能
while(read_data&0x80)
{
LCD_E=1;
#asm("nop");
#asm("nop");
read_data=PORTC;
LCD_E=0;  
#asm("nop");
#asm("nop");
}
LCD_E=0;
LCD_CS=1; //片禁能
DDRC=0xFF;
}      

//写命令到寄存器
void send_cmd(unsigned char cmd)
{
check_busy();
LCD_RS=0;
LCD_RW=0; //写命令
LCD_CS=0; //片使能
PORTC=cmd;
LCD_E=1;
#asm("nop");
#asm("nop");
LCD_E=0;
#asm("nop");
#asm("nop");
LCD_CS=1; //片禁能
}   

//写数据到DDRAM
void send_dat(unsigned char dat)
{
check_busy();
LCD_RS=1;
LCD_RW=0; //写数据
LCD_CS=0; //片使能
PORTC=dat;
LCD_E=1;
#asm("nop");
#asm("nop");
LCD_E=0;
#asm("nop");
#asm("nop");
LCD_CS=1; //片禁能
}      

//初始化   设置LCD的控制电压, 行 列 页的初始化
void lcd_initial(void)
{
LCD_RES=1;      //复位,延时50ms
delay_ms(50);
send_cmd(0xE2);  //internal reset         
send_cmd(0xA3);  //LCD bias set 1/7 bias   
send_cmd(0xA0);  //ADC select  normal     
send_cmd(0xC8);  //Common output mode select reverse direction
send_cmd(0x24);  //V0 voltage regulator internal resistor ratio set  V0 调压器内部电阻率设定(控制对比度,后三位)
send_cmd(0x81);  //electronic voltage mode set 亮度调整,下一命令是它的具体值
send_cmd(0x14);  // 后6位
send_cmd(0x2C);  //power control set  
send_cmd(0x2E);  //from 0x28 to 0x2F
send_cmd(0x2F);  //
send_cmd(0x40);  //Display start line set
send_cmd(0xB0);  //page address set  
send_cmd(0x10);  //column address set upper bit
send_cmd(0x00);  //column address set lower bit
send_cmd(0xAF);  //Display ON
}

void clearLCD(void)
{
unsigned char page,seg;
  
for(page=0xb0;page<0xb8;page++)
{
  send_cmd(page);
  send_cmd(0x10);                            /*列地址高位,D4位为1表示高位地址*/
  send_cmd(0x00);                            /*列地址低位,D4位为0表示低位地址*/
  for(seg=0;seg<128;seg++)
  {
   send_dat(0xFF);
  }
}
}
// 16*16电阵函数//
unsigned char a1[32]={0x20,0x20,0x22,0x22,0xFE,0x21,0x21,0x20,0x20,0xFF,0x20,0x22,0xAC,0x20,0x20,0x00,0x04,0x04,0x42,0x82,0x7F,0x01,0x01,0x10,0x10,0x08,0x07,0x1A,0x21,0x40,0xF0,0x00};  //汉字 “我” 的点阵数据 ,使用 纵向取模 字节倒序
unsigned char a2[32]={0x10,0x80,0x10,0x80,0x20,0x80,0x7C,0xFC,0x45,0x04,0x45,0x04,0x46,0x04,0x7C,0x84,0x44,0x44,0x44,0x64,0x44,0x24,0x44,0x04,0x7C,0x04,0x44,0x28,0x40,0x10,0x00,0x00};  //汉字  的
unsigned char a3[32]={0x02,0x00,0x01,0x00,0x7F,0xFE,0x40,0x04,0x80,0x08,0x3F,0xF8,0x01,0x00,0x01,0x00,0x01,0x00,0x1F,0xF8,0x01,0x40,0x01,0x20,0x01,0x30,0x01,0x20,0x7F,0xFE,0x00,0x00};
unsigned char a4[32]={0x00,0x00,0x1F,0xF0,0x10,0x10,0x10,0x10,0x11,0x10,0x11,0x10,0x11,0x10,0x11,0x10,0x11,0x10,0x11,0x10,0x11,0x10,0x02,0x80,0x04,0x60,0x18,0x18,0x60,0x08,0x00,0x00};
unsigned char a5[32]={0x23,0xF8,0x10,0x48,0x80,0x48,0x4A,0x8C,0x12,0x8A,0xE1,0x0A,0x22,0x28,0x2D,0x10,0x01,0x00,0xFF,0xFE,0x03,0x80,0x05,0x40,0x09,0x30,0x31,0x0E,0xC1,0x04,0x01,0x00};
unsigned char a6[32]={0x00,0x00,0x3F,0xF0,0x08,0x10,0x0B,0xA0,0x08,0xB8,0x12,0x88,0x11,0x08,0x22,0x88,0x44,0x50,0x80,0x20,0x3F,0xF8,0x24,0x48,0x24,0x48,0x24,0x48,0xFF,0xFE,0x00,0x00};
void disphz(unsigned char pages,unsigned char line,unsigned char * zfdz)
{   //  pages页参数可取(0-7),line 列参数可取(0-111),zfdz 点阵指针
unsigned char page,seg,zi,j;
bit ix=0;
  
for(page=0;page<2;page++)
{
  send_cmd(page+0xb0+pages);  
  j = line & 0xf0;
  j = j/16;
send_cmd(0x10|j);                            /*列地址高位,D4位为1表示高位地址*/
send_cmd(0x0f&line);                             /*列地址低位,D4位为0表示低位地址*/
  
  zi=0;                             
  for(seg=0;seg<16;seg++)
  {
   if(ix)
   zi=16;
   send_dat(zfdz[seg+zi]);
   
  }
  ix=!ix;
}
}

void main(void)
{

PORTA=0x00;
DDRA=0x8F;

PORTB=0x00;
DDRB=0x00;

PORTC=0x00;
DDRC=0xFF;

PORTD=0x00;
DDRD=0x00;

lcd_initial(); //LCD初始化
clearLCD();    //清屏
while (1)
      {
      disphz (3,20,a1);
      disphz (3,40,a2);
      disphz (3,60,a3);
      disphz (3,80,a4);
      disphz (3,100,a5);
      disphz (3,120,a6);

      };
}

出0入0汤圆

 楼主| 发表于 2008-9-11 10:09:36 | 显示全部楼层
程序我看不出有什么问题,如果还不能显示,那你这样:
再检查一遍硬件连接,你要照搬这个程序,那你必须用#define 定义这个连接,
而且PORTC与LCD的数据口一一对应(PORTC.0对 D0)

把主程序中的 清屏函数去掉,应该可以看到一些随机亮点,说明初始化成功了

出0入0汤圆

发表于 2008-9-11 10:33:55 | 显示全部楼层
好的,谢谢,要到晚上试一下,我是搞MP3硬件开发的,学单片机,天天接触7565的屏,请教了!

出0入0汤圆

发表于 2008-9-11 15:36:00 | 显示全部楼层
有一个很重要的问题
             我那个7565的128*64的模组是用在MP3上的,是8080的MCU,而ATmega16L是6800的MCU,有个C86的脚要接高电位,可能是只个原因!我回家试试!

出0入0汤圆

发表于 2008-9-23 10:05:03 | 显示全部楼层
只个是PCB文件,是PADS2005的软件做的



点击此处下载&nbsp;ourdev_427404.rar(文件大小:172K)&nbsp;(原文件名:7565+radio.rar)&nbsp;

出0入0汤圆

发表于 2008-9-23 10:01:03 | 显示全部楼层
PCB文件传不上我只好发个切图啊,可以的话我寄个屏和板给你



&nbsp;(原文件名:PCB.jpg)&nbsp;

出0入0汤圆

发表于 2008-9-23 09:45:46 | 显示全部楼层
我发个规格书给你,还有我做的PCB板文件,



ourdev_427363.pdf(文件大小:266K)&nbsp;(原文件名:FGD12864C-7565R-28P4.pdf)&nbsp;

出0入0汤圆

 楼主| 发表于 2008-9-22 20:00:44 | 显示全部楼层
把你的屏拍个照片,或给个图片链接,我先看看是什么样的屏,看能不能连接好,不然寄来我处理不了

出0入0汤圆

发表于 2008-9-22 15:12:06 | 显示全部楼层
楼主,我没有办法了,我寄个屏给你好吗?请问你的地址?

出0入0汤圆

 楼主| 发表于 2008-9-18 20:00:14 | 显示全部楼层
驱动过,你看我的另一个帖子,http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=1489529&bbs_page_no=1&search_mode=3&search_text=jxjbsd&bbs_id=9999

三楼的那个有点中文,没有翻译好的



sp7565有俩种工作方式&nbsp;6800&nbsp;或&nbsp;8080&nbsp;,接口有并口或串口,我的是8080&nbsp;的工作方式,

你看了他的时序图,你就不难理解为什么有如下语句了



LCD_E=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

#asm("nop");&nbsp;&nbsp;&nbsp;

#asm("nop");&nbsp;&nbsp;&nbsp;

LCD_E=0;&nbsp;&nbsp;&nbsp;

#asm("nop");&nbsp;&nbsp;&nbsp;

#asm("nop");&nbsp;&nbsp;&nbsp;

出0入0汤圆

发表于 2008-9-18 17:55:41 | 显示全部楼层
楼主,你那个程序实际驱动过屏吗?&nbsp;我一直点不亮,升压都没有上来,正常VOUT=9V的,初始化都不行啊,痛苦,只有自己再找资料,我看英文的ST7565DATASHEET,过程还是不很明白的,中文的好象网上要收费,拜托,有中文的7565资料发过来看看,谢!

出0入0汤圆

发表于 2008-9-17 11:07:05 | 显示全部楼层
&nbsp;&nbsp;&nbsp;下面是我们MP3上驱动只个7565模快的初始化程序,请楼主看看!





&nbsp;&nbsp;&nbsp;&nbsp;ld&nbsp;&nbsp;&nbsp;&nbsp;c,0xa2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//bias&nbsp;select&nbsp;&nbsp;&nbsp;&nbsp;1/6

&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;sUI_CmdTrans

&nbsp;&nbsp;&nbsp;&nbsp;ld&nbsp;&nbsp;&nbsp;&nbsp;c,0xa0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//ADC&nbsp;select(s131-s36)

&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;sUI_CmdTrans

&nbsp;&nbsp;&nbsp;&nbsp;ld&nbsp;&nbsp;&nbsp;&nbsp;c,0xc0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//SHL&nbsp;select(com0-com31)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;sUI_CmdTrans

&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;ld&nbsp;&nbsp;&nbsp;&nbsp;c,0x25&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//1+Ra/Rb=4

&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;sUI_CmdTrans

&nbsp;&nbsp;&nbsp;&nbsp;ld&nbsp;&nbsp;&nbsp;&nbsp;c,0x81

&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;sUI_CmdTrans

&nbsp;&nbsp;&nbsp;&nbsp;ld&nbsp;&nbsp;&nbsp;&nbsp;a,0x20//(ContrastSelect)&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;ld&nbsp;&nbsp;&nbsp;&nbsp;c,a

&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;sUI_CmdTrans&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;////set&nbsp;reference&nbsp;voltage&nbsp;register,确定电压:5.3v

&nbsp;&nbsp;&nbsp;&nbsp;ld&nbsp;&nbsp;&nbsp;&nbsp;c,0x2f

&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;sUI_CmdTrans

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ld&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c,0xaf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//display&nbsp;on

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;sUI_CmdTrans

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ld&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c,0xa4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//entire&nbsp;display&nbsp;off

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;sUI_CmdTrans

出0入0汤圆

发表于 2008-9-17 10:28:44 | 显示全部楼层
void&nbsp;send_cmd(unsigned&nbsp;char&nbsp;cmd)&nbsp;&nbsp;

{&nbsp;&nbsp;

check_busy();&nbsp;&nbsp;

LCD_RS=0;&nbsp;&nbsp;

LCD_RW=0;&nbsp;//写命令&nbsp;&nbsp;

LCD_CS=0;&nbsp;//片使能&nbsp;&nbsp;

PORTC=cmd;&nbsp;&nbsp;

LCD_E=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//不懂下面几行是什么意思,我看说明书上说,应该在PORTC=cmd:&nbsp;前面有LCD_E=1;

#asm("nop");&nbsp;&nbsp;

#asm("nop");&nbsp;&nbsp;

LCD_E=0;&nbsp;&nbsp;

#asm("nop");&nbsp;&nbsp;

#asm("nop");&nbsp;&nbsp;

LCD_CS=1;&nbsp;//片禁能&nbsp;&nbsp;//只个可以理解

}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

出0入0汤圆

发表于 2008-9-17 10:23:09 | 显示全部楼层
电源控制命令有变化把,我是利用里边电压电路的,send_cmd(0x2C);&nbsp;&nbsp;//power&nbsp;control&nbsp;set&nbsp;&nbsp;

应该为send_cmd(0x2F);&nbsp;//POWER&nbsp;CONTROL&nbsp;SET

出0入0汤圆

发表于 2008-9-17 09:24:59 | 显示全部楼层
//初始化&nbsp;&nbsp;&nbsp;设置LCD的控制电压,&nbsp;行&nbsp;列&nbsp;页的初始化&nbsp;

void&nbsp;lcd_initial(void)&nbsp;

{&nbsp;

LCD_RES=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//复位,延时50ms&nbsp;

delay_ms(50);&nbsp;

send_cmd(0xE2);&nbsp;&nbsp;//internal&nbsp;reset&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;





还有楼主,那个初始化时,LED_RRS=0才是复位啊,我是看那个DATASHEET里的,不只个=1是什么意思?请教!

出0入0汤圆

发表于 2008-9-17 09:20:45 | 显示全部楼层


&nbsp;(原文件名:7565modul.jpg)&nbsp;



前面一个图太小,上传一个大的,是7565的IC,我调不出,请大家帮忙!

出0入0汤圆

发表于 2008-9-17 09:14:05 | 显示全部楼层


&nbsp;(原文件名:7565.jpg)&nbsp;



只是我的7565的模块图,MP3上用的,那个16L的CPU就不用贴了把

出0入0汤圆

发表于 2008-9-16 17:27:00 | 显示全部楼层
7565的外部电路有几个105电容,还有升压电路,还有几个控制腿要上拉或者下拉(拉错了不工作),仔细检查电路吧

出0入0汤圆

 楼主| 发表于 2008-9-16 17:20:43 | 显示全部楼层
因为除了数据线,只用5根线来控制7565,所以是8F,其实应该是1F,把你的电路图贴出来吧,让大伙看看问题

出0入0汤圆

发表于 2008-9-16 16:38:02 | 显示全部楼层
楼主,你那个程序中PORTA=0x00;&nbsp;DDRA=0x8F;&nbsp;有问题把,应该是0x7F吧,要不A1-A3就设为IN&nbsp;了,不知是不是?

出0入0汤圆

发表于 2008-9-16 10:35:16 | 显示全部楼层
楼主,还是不行啊。我把C86接高电位,即是6800接法。一点显示都没有,按你的方法去掉clear_lcd,清屏命令也没有显示的,

我在中间加了几个PORTB的口的LED&nbsp;闪烁,可以但LCD&nbsp;仍没有显示哦。无奈啊!

出0入0汤圆

 楼主| 发表于 2008-9-23 11:35:06 | 显示全部楼层
我不想在论坛上公布我的地址,给我你的邮箱,我把地址发过去,我的是:jxjbsd@163.com&nbsp;

有你的屏与7565的电路图吗?&nbsp;这个很重要.现在通讯很方便,不寄过来也行,电子零件这些东西一致性很高,

在你哪儿不行,我这儿一定也不行,所以关键是发现问题,咱们先"远程协作",实在不行再寄,如何

出0入0汤圆

发表于 2008-9-23 10:09:28 | 显示全部楼层
我可以寄个装好屏的板给你,屏肯定是好的,我在MP3上试过

出0入0汤圆

发表于 2009-3-22 21:24:06 | 显示全部楼层
楼主,我参照你的程序,改为GCC的,怎么也不能显示,三天了,我怀疑是不是屏的问题,能不能把你的HEX文件给我测试一下。
谢谢。
我修改的程序如下 :
#include <avr\io.h>
#include <avr\interrupt.h>
#include <avr\signal.h>
#include <avr\eeprom.h>
#include <avr\delay.h>
#include "max7219.h"

#include "pic.h"


/*
LCD中6800和8080的区别2007-01-10 18:17
6800和8080的区别主要是总线的控制方式上
对于内存的存储,需要数据总线和地址总线,这都是一样的
但对于存取的控制,它们则采用了不同的方式——
8080是通过“读使能(RE)”和“写使能(WE)”两条控制线进行读写操作
6800是通过“总使能(E)”和“读写选择(W/R)”两条控制线进行
LCD显示模块的外部接口一般采用并行方式,并行接口接口线的读写时序常见以下两种模式:
(1)8080模式。
这类模式通常有下列接口信号:
Vcc(工作主电源)
Vss(公共端)Vee(偏置负电源,常用于调整显示对比度)
/RES,复位线。
DB0~DB7,双向数据线。
D/I,数据/指令选择线(1:数据读写,0:命令读写)。
/CS,片选信号线(如果有多片组合,可有多条片选信号线)。
/WR, MPU向LCD写入数据控制线。
/RD, MPU从LCD读入数据控制线。
(2)6800模式。在这种模式下,
Vcc、Vss、Vee、/RES、DB0~DB7、D/I的功能同模式(1),
其他信号线为:R/W,读写控制(1:MPU读, 0:MPU写)。
E,允许信号(多片组合时,可有多条允许信号线)。

*/



void delay_nms(unsigned int n)
{ while(n--){_delay_ms(1);}}
void delay_nus(unsigned int n)
{ while(n--){_delay_us(1);}}
//---延时---------------

//7-14
#define OCM12864_DATA_DDR         DDRC
#define OCM12864_DATA_PORT         PORTC
#define OCM12864_DATA_PIN         PINC

#define OCM12864_CTRL_DDR        DDRA
#define OCM12864_CTRL_PORT        PORTA

#define OCM12864_RS                        PA6
#define OCM12864_RW                        PA5
#define OCM12864_EN                        PA4
#define OCM12864_CS                        PA3
#define OCM12864_RST                PA1

//4
#define OCM12864_RS_1()                OCM12864_CTRL_PORT|=(1<<OCM12864_RS)//数据
#define OCM12864_RS_0()                OCM12864_CTRL_PORT&=(~(1<<OCM12864_RS))//指令
//5
#define OCM12864_RW_1()                OCM12864_CTRL_PORT|=(1<<OCM12864_RW)//读
#define OCM12864_RW_0()                OCM12864_CTRL_PORT&=(~(1<<OCM12864_RW))//写
//6
#define OCM12864_EN_1()                OCM12864_CTRL_PORT|=(1<<OCM12864_EN)//使能
#define OCM12864_EN_0()                OCM12864_CTRL_PORT&=(~(1<<OCM12864_EN))//禁止使能
//15
#define OCM12864_CS_1()                OCM12864_CTRL_PORT|=(1<<OCM12864_CS)//不选
#define OCM12864_CS_0()                OCM12864_CTRL_PORT&=(~(1<<OCM12864_CS))//选择
//17
#define OCM12864_RST_1()        OCM12864_CTRL_PORT|=(1<<OCM12864_RST)//不复位
#define OCM12864_RST_0()        OCM12864_CTRL_PORT&=(~(1<<OCM12864_RST))//复位


unsigned int ppp=0;

//=====忙检测=================
void check_busy(void)
{
  unsigned char read_data=0xff;
  
  OCM12864_DATA_DDR=0X00;OCM12864_DATA_PORT=0xff;//delay_nus(1);
  
  
  OCM12864_RS_0();
  OCM12864_RW_1();               //读命令
  OCM12864_CS_0();  //delay_nus(3);            //片使能
  
  while((read_data&0x80)==0x80)
  {
    OCM12864_EN_1();
    asm("nop");asm("nop");
        read_data=OCM12864_DATA_PIN;       
    OCM12864_EN_0();
        asm("nop");asm("nop");
        LED_L(read_data);//delay_nms(100);
  }
  OCM12864_EN_0();
  OCM12864_CS_1();              //片禁能
  
  OCM12864_DATA_DDR=0xff;//OCM12864_DATA_PORT=0;delay_nus(1);
  ppp++;LED_R(ppp);
}
//=====写命令到寄存器=========
void send_cmd(unsigned char cmd)
{
  check_busy();
  OCM12864_RS_0();
  OCM12864_RW_0();               //写命令
  OCM12864_CS_0();              //片使能
  OCM12864_DATA_PORT=cmd;
  OCM12864_EN_1();
  asm("nop");asm("nop");asm("nop");
  OCM12864_EN_0();
  asm("nop");asm("nop");asm("nop");
  OCM12864_CS_1();              //片禁能
}
//=====写数据到DDRAM=========
void send_dat(unsigned char dat)
{
  check_busy();
  OCM12864_RS_1();
  OCM12864_RW_0();               //写数据
  OCM12864_CS_0();              //片使能
  OCM12864_DATA_PORT=dat;
  OCM12864_EN_1();
  asm("nop");asm("nop");asm("nop");
  OCM12864_EN_0();
  asm("nop");asm("nop");asm("nop");
  OCM12864_CS_1();              //片禁能
}//=======初始化==============
void lcd_initial(void)
{
/*
  OCM12864_RST_1();
  OCM12864_EN_0();
  delay_nms(50);
  send_cmd(0xA1);        //反方向(SEG)
  send_cmd(0xC8);
  send_cmd(0xA2);
  send_cmd(0x2C);
  send_cmd(0x2E);
  send_cmd(0x2F);
  send_cmd(0x25);
  send_cmd(0x81);
  send_cmd(0x14);
  send_cmd(0xAF);
  send_cmd(0xE0);
  send_cmd(0x40);
*/
OCM12864_DATA_DDR=0xff;OCM12864_DATA_PORT=0x00;
OCM12864_CTRL_DDR=0x00;OCM12864_CTRL_PORT=0x00;
OCM12864_CTRL_DDR|=((1<<OCM12864_RS)|(1<<OCM12864_RW)|(1<<OCM12864_EN)|(1<<OCM12864_CS)|(1<<OCM12864_RST));
  
delay_nus(1);
  OCM12864_RST_0();
  delay_nms(50);
  OCM12864_RST_1();
  delay_nms(50);
  
//send_cmd(0xE2);  //internal reset         
send_cmd(0xAE);  //LCD bias set 1/7 bias  
send_cmd(0xA2);  //ADC select  normal   
send_cmd(0xC0);  //Common output mode select reverse direction
send_cmd(0x25);  //V0 voltage regulator internal resistor ratio set  V0 调压器内部电阻率设定(控制对比度,后三位)
send_cmd(0x81);  //electronic voltage mode set 亮度调整,下一命令是它的具体值
send_cmd(0x14);  // 后6位
send_cmd(0x2C);  //power control set
send_cmd(0x2E);  //from 0x28 to 0x2F
send_cmd(0x2F);  //
send_cmd(0x40);  //Display start line set
send_cmd(0xB0);  //page address set
send_cmd(0x10);  //column address set upper bit
send_cmd(0x00);  //column address set lower bit
send_cmd(0xAF);  //Display ON
}
//




void clearLCD(void)
{
unsigned char page,seg;

for(page=0xb0;page<0xb8;page++)
{
  send_cmd(page);
  send_cmd(0x10);                            /*列地址高位,D4位为1表示高位地址*/
  send_cmd(0x00);                            /*列地址低位,D4位为0表示低位地址*/
  for(seg=0;seg<128;seg++)
  {
   send_dat(0xFF);
  }
}
}

//=======写页地址==============
void Set_Page_Address(unsigned char dat)
{
    send_cmd(0xb0|dat);
}
//=======写列地址==============
void Set_Colume_Address(unsigned char dat)
{
    unsigned char tmp;
        tmp=dat>>5;
    send_cmd(0x10|tmp);  //送列地址高三位
        tmp=0x0f&dat;
    send_cmd(tmp);       //送列地址低四位
}
//=======显示点阵==============
void Display_Grid(unsigned char data1,unsigned char data2)
{
  unsigned char i,j;
  for(i=0;i<8;i++)
  {
    Set_Page_Address(i);
    Set_Colume_Address(0x00);
    for(j=0;j<64;j++)
    {
      send_dat(data1);
      send_dat(data2);
    }
  }
}
//=======显示图形===============
void Display_Picture(unsigned char *pic)
{
  unsigned char i,j;
  for(i=0;i<8;i++)
  {
        Set_Page_Address(i);
    Set_Colume_Address(0x00);
    for(j=0;j<0x80;j++)
    {
       send_dat(*(pic+0x80*i+j));
        }
  }
}
//


//unsigned char a1[32]= {0x20,0x20,0x22,0x22,0xFE,0x21,0x21,0x20,0x20,0xFF,0x20,0x22,0xAC,0x20,0x20,0x00,0x04,0x04,0x42,0x82,0x7F,0x01,0x01,0x10,0x10,0x08,0x07,0x1A,0x21,0x40,0xF0,0x00};  // 汉字 “我” 的点阵数据 ,使用 纵向取模 字节倒序
/*
void disphz(unsigned char pages,unsigned char line,unsigned char * zfdz)
{   //  pages页参数可取(0-7),line 列参数可取(0-111),zfdz 点阵指针
unsigned char page,seg,zi,j,ix;
ix=0;

for(page=0;page<2;page++)
{
  send_cmd(page+0xb0+pages);
  j = line & 0xf0;
  j = j/16;
send_cmd(0x10|j);                            //列地址高位,D4位为1表示高位地址
send_cmd(0x0f&line);                             //列地址低位,D4位为0表示低位地址

  zi=0;                           
  for(seg=0;seg<16;seg++)
  {
   if(ix)
   zi=16;
   send_dat(zfdz[seg+zi]);
   
  }
  ix=255-ix;
}
}
//*/






//=====主程序===================
int main (void)
{
  PORTA=0x00;
DDRA=0x8F;

PORTB=0x00;
DDRB=0x00;

PORTC=0x00;
DDRC=0xFF;

PORTD=0x00;
DDRD=0x00;
LED_INIT();
LED_L(1234);LED_R(1234);LED_CLEAR(3);

lcd_initial(); LED_R(0);//LCD初始化
send_cmd(0xa6);
Display_Picture(pic);
delay_nms(2000);LED_R(ppp);

clearLCD();    //清屏
//delay_nms(2000);
//

//disphz(0,0,a1);LED_L(pp);

出0入0汤圆

发表于 2009-7-3 16:56:20 | 显示全部楼层
我手上有个OCM12864-8我想用m16控制一下,请高手指点一下。

出0入0汤圆

发表于 2009-10-20 00:27:20 | 显示全部楼层
LCD_RES=1;      //复位,延时50ms
delay_ms(50);
send_cmd(0xE2);  //internal reset         

这样的复位能用吗?和手册不一样呀?

出0入0汤圆

发表于 2009-12-15 18:03:43 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-14 12:35:46 | 显示全部楼层
顶一下啊哈哈,最近我也误买了一块啊

出0入0汤圆

发表于 2010-3-15 22:32:32 | 显示全部楼层
这里的P/S在哪里设置啊,请问

出0入0汤圆

发表于 2010-5-8 17:47:53 | 显示全部楼层
不错!!!!!!!!

出0入0汤圆

发表于 2010-8-13 13:35:17 | 显示全部楼层
有没有哪个大侠把接线图给出来??
好像有串口的,不知道哪个引脚是串口的!

出0入0汤圆

发表于 2011-11-7 14:21:55 | 显示全部楼层
问题多多

出0入0汤圆

发表于 2012-9-14 02:47:46 | 显示全部楼层
请问下高手们,用这个IC驱动LCD显示12*12的字体应该怎么编写驱动程序?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-11 19:53

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表