7147|15

63

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

我的液晶是汉升19264-6的,驱动芯片是ks0108,我写了个驱动程序,怎么驱动不起来呢 [复制链接]

下面是我的程序,是用STC52RC  驱动的,硬件检查过多次,绝对正确,哪位帮忙看看我的程序那有问题,显示不出来,谢谢。
#include"reg52.h"
#include"intrins.h"
#define uint unsigned int
#define uchar unsigned char

sbit E=P0^0;//使能控制
sbit RW=P0^1;//读写控制
sbit RS=P0^2;//数据指令选择
sbit CSB=P0^3;//片选2
sbit CSA=P0^4;//片选1
sbit RST=P0^5;//复位
uchar code bp[]={0x00,0x00,0x70,0x88,0x88,0x10,0x20,0x40,0x80,0xF8,0x00,0x00
};

//LCD 延时函数
void LcdDeley(uchar Delx)
{uint i=0;
while(i   {i++;}
}
//--------------------------------------------
//LCD写命令函数
void LcdCommand(uchar LcdCom)
{
RS=0;
RW=0;
P1=LcdCom;

E=1;
_nop_();_nop_();_nop_();
E=0;
_nop_();_nop_();_nop_();
}
//---------------------------------------------
//LCD写数据函数
void LcdDataWrite(uchar LcdData)
{
RS=1;
RW=0;
P1=LcdData;

E=1;
_nop_();_nop_();_nop_();
E=0;
_nop_();_nop_();_nop_();
}
//--------------------------------------------------------
//选择屏幕函数
void SelectScr(uchar Screen)
{
switch(Screen)
  {
  case 0: CSA=0;CSB=0;break;
  case 1: CSA=0;CSB=1;break;
  case 2: CSA=1;CSB=0;break;
  }
}
//----------------------------------------
//设置显示位置
void SetStartLine(uchar StartLine)  //设置起始位置
{
StartLine=StartLine & 0x3f;
StartLine=StartLine | 0xc0;
LcdCommand(StartLine);
}
void SetPage(uchar Page)//设置页面
{
Page=Page & 0x07;
Page=Page | 0xb8;
LcdCommand(Page);
}
void SetColumn(uchar Column)//设置列数
{
Column=Column & 0x3f;
Column=Column | 0x40;
LcdCommand(Column);
}
//-----------------------------------
//清屏函数
void ClearScr(uchar Screen)
{
uchar i,j;
SelectScr(Screen);
for(i=0;i<8;i++)
  {
    SetPage(i);
        SetColumn(0);
        for(j=0;j<64;j++)
        {
          LcdDataWrite(0x00);
        }
  }
}
//-------------------------------
//初始化LCD函数
void Initialize(void)
{
uchar i;
RST=0;
RST=1;
for(i=0;i<3;i++)
  {
    ClearScr(i);
        SelectScr(i);
        LcdCommand(0x3f);
        LcdDeley(1000);
        SetStartLine(0x00);
  }
}
//----------------------------------------
//显示子函数
void DisplayPic(uchar *PicKu)
{
uchar i,j,k;
   for(i=0;i<8;i++)
     {
           for(j=0;j<3;j++)
             {
                   SelectScr(j);
                   SetPage(i);
                   SetColumn(0);
                     for(k=0;k<64;k++)
                           {
                             LcdDataWrite(PicKu[(i*3+j)*64+k]);
                           }
                 }
         }
}


//主程序
void main()
{
Initialize();
DisplayPic(bp);
while(1)
{};
     
}

最新回复

调试液晶最常见的问题一个是指令弄错了,没有完全按照数据手册上的来,另外一个就是时序不对,说白了就是延时太短。后一个占的比例更大一些。  详情 回复 发表于 2013-8-14 21:21
点赞 关注

回复
举报

62

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
应该是初始化的出问题了。LCD写数据函数 和写指令, 好象是先E=1,再给数据或者指令,再延时,在E=0.




 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
引用 1 楼 kyzf 的回复:
应该是初始化的出问题了。LCD写数据函数 和写指令, 好象是先E=1,再给数据或者指令,再延时,在E=0.




还可能是延时不够;如果方便的,用示波器测试数据的波形。
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

4
 
谢谢,我还是不大明白,E现在已经是这样的了。
我在写命令和数据的时候是先E=1延时后再E=0,根据液晶给的时序,E的周期时间最小是1000纳秒,高低电平宽度最小值是450纳秒,这三个参数的最大值都不限。E的上升和下降时间最小值不限,最大值是45纳秒,这两个就不是我们能控制的了吧。
//LCD写命令函数
void LcdCommand(uchar LcdCom)
{
RS=0;
RW=0;
P1=LcdCom;

E=1;
_nop_();_nop_();_nop_();
E=0;
_nop_();_nop_();_nop_();
}
//---------------------------------------------
//LCD写数据函数
void LcdDataWrite(uchar LcdData)
{
RS=1;
RW=0;
P1=LcdData;

E=1;
_nop_();_nop_();_nop_();
E=0;
_nop_();_nop_();_nop_();
}
//--------------------------------------------------------
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

5
 
看看手册的时序图,对照着程序分析
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

6
 
你的lcd负压电阻调节了么?就是调节对比度的!应该是10k的
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

7
 
要严格按照芯片的时序图来写,一个是控制寄存器的顺序,是高电平启动还是低电平启动,还有就是延时函数,多调一调。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

8
 
负压电阻调节了,我用的是50K的,这个应该是没什么影响吧,
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用楼主 gao11zhang 的回复:
下面是我的程序,是用STC52RC? 驱动的,硬件检查过多次,绝对正确,哪位帮忙看看我的程序那有问题,显示不出来,谢谢。
#include"reg52.h"
#include"intrins.h"
#define uint unsigned int
#define uchar unsigned char

sbit E=P0^0;//使能控制
sbit RW=P0^1;//读写控制
sbit RS=P0^2;//数据指令选择
sbit CSB=P0^3;//片选2
sbit CSA=P0^4;//片选1
sbit RST=P0^5;//复位
uchar code bp[]={0x00,0x00,0x70,0x88,0x88,0x10,0x20,0x40,0x80,0xF8,0x00,0x00
};

//LCD 延时函数
void LcdDeley(uchar Delx)
{uint i=0;
while(i ? {i++;}
}
//--------------------------------------------
//LCD写命令函数
void LcdCommand(uchar LcdCom)
{
RS=0;
RW=0;
P1=LcdCom;

E=1;
_nop_();_nop_();_nop_();
E=0;
_nop_();_nop_();_nop_();
}
//---------------------------------------------
//LCD写数据函数
void LcdDataWrite(uchar LcdData)
{
RS=1;
RW=0;
P1=LcdData;

E=1;
_nop_();_nop_();_nop_();
E=0;
_nop_();_nop_();_nop_();
}
//--------------------------------------------------------
//选择屏幕函数
void SelectScr(uchar Screen)
{
switch(Screen)
? {
? case 0: CSA=0;CSB=0;break;
? case 1: CSA=0;CSB=1;break;
? case 2: CSA=1;CSB=0;break;
? }
}
//----------------------------------------
//设置显示位置
void SetStartLine(uchar StartLine)? //设置起始位置
{
StartLine=StartLine & 0x3f;
StartLine=StartLine | 0xc0;
LcdCommand(StartLine);
}
void SetPage(uchar Page)//设置页面
{
Page=Page & 0x07;
Page=Page | 0xb8;
LcdCommand(Page);
}
void SetColumn(uchar Column)//设置列数
{
Column=Column & 0x3f;
Column=Column | 0x40;
LcdCommand(Column);
}
//-----------------------------------
//清屏函数
void ClearScr(uchar Screen)
{
uchar i,j;
SelectScr(Screen);
for(i=0;i <8;i++)
? {
? ? SetPage(i);
SetColumn(0);
for(j=0;j <64;j++)
{
? LcdDataWrite(0x00);
}
? }
}
//-------------------------------
//初始化LCD函数
void Initialize(void)
{
uchar i;
RST=0;
RST=1;
for(i=0;i <3;i++)
? {
? ? ClearScr(i);
SelectScr(i);
LcdCommand(0x3f);
LcdDeley(1000);
SetStartLine(0x00);
? }
}
//----------------------------------------
//显示子函数
void DisplayPic(uchar *PicKu)
{
uchar i,j,k;
? for(i=0;i <8;i++)
? ? {
? for(j=0;j <3;j++)
? ? {
? SelectScr(j);
? SetPage(i);
? SetColumn(0);
? ? for(k=0;k <64;k++)
? {
? ? LcdDataWrite(PicKu[(i*3+j)*64+k]);
? }
}
}
}


//主程序
void main()
{
Initialize();
DisplayPic(bp);
while(1)
{};
? ?
}



负压电阻调节会不会改变亮度呢????
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(中级)

10
 
可以改变对比度的
驱动不起来,不显示我要显示的东西
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

11
 
还没弄好吗> 关注下
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

12
 
还没有显示,我的电路是一个AT89C51连接了一个液晶,别的什么也没连,用的液晶是汉升19264-6的液晶,哪位用过的帮忙给看看,谢谢


                                                          //***************************************************************************
//连线表:  CPU=89C52                                                        *
//RS=P3.0         RW=P3.1        E=P3.2    CS1=3.3  CS2=3.4     *
//FOSC=12MHz         D0-D7=P1.0-P1.7                                        *
//***************************************************************************
#include
sbit  RS=P3^2;
sbit  RW=P3^1;
sbit  E=P3^0;
sbit  CS1=P3^3;
sbit  CS2=P3^4;

#define  DATA_BUS   P1

void wr_lcd_1(unsigned char dat_com,unsigned char content);
void wr_lcd_2(unsigned char dat_com,unsigned char content);
void wr_lcd_3(unsigned char dat_com,unsigned char content);
void delay_us(unsigned int us_value);
void delay_ms(unsigned int ms_value);
void init_lcd (void);
void disp_dots(unsigned char data1,unsigned char data2);
void disp_img(unsigned char code *img);
void clr_ram(void);
void main(void);

unsigned char code img1[];
char   code   han[]={  
/*--  文字:  汉  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x10,0x60,0x01,0x86,0x60,0x04,0x1C,0xE4,0x04,0x04,0x04,0xE4,0x1C,0x04,0x00,0x00,
0x04,0x04,0x7E,0x01,0x40,0x20,0x20,0x10,0x0B,0x04,0x0B,0x10,0x30,0x60,0x20,0x00,
};
/******************************************************************************************
*函数名称: init_lcd
*功能描述: 初始化
******************************************************************************************/
void init_lcd (void)
{
wr_lcd_1(0,0xc0);  
wr_lcd_1(0,0x3f);  
wr_lcd_2(0,0xc0);  
wr_lcd_2(0,0x3f);
wr_lcd_3(0,0xc0);  
wr_lcd_3(0,0x3f);
}
/******************************************************************************************
*函数名称:wr_lcd_1
*功能描述:左屏写入指令/数据子程序
******************************************************************************************/
void wr_lcd_1(unsigned char dat_com,unsigned char content)
{
CS1=0;
CS2=0;
// ck_busy();
if(dat_com)
  {
   RS = 1;   //data
   RW = 0;   //write
  }
else
  {
   RS = 0;   //com
   RW = 0;   //write
  }
P1=content;   //iutput data or com
E = 1;

E = 0;
}
/******************************************************************************************
*函数名称:wr_lcd_2
*功能描述:中屏写入指令/数据子程序
******************************************************************************************/
void wr_lcd_2(unsigned char dat_com,unsigned char content)
{
CS1=0;
CS2=1;
//ck_busy();
if(dat_com)
  {
   RS = 1;   //data
   RW = 0;   //write
  }
else
  {
   RS = 0;   //com
   RW = 0;   //write
  }
P1=content;   //iutput data or com
E = 1;

E = 0;
}
/******************************************************************************************
*函数名称:wr_lcd_3
*功能描述:右屏写入指令/数据子程序
******************************************************************************************/
void wr_lcd_3(unsigned char dat_com,unsigned char content)
{
CS1=1;
CS2=0;
//ck_busy();
if(dat_com)
  {
   RS = 1;   //data
   RW = 0;   //write
  }
else
  {
   RS = 0;   //com
   RW = 0;   //write
  }
P1=content;   //iutput data or com
E = 1;

E = 0;
}
/******************************************************************************************
****************************************************************************************
*函数名称:delay_us
*功能描述:延时us
******************************************************************************************/
void delay_us(unsigned int us_value)   //delay time
{
while(us_value--);
}

/******************************************************************************************
*函数名称:delay_ms
*功能描述:延时ms
******************************************************************************************/
void delay_ms(unsigned int ms_value)
{
unsigned int i,j;
for(i=0;i   for(j=0;j<15;j++)
   delay_us(1);
}

/******************************************************************************************
*函数名称:Disp_dots
*功能描述:显示点、横、竖
******************************************************************************************/
void disp_dots(unsigned char data1,unsigned char data2)
{   
unsigned char i,j;   
for(j=0;j<8;j++)  
{  
  for(i=0;i<32;i++)
  {
   wr_lcd_1(0,0xb8+j);
   wr_lcd_1(0,0x40+i*2);
   wr_lcd_1(1,data1);       
   wr_lcd_1(0,0x40+i*2+1);
   wr_lcd_1(1,data2);
   
   wr_lcd_2(0,0xb8+j);
   wr_lcd_2(0,0x40+i*2);
   wr_lcd_2(1,data1);         
   wr_lcd_2(0,0x40+i*2+1);
   wr_lcd_2(1,data2);
   
   wr_lcd_3(0,0xb8+j);
   wr_lcd_3(0,0x40+i*2);
   wr_lcd_3(1,data1);         
   wr_lcd_3(0,0x40+i*2+1);
   wr_lcd_3(1,data2);
  }
}  
}

/******************************************************************************************
*函数名称:disp_img
*功能描述:显示图片
******************************************************************************************/
void disp_img(unsigned char code *img)  
{  
unsigned char j,k;  
for(k=0;k<8;k++)
  {  
         for(j=0;j<64;j++)
         {  
    wr_lcd_1(0,0xb8+k);  
    wr_lcd_1(0,0x40+j);  
          wr_lcd_1(1,img[k*192+j]);
         }
         for(j=64;j<128;j++)   
   {
           wr_lcd_2(0,0xb8+k);  
    wr_lcd_2(0,0x40+j-64);  
          wr_lcd_2(1,img[k*192+j]);
   }
    for(j=128;j<192;j++)   
   {
           wr_lcd_3(0,0xb8+k);  
    wr_lcd_3(0,0x40+j-128);  
          wr_lcd_3(1,img[k*192+j]);
   }
  }
}
/******************************************************************************************
*函数名称:clr_ram
*功能描述:清除内存
******************************************************************************************/
void clr_ram()  
{  
unsigned char j,k;  
for(k=0;k<8;k++)
{  
  for(j=0;j<64;j++)   
  {
   wr_lcd_1(0,0xb8+k);
         wr_lcd_1(0,0x40+j);
         wr_lcd_1(1,0);
         
   wr_lcd_2(0,0xb8+k);
         wr_lcd_2(0,0x40+j);
         wr_lcd_2(1,0);
         
         wr_lcd_3(0,0xb8+k);
         wr_lcd_3(0,0x40+j);
         wr_lcd_3(1,0);
  }
}
}  
/******************************************************************************************
*函数名称: disp_cn_1
*功能描述: 左屏显示单个汉字
******************************************************************************************/
void disp_cn_1(unsigned char code *cn,unsigned char page,unsigned char col)
{
unsigned char i,j;  
for(j=0;j<2;j++)
{
        for(i=0;i<16;i++)
        {
   wr_lcd_1(0,0xb8+page+j);
   wr_lcd_1(0,0x40+col+i);
   wr_lcd_1(1,cn[j*16+i]);
  }
}  
}
/******************************************************************************************
*函数名称: disp_cn_2
*功能描述: 中屏显示单个汉字
******************************************************************************************/
void disp_cn_2(unsigned char code *cn,unsigned char page,unsigned char col)
{
unsigned char i,j;  
for(j=0;j<2;j++)
{
        for(i=0;i<16;i++)
        {
   wr_lcd_2(0,0xb8+page+j);
   wr_lcd_2(0,0x40+col+i);
   wr_lcd_2(1,cn[j*16+i]);
  }
}  
}
/******************************************************************************************
*函数名称: disp_cn_3
*功能描述: 右屏显示单个汉字
******************************************************************************************/
void disp_cn_3(unsigned char code *cn,unsigned char page,unsigned char col)
{
unsigned char i,j;  
for(j=0;j<2;j++)
{
        for(i=0;i<16;i++)
        {
   wr_lcd_3(0,0xb8+page+j);
   wr_lcd_3(0,0x40+col+i);
   wr_lcd_3(1,cn[j*16+i]);
  }
}  
}

/******************************************************************************************
*函数名称: main
*功能描述: 主程序
******************************************************************************************/
void main()
{
delay_ms(40);
init_lcd();
clr_ram();
while(1)
  {
   disp_dots(0xff,0xff);
   delay_ms(800);
   disp_dots(0x55,0xaa);
   delay_ms(800);
   disp_dots(0xaa,0xaa);
   delay_ms(800);  
   disp_dots(0x55,0x55);
   delay_ms(800);
   disp_dots(0xaa,0xaa);
   delay_ms(800);
   disp_dots(0xff,0x00);
   delay_ms(800);
   disp_dots(0x00,0xff);
   delay_ms(800);
   clr_ram();

   disp_cn_1(han,2,0);
   delay_ms(800);
   clr_ram();

   }
}
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

13
 
关注中
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

14
 

  1. #define DATA_PORT PORTB   //数据端口为PB口
  2. //cs1-->portd3
  3. //cs2-->portd4
  4. //rs -->portd5
  5. //rw -->portd6
  6. //e  -->portd7
  7. void lcd_WCMDL(unsigned char command)
  8. {
  9.   PORTD&=0b10011111; //rs=rw=0
  10.   PORTD|=0b00001000; //cs1=1
  11.   PORTD&=0b11101111; //cs2=0
  12.   DATA_PORT=command;  //data out
  13.   PORTD|=0b10000000; //e=1
  14.   wait;
  15.   PORTD&=0b01111111; //e=0
  16.   wait;
  17.        
  18. }
  19. void lcd_WDL(unsigned char lcd_data)
  20. {
  21.         PORTD|=0b00100000; //rs=1       
  22.         PORTD&=0b10111111; //rw=0
  23.   PORTD|=0b00001000; //cs1=1
  24.   PORTD&=0b11101111; //cs2=0
  25.   DATA_PORT=lcd_data;  //data out
  26.   PORTD|=0b10000000; //e=1
  27.   wait;
  28.   PORTD&=0b01111111; //e=0
  29.   wait;
  30.         PORTD&=0b11100111;//--->                        cs1=cs2=0;
  31.        
  32. }
  33. void lcd_WCMDR(unsigned char command)
  34. {
  35.         PORTD&=0b10011111; //rs=rw=0
  36.   PORTD&=0b11110111; //cs1=0
  37.   PORTD|=0b00010000; //cs2=1
  38.   DATA_PORT=command;  //data out
  39.   PORTD|=0b10000000; //e=1
  40.   wait;
  41.   PORTD&=0b01111111; //e=0
  42.   wait;       
  43. }
  44. void lcd_WDR(unsigned char lcd_data)
  45. {
  46.         PORTD|=0b00100000; //rs=1       
  47.         PORTD&=0b10111111; //rw=0
  48.   PORTD&=0b11110111; //cs1=0
  49.   PORTD|=0b00010000; //cs2=1
  50.   DATA_PORT=lcd_data;  //data out
  51.   PORTD|=0b10000000; //e=1
  52.   wait;
  53.   PORTD&=0b01111111; //e=0
  54.   wait;
  55.         PORTD|=0b00011000;//--->cs1=cs2=1;
  56. }
  57. //lcd 初始化
  58. void lcd_init(void)
  59. {
  60.         lcd_WCMDL(0x3f);
  61.         lcd_WCMDL(0xc0);
  62.         lcd_WCMDR(0x3f);
  63.         lcd_WCMDR(0xc0);
  64. }

  65. void lcd_wrch(unsigned char x,unsigned char y,unsigned char dd)
  66. {
  67.         PORTD&=0b11100111;//--->                        cs1=cs2=0;
  68.         if (x<64)
  69.                 {
  70.                         lcd_WCMDL(0xb8|y);//DATA_PORT=0xb8|y;  //data out
  71.                         lcd_WCMDL(0x40|x);//DATA_PORT=0x40|x;  //data out
  72.                         lcd_WDL(dd);  //data out
  73.                 }
  74.         else
  75.                 { x=x-64;
  76.                         lcd_WCMDR(0xb8|y);//DATA_PORT=0xb8|y;  //data out
  77.                         lcd_WCMDR(0x40|x);//DATA_PORT=0x40|x;  //data out
  78.                         lcd_WDR(dd);  //data out
  79.                 }
  80. }
  81. void lcd_clear(void)
  82. {
  83.         unsigned char x,y;
  84.         for (y=0;y<8;y++)
  85.            for(x=0;x<128;x++)
  86.               lcd_wrch(x,y,0x00);
  87. }

复制代码

这个绝对没有问题!是我用的程序!你对照一下!看看问题出在哪里吧!
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(中级)

15
 
这个问题简单~~~把片选反过来试试。如果开片选CS1=0的话,改成CS1=1.  QQ937819428 以前遇到这个问题,郁闷一个星期,其实程序没问题。
 
 
 

回复

3404

帖子

6

TA的资源

裸片初长成(初级)

16
 
调试液晶最常见的问题一个是指令弄错了,没有完全按照数据手册上的来,另外一个就是时序不对,说白了就是延时太短。后一个占的比例更大一些。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表