用mega16L 驱动 OCM12864-9(芯片为ST7565p)
前天刚到手一个OCM12864-9(芯片为ST7565p),厂家给的手册是英文多汉语少,看起来太慢,想先找个程序看看显示效果,手册中的程序也不全,于是在本坛搜了一下,发现要资料的同学也不少,而大牛们给的东西也不全,初学者实践起来比较困难.于是把手册中的程序改好了,发上来了.MCU使用的是mega16L 3.3V 使用内部震荡8MHz ,引脚连接在程序中说明,也可以自己定义.再次说明,程序是我改的手册中的,改正了一些错误,增加了一些注释,非我原创. /*****************************************************
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 selectnormal
send_cmd(0xC8);//Common output mode select reverse direction
send_cmd(0x24);//V0 voltage regulator internal resistor ratio setV0 调压器内部电阻率设定(控制对比度,后三位)
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
};
} 增加一个16X16点阵的显示函数:
unsigned char a1={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);
}
ix=!ix;
}
} 请问ST7565p与ST7565有什么区别啊?这是7565的手册中文的。
点击此处下载 ourdev_409388.pdf(文件大小:239K) (原文件名:st7565中文.pdf) 应该是一样的,有些IC的尾字母都是代表封装,有些代表版本,而且一般都可以兼容.
你哪个不是手册,这个才是http://www.datasheets.org.uk/pdf/3241267.pdf 谢了 这几天刚在研究 我的那个MP3通用的7565的屏没有ENABLE脚啊,他的几根叫是RD,WR,A0,RES,CS1,我用板试了以下,不行,楼主可以把电路图贴出吗,谢 用的都是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_EPORTA.7 // RD
你只要吧 “RD,WR,A0,RES,CS1”连到对应的PORTx.y 脚上,
然后定义成我程序中的“LCD_E ,LCD_RW,LCD_RS,LCD_RES,LCD_CS”就行 楼主,我的程序如下,应该没有问题吧,可以正确编译的
#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 selectnormal
send_cmd(0xC8);//Common output mode select reverse direction
send_cmd(0x24);//V0 voltage regulator internal resistor ratio setV0 调压器内部电阻率设定(控制对比度,后三位)
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={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={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={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={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={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={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);
}
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);
};
} 程序我看不出有什么问题,如果还不能显示,那你这样:
再检查一遍硬件连接,你要照搬这个程序,那你必须用#define 定义这个连接,
而且PORTC与LCD的数据口一一对应(PORTC.0对 D0)
把主程序中的 清屏函数去掉,应该可以看到一些随机亮点,说明初始化成功了 好的,谢谢,要到晚上试一下,我是搞MP3硬件开发的,学单片机,天天接触7565的屏,请教了! 有一个很重要的问题
我那个7565的128*64的模组是用在MP3上的,是8080的MCU,而ATmega16L是6800的MCU,有个C86的脚要接高电位,可能是只个原因!我回家试试! 只个是PCB文件,是PADS2005的软件做的
点击此处下载 ourdev_427404.rar(文件大小:172K) (原文件名:7565+radio.rar) PCB文件传不上我只好发个切图啊,可以的话我寄个屏和板给你
http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_427403.jpg
(原文件名:PCB.jpg) 我发个规格书给你,还有我做的PCB板文件,
ourdev_427363.pdf(文件大小:266K) (原文件名:FGD12864C-7565R-28P4.pdf) 把你的屏拍个照片,或给个图片链接,我先看看是什么样的屏,看能不能连接好,不然寄来我处理不了 楼主,我没有办法了,我寄个屏给你好吗?请问你的地址? 驱动过,你看我的另一个帖子,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有俩种工作方式 6800 或 8080 ,接口有并口或串口,我的是8080 的工作方式,
你看了他的时序图,你就不难理解为什么有如下语句了
LCD_E=1;
#asm("nop");
#asm("nop");
LCD_E=0;
#asm("nop");
#asm("nop"); 楼主,你那个程序实际驱动过屏吗? 我一直点不亮,升压都没有上来,正常VOUT=9V的,初始化都不行啊,痛苦,只有自己再找资料,我看英文的ST7565DATASHEET,过程还是不很明白的,中文的好象网上要收费,拜托,有中文的7565资料发过来看看,谢! 下面是我们MP3上驱动只个7565模快的初始化程序,请楼主看看!
ld c,0xa2 //bias select 1/6
call sUI_CmdTrans
ld c,0xa0 //ADC select(s131-s36)
call sUI_CmdTrans
ld c,0xc0 //SHL select(com0-com31)
call sUI_CmdTrans
ld c,0x25 //1+Ra/Rb=4
call sUI_CmdTrans
ld c,0x81
call sUI_CmdTrans
ld a,0x20//(ContrastSelect)
ld c,a
call sUI_CmdTrans ////set reference voltage register,确定电压:5.3v
ld c,0x2f
call sUI_CmdTrans
ld c,0xaf //display on
call sUI_CmdTrans
ld c,0xa4 //entire display off
call sUI_CmdTrans void send_cmd(unsigned char cmd)
{
check_busy();
LCD_RS=0;
LCD_RW=0; //写命令
LCD_CS=0; //片使能
PORTC=cmd;
LCD_E=1; //不懂下面几行是什么意思,我看说明书上说,应该在PORTC=cmd: 前面有LCD_E=1;
#asm("nop");
#asm("nop");
LCD_E=0;
#asm("nop");
#asm("nop");
LCD_CS=1; //片禁能 //只个可以理解
} 电源控制命令有变化把,我是利用里边电压电路的,send_cmd(0x2C); //power control set
应该为send_cmd(0x2F); //POWER CONTROL SET //初始化 设置LCD的控制电压, 行 列 页的初始化
void lcd_initial(void)
{
LCD_RES=1; //复位,延时50ms
delay_ms(50);
send_cmd(0xE2); //internal reset
还有楼主,那个初始化时,LED_RRS=0才是复位啊,我是看那个DATASHEET里的,不只个=1是什么意思?请教! http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_419963.jpg
(原文件名:7565modul.jpg)
前面一个图太小,上传一个大的,是7565的IC,我调不出,请大家帮忙! http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_419956.jpg
(原文件名:7565.jpg)
只是我的7565的模块图,MP3上用的,那个16L的CPU就不用贴了把 7565的外部电路有几个105电容,还有升压电路,还有几个控制腿要上拉或者下拉(拉错了不工作),仔细检查电路吧 因为除了数据线,只用5根线来控制7565,所以是8F,其实应该是1F,把你的电路图贴出来吧,让大伙看看问题 楼主,你那个程序中PORTA=0x00; DDRA=0x8F; 有问题把,应该是0x7F吧,要不A1-A3就设为IN 了,不知是不是? 楼主,还是不行啊。我把C86接高电位,即是6800接法。一点显示都没有,按你的方法去掉clear_lcd,清屏命令也没有显示的,
我在中间加了几个PORTB的口的LED 闪烁,可以但LCD 仍没有显示哦。无奈啊! 我不想在论坛上公布我的地址,给我你的邮箱,我把地址发过去,我的是:jxjbsd@163.com
有你的屏与7565的电路图吗? 这个很重要.现在通讯很方便,不寄过来也行,电子零件这些东西一致性很高,
在你哪儿不行,我这儿一定也不行,所以关键是发现问题,咱们先"远程协作",实在不行再寄,如何 我可以寄个装好屏的板给你,屏肯定是好的,我在MP3上试过 楼主,我参照你的程序,改为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 selectnormal
send_cmd(0xC0);//Common output mode select reverse direction
send_cmd(0x25);//V0 voltage regulator internal resistor ratio setV0 调压器内部电阻率设定(控制对比度,后三位)
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= {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);
}
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); 我手上有个OCM12864-8我想用m16控制一下,请高手指点一下。 LCD_RES=1; //复位,延时50ms
delay_ms(50);
send_cmd(0xE2);//internal reset
这样的复位能用吗?和手册不一样呀? mark 顶一下啊哈哈,最近我也误买了一块啊 这里的P/S在哪里设置啊,请问 不错!!!!!!!! 有没有哪个大侠把接线图给出来??
好像有串口的,不知道哪个引脚是串口的! 问题多多 请问下高手们,用这个IC驱动LCD显示12*12的字体应该怎么编写驱动程序?
页:
[1]