一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 2840|回复: 1

[其他综合] 请教一个12864液晶的问题

[复制链接]
发表于 2012-10-16 13:33 | 显示全部楼层 |阅读模式
本帖最后由 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图案
  }
}
发表于 2012-10-16 15:19 | 显示全部楼层
找到一个不一样的地方,上面先lcd_clk=1;后Lcd_clk=0;,后面是先lcd_clk=0;后Lcd_clk=1;
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-11-3 17:22 , Processed in 0.033188 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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