本帖最后由 barracuda 于 2012-10-16 13:36 编辑
源码包里把12864的液晶单独做了一个驱动程序,屏是ST7565控制器的图形点阵液晶,串行驱动
我这个屏是ST7565P控制器的,按厂家给的说明书,更改了源码中的控制命令,但是没有显示,哪位帮我看看是不是上面的还有要改的部分
这是源码里的程序,我已经把初始化的命令按说明书修改了,前面串行发送,写数据,复位这些函数我看和说明书出入不大,就是写命令那部分函数和
说明书相距甚远,是不是这里有要做修改的地方?
/*
D7:lcd_dat
D6:lcd_lck
D5:H
D4:H
D3:H
D2:H
D1:H
D0:H
RD:H
WR:L
A0:lcd_rs
RES:lcd_reset
CS:L
C86:L
P/S:L
*/
#include <mega16.h>
#include <delay.h> //延时
#include <ascii_lib.c> //字库
#define lcd_dat PORTC.3
#define lcd_clk PORTC.4
#define lcd_rs PORTC.5
#define lcd_reset PORTC.6
#define VC_ON 0x2C //1010
#define VR_ON 0x2A
#define VF_ON 0x29 //1001
/*column0*********************************page0***********************************column127*/
/*****************************************page1*********************************************/
/*****************************************page2*********************************************/
/*****************************************page3*********************************************/
/*****************************************page4*********************************************/
/*****************************************page5*********************************************/
/*****************************************page6*********************************************/
/*column0*********************************page7***********************************column127*/
unsigned char lcd_buffer[100];
/****************************串行发送****************************/
void s_out(unsigned char j)
{
unsigned char u;
for(u=0;u<8;u++)
{
if(j&0x80)
{
lcd_dat=1;
}
else
{
lcd_dat=0;
}
delay_us(1);
lcd_clk=1;
delay_us(1);
lcd_clk=0;
delay_us(1);
j<<=1;
}
}
/****************************芯片复位****************************/
void LCD_Reset()
{
lcd_reset=0;
delay_ms(20);
lcd_reset=1;
delay_ms(20);
}
/*******************************写数据**************************/
void w_dat(unsigned char dat)
{
lcd_rs=1;
s_out(dat);
}
/******************************写命令***********************/
void w_cmd(unsigned char cmd)
{
lcd_rs=0;
s_out(cmd);
}
void set_column_add(unsigned char column)
{
unsigned char column_H,column_L;
column_H=(column>>4)|0x10; //调整数据格式
column_L=column&0x0f; //调整数据格式
lcd_rs=0;
s_out(column_H);
s_out(column_L);
}
void set_page_add(unsigned char page)
{
lcd_rs=0;
s_out(0xb7-page);
}
void lcd_clear(unsigned char flag)
{
unsigned char page,column,dat;
if(flag)dat=0xff;
else dat=0x00;
for(page=0xB7;page>=0xB0;page--)
{
w_cmd(page); //set page address
w_cmd(0x10); //set Column address MSB
w_cmd(0x00); //set column address LSB
for(column=0;column<128;column++)
{
w_dat(dat);
}
}
}
void display_ascii(unsigned char x, unsigned char y,unsigned char flag)
{
unsigned char i,k=0;
unsigned char str;
unsigned int OffSet,z;
while(1)
{
if (lcd_buffer[k]==0)
{
return;
}
z=lcd_buffer[k];
OffSet=z*6;
for (i=0;i<6;i++)
{
if(flag)str=word_lib[OffSet+i];
else str=~word_lib[OffSet+i];
set_page_add(y);
set_column_add(x+i);
w_dat(str);
}
x+=6;
k++;
}
}
void Init_IC()
{
delay_ms(10);
LCD_Reset();
w_cmd(0xAF); //ON DISPLAY
w_cmd(0x40); //STAR DISPLAY
w_cmd(0xA0); //ADC NORMAL)
w_cmd(0xA6);
w_cmd(0xA4); //CLEAR
w_cmd(0xA2); //1/9BIAS
w_cmd(0xC8); //COMMON OUTPUT DIRECTION
w_cmd(0x2F); //POWER CONTROL
w_cmd(0x24); //RESISTER RATIO
delay_ms(10);
w_cmd(0x81); //VOLUM MODE SET
w_cmd(0x24); //RESISTER RATIO
}
这是厂家给的示例程序:
以下程序包含三种驱动方式的程序。
/******************************************************************/
//12864 ,芯片7565p
//环境:51单片机,11.0592晶振。P2口做数据线。
//图片取模方式:字模 III 增强版 V3.91,参数:纵向取模,字节倒序
//采用软件调节对比度方式
/******************************************************************/
#include <reg52.h>
#include <intrins.h>
/******************************************************************/
sbit a0 =P1^3;
sbit wr_rw=P1^5;
sbit cs1=P1^0;
sbit rd_EN=P1^4;
sbit rst=P1^6;
sbit c86=P1^1;//80,68时序选择
sbit ps=P1^2;//串并口选择
//这两个信号只针对引出C86和PS的模块,用来设置时序,对固定时序的模块无效
sbit sclk=P2^6;
sbit di=P2^7;
unsigned char *p;
unsigned char *q;
unsigned char *s;
unsigned char flag;
#define nop() _nop_() /*定义空指令*/
unsigned char code niu[1024]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xC0,0x40,0x60,0x20,0x30,0x18,0x08,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x08,0x38,0xF0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0xE0,0xE0,0xD0,0x30,0x70,0x60,0x30,0x70,
0x70,0x00,0x00,0x40,0xE0,0xF0,0xF0,0xE0,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF0,0xF8,0xF8,
0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xE0,0x80,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x1E,0x06,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xC0,0x00,0x00,
0x00,0xE0,0x80,0x00,0x00,0x1C,0xFC,0x70,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xE0,0x80,0x00,0x00,0x00,0x03,0x0F,0x3E,0x7C,0xF0,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x0F,0x1F,0xFD,0xE9,0x01,0x00,0x00,0x00,0x00,0x38,0x00,
0x00,0x30,0x30,0x00,0x00,0x00,0x06,0xFF,0x1D,0x0E,0x06,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xF8,0xFE,0xFF,0x1F,0x0F,0x03,0x03,0x01,0x01,0x01,0x00,
0x00,0x00,0x00,0x01,0x01,0x01,0x03,0x03,0x07,0x07,0x07,0x0F,0x3F,0x7F,0xFF,0xFF,
0xFC,0xF0,0xE0,0x81,0x01,0x01,0x01,0x00,0xF0,0xFC,0xFF,0xFF,0xFF,0x00,0x00,0x00,
0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x0C,0xF8,0xF8,0x30,0x60,0x7F,0x43,0x47,0x5C,
0xF8,0xFF,0x0F,0x1E,0x38,0x70,0xC7,0xFC,0x81,0x83,0x8E,0x5C,0x78,0x70,0xE0,0xC0,
0xC0,0x8F,0xFF,0xFE,0xF8,0xE0,0xC0,0xC0,0xE0,0xF8,0xFF,0x00,0x00,0xC0,0xE0,0x60,
0x70,0x70,0x30,0xF0,0xF8,0xFC,0x06,0x03,0x01,0x01,0x01,0x41,0x73,0x32,0x86,0xFC,
0x7C,0x8E,0x02,0x73,0x41,0x41,0x01,0x01,0x02,0x06,0xFC,0x78,0x70,0x70,0x60,0x60,
0xE0,0xE0,0xC0,0x00,0x00,0xFF,0xFF,0xFF,0xFC,0xE4,0xC2,0x02,0x81,0xC1,0xE0,0xE2,
0xC0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0xE1,0xF1,
0xF3,0xFF,0x7F,0x3F,0x7F,0x7C,0xF8,0xF0,0xE1,0xC7,0x9F,0xBF,0xFF,0x00,0x00,0x00,
0x00,0x00,0x00,0x0F,0x7C,0xFC,0x78,0x70,0xC1,0xCF,0xFE,0xE0,0x8E,0x10,0x1D,0x33,
0x3F,0x1E,0x1C,0x80,0x00,0x00,0x00,0x01,0x01,0x1C,0x02,0x2F,0x33,0x3F,0x3F,0x1F,
0x0F,0x07,0x87,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x04,0x3F,0x67,0xC7,0x8F,0xFE,0x1E,0x06,0x26,0xC6,0x82,0x03,0x01,0x00,
0x00,0x01,0x83,0xC2,0x66,0x06,0x06,0xFE,0x9E,0x8F,0xC7,0x6F,0x3E,0x08,0x00,0x00,
0x00,0x01,0x01,0x00,0x00,0x07,0x07,0x8F,0xFF,0xFF,0x07,0x0F,0x0F,0x67,0xEF,0xFF,
0xF0,0xF8,0x3F,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x07,0x3F,
0x67,0x67,0x7F,0x7E,0x7F,0x5F,0x00,0x00,0x01,0x03,0xFF,0xFF,0xFF,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x03,0x07,0x3F,0xFE,0xF8,0xE0,
0xC0,0x80,0x00,0x01,0x12,0x70,0x70,0x70,0x10,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,
0xFC,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0x01,0x07,0x03,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x0F,0x3C,0xE0,0x80,0x00,0x07,0x1F,0x3F,0x3E,
0x3F,0x3F,0x0F,0x03,0x80,0xE0,0x38,0x0F,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0xF0,0xC0,0x80,0x81,0x01,
0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,
0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xF0,0xFC,0xFF,0xFF,0xFF,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,
0x07,0x07,0x03,0x02,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x03,0x03,0x07,0x07,0x07,
0x07,0x07,0x07,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x0F,0x06,0x06,0x04,0x0C,0x0C,
0x04,0x06,0x06,0x07,0x0D,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,
0x06,0x04,0x04,0x00,0x00,0x00,0x00,0x01,0x01,0x03,0x03,0x03,0x03,0x01,0x01,0x00,
0x00,0x00,0x00,0x04,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
/*************************************************/
//写命令,80时序
/*************************************************/
void w_com80(unsigned char x)
{
a0=0;//命令
cs1=0;
rd_EN=1;//读无效
wr_rw=0;//写有效
nop();
P2=x;//送出数据
nop();
wr_rw=1;
}
/*************************************************/
//写数据,80时序
/*************************************************/
void wdata80(unsigned char dat)
{
a0=1;//数据
cs1=0;
rd_EN=1;
wr_rw=0;//写
nop();
P2=dat;
nop();
wr_rw=1;
}
/*************************************************/
//写命令,68时序
/*************************************************/
void w_com68(unsigned char x)
{
cs1=0;
a0=0;//命令
wr_rw=0;//写
rd_EN=1;//ENABLE
nop();
P2=x;
nop();
rd_EN=0;
}
/*************************************************/
//写数据,68时序
/*************************************************/
void wdata68(unsigned char dat)
{
cs1=0;
a0=1; //数据
wr_rw=0;//写
rd_EN=1;
nop();
P2=dat;
nop();
rd_EN=0;
}
//串行模式发送数据
void data_send(unsigned char dat)
{
unsigned char s,temp;
int i;
sclk=0;
s=dat;
for(i=8;i>0;i--)
{sclk=0;
nop();
nop();
temp=s & 0x80;
if(temp)
{di=1;}
else {di=0;}
sclk=1;
s=s<<1;
}
}
/*************************************************/
//写命令,串行模式
/*************************************************/
void w_coms(unsigned char x)
{
a0=0;
cs1=0;
data_send(x);
}
/*************************************************/
//写数据,串行模式
/*************************************************/
void wdatas(unsigned char dat)
{
a0=1;
cs1=0;
data_send(dat);
}
/*************************************************/
//写命令,通过P3.0和P3.1选择用何种驱动程序
/*************************************************/
void w_com(unsigned char x)
{
unsigned char temp;
temp=P3&0X03;
switch(temp)
{
case 3:
c86=0;//80时序
ps=1;//并口
w_com80(x);
break;
case 2:
c86=1;//68时序
ps=1;//并口
w_com68(x);
break;
default:
c86=0;//串口模式下无效
ps=0;//串口方式
w_coms(x);
break;
}
}
/*************************************************/
//写数据
/*************************************************/
void wdata(unsigned char dat)
{
unsigned char temp;
temp=P3&0X03;
switch(temp)
{
case 3:
c86=0;
ps=1;
wdata80(dat);
break;
case 2:
c86=1;
ps=1;
wdata68(dat);
break;
default:
c86=0;
ps=0;
wdatas(dat);
break;
}
}
void display_map(unsigned char *p)//P是图片数据的首地址
{
unsigned char seg;
unsigned char page;
for(page=0xb0;page<0xb9;page++) //写页地址共8页 0xb0----0xb8
{
w_com(page);
w_com(0x10); //列地址,高低字节两次写入,从第0列开始
w_com(0x00);
for(seg=0;seg<128;seg++)//写128列
{ wdata(*p++); }
}
}
/*************************************************/
/*主程序
/*************************************************/
void main(void)
{
rst=0;
nop();
nop();
rst=1;
w_com(0xaf); //ON DISPLAY
w_com(0x40); //STAR DISPLAY
w_com(0xa0); //ADC NORMAL
w_com(0xa6); //
w_com(0xa4); //CLEAR
w_com(0xa2); //1/9BIAS
w_com(0xc8); //COMMON OUTPUT DIRECTION
w_com(0x2f); //POWER CONTROL
w_com(0x24); //RESISTER RATIO
w_com(0x81); //VOLUM MODE SET
w_com(0x24); //RESISTER RATIO
//*********************************************************************
while(1) //START
{
display_map(&niu); //显示一副SCH图案
}
} |