本帖最后由 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图案 
  } 
} |