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

gao11zhang 2009-12-03 10:06:29
下面是我的程序,是用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<Delx)
{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)
{};

}
...全文
681 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
yoyo20071125 2009-12-07
  • 打赏
  • 举报
回复
关注中
galle 2009-12-07
  • 打赏
  • 举报
回复

#define DATA_PORT PORTB //数据端口为PB口
//cs1-->portd3
//cs2-->portd4
//rs -->portd5
//rw -->portd6
//e -->portd7
void lcd_WCMDL(unsigned char command)
{
PORTD&=0b10011111; //rs=rw=0
PORTD|=0b00001000; //cs1=1
PORTD&=0b11101111; //cs2=0
DATA_PORT=command; //data out
PORTD|=0b10000000; //e=1
wait;
PORTD&=0b01111111; //e=0
wait;

}
void lcd_WDL(unsigned char lcd_data)
{
PORTD|=0b00100000; //rs=1
PORTD&=0b10111111; //rw=0
PORTD|=0b00001000; //cs1=1
PORTD&=0b11101111; //cs2=0
DATA_PORT=lcd_data; //data out
PORTD|=0b10000000; //e=1
wait;
PORTD&=0b01111111; //e=0
wait;
PORTD&=0b11100111;//---> cs1=cs2=0;

}
void lcd_WCMDR(unsigned char command)
{
PORTD&=0b10011111; //rs=rw=0
PORTD&=0b11110111; //cs1=0
PORTD|=0b00010000; //cs2=1
DATA_PORT=command; //data out
PORTD|=0b10000000; //e=1
wait;
PORTD&=0b01111111; //e=0
wait;
}
void lcd_WDR(unsigned char lcd_data)
{
PORTD|=0b00100000; //rs=1
PORTD&=0b10111111; //rw=0
PORTD&=0b11110111; //cs1=0
PORTD|=0b00010000; //cs2=1
DATA_PORT=lcd_data; //data out
PORTD|=0b10000000; //e=1
wait;
PORTD&=0b01111111; //e=0
wait;
PORTD|=0b00011000;//--->cs1=cs2=1;
}
//lcd 初始化
void lcd_init(void)
{
lcd_WCMDL(0x3f);
lcd_WCMDL(0xc0);
lcd_WCMDR(0x3f);
lcd_WCMDR(0xc0);
}

void lcd_wrch(unsigned char x,unsigned char y,unsigned char dd)
{
PORTD&=0b11100111;//---> cs1=cs2=0;
if (x<64)
{
lcd_WCMDL(0xb8|y);//DATA_PORT=0xb8|y; //data out
lcd_WCMDL(0x40|x);//DATA_PORT=0x40|x; //data out
lcd_WDL(dd); //data out
}
else
{ x=x-64;
lcd_WCMDR(0xb8|y);//DATA_PORT=0xb8|y; //data out
lcd_WCMDR(0x40|x);//DATA_PORT=0x40|x; //data out
lcd_WDR(dd); //data out
}
}
void lcd_clear(void)
{
unsigned char x,y;
for (y=0;y<8;y++)
for(x=0;x<128;x++)
lcd_wrch(x,y,0x00);
}


这个绝对没有问题!是我用的程序!你对照一下!看看问题出在哪里吧!
gao11zhang 2009-12-04
  • 打赏
  • 举报
回复
负压电阻调节了,我用的是50K的,这个应该是没什么影响吧,
爪哇鹅 2009-12-04
  • 打赏
  • 举报
回复
要严格按照芯片的时序图来写,一个是控制寄存器的顺序,是高电平启动还是低电平启动,还有就是延时函数,多调一调。
galle 2009-12-04
  • 打赏
  • 举报
回复
你的lcd负压电阻调节了么?就是调节对比度的!应该是10k的
宇帆 2009-12-04
  • 打赏
  • 举报
回复
看看手册的时序图,对照着程序分析
gao11zhang 2009-12-04
  • 打赏
  • 举报
回复
谢谢,我还是不大明白,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_();
}
//--------------------------------------------------------
gao11zhang 2009-12-04
  • 打赏
  • 举报
回复
还没有显示,我的电路是一个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<reg52.h>
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<ms_value;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();

}
}
kyzf 2009-12-04
  • 打赏
  • 举报
回复
还没弄好吗> 关注下
gao11zhang 2009-12-04
  • 打赏
  • 举报
回复
可以改变对比度的
驱动不起来,不显示我要显示的东西
jiejie526 2009-12-04
  • 打赏
  • 举报
回复
[Quote=引用楼主 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 <Delx)
  {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)
{};
   
}
[/Quote]


负压电阻调节会不会改变亮度呢????
kyzf 2009-12-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 kyzf 的回复:]
应该是初始化的出问题了。LCD写数据函数 和写指令, 好象是先E=1,再给数据或者指令,再延时,在E=0.



[/Quote]
还可能是延时不够;如果方便的,用示波器测试数据的波形。
kyzf 2009-12-03
  • 打赏
  • 举报
回复
应该是初始化的出问题了。LCD写数据函数 和写指令, 好象是先E=1,再给数据或者指令,再延时,在E=0.




27,373

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧