登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

求助12232液晶显示程序!!!

作者:shbguo 栏目:单片机
求助12232液晶显示程序!!!
小弟近来想做一个液晶显示,用51单片机来控制12232液晶显示器,可是搞了几天下来,仍是毫无头绪,因为以前从未用过液晶显示,所以想求助各位高手和前辈,给一个小小的单片机驱动液晶显示程序,哪怕一点点也好!这对刚入门的我可是巨大的帮助!谢谢啊

2楼: >>参与讨论
hotpower
网上到处都是...
 
3楼: >>参与讨论
Ethenet
那里买的到哪里要程序最方便了
 
4楼: >>参与讨论
huangxd
————————》》》
〖说明〗12232点阵信利液晶基本驱动程序,国内很多122×32的液晶与之完全兼容,
        该液晶左右分MASTER和SLAVE,上下共分4页,左边列地址从0-61,
        右边列地址从0-61,由于芯片内部线路的落后,所以使用较麻烦。

〖文件〗12232lcd.c  ﹫2001/03/23
〖作者〗龙啸九天 c51@yeah.net http://mcs51.yeah.net/
〖修改〗修改建议请到论坛公布 http://c51bbs.yeah.net/
〖版本〗V1.00A Build 0323
—————————————————————*/


#define E2 P3_5
#define E1 P3_6

#define A0 P3_7
#define DATA P2

/*----------------------------------------------------------------------------
调用方式:void OutMI(uchar i)
函数说明:发指令i到主窗口。(内函数,私有,用户不直接调用)
------------------------------------------------------------------------------*/
void OutMI(uchar i)
{
E1=1;_nop_();_nop_();
A0=0;_nop_();_nop_();
DATA=i;_nop_();_nop_();
E1=0;_nop_();_nop_();
}
/*------------------------------------------------------------------------------
--
调用方式:void OutMD(uchar i)
函数说明:发数据i到主窗口。(内函数,私有,用户不直接调用)
--------------------------------------------------------------------------------
-*/
void OutMD(uchar i)
{
E1=1;_nop_();_nop_();
A0=1;_nop_();_nop_();
DATA=i;_nop_();_nop_();
E1=0;_nop_();_nop_();
}
/*------------------------------------------------------------------------------
--
调用方式:void OutSI(uchar i)
函数说明:发指令i到从窗口。(内函数,私有,用户不直接调用)
--------------------------------------------------------------------------------
-*/
void OutSI(uchar i)
{
A0=0;_nop_();_nop_();
E2=1;_nop_();_nop_();
DATA=i;_nop_();_nop_();
E2=0;_nop_();_nop_();
}

/*------------------------------------------------------------------------------
--
调用方式:void OutSD(uchar i)
函数说明:发数据i到从窗口。(内函数,私有,用户不直接调用)
--------------------------------------------------------------------------------
-*/
void OutSD(uchar i)
{
A0=1;_nop_();_nop_();
E2=1;_nop_();_nop_();
DATA=i;_nop_();_nop_();
E2=0;_nop_();_nop_();
}

/*------------------------------------------------------------------------------
--
调用方式:void LcdIni(void)
函数说明:12232点阵液晶初始化,开机后仅调用一次。
--------------------------------------------------------------------------------
-*/
void LcdIni(void)
{
OutMI(0XE2);OutSI(0XE2);//复位
OutMI(0XAE);OutSI(0XAE);//POWER SAVE
OutMI(0XA4);OutSI(0XA4);//动态驱动
OutMI(0XA9);OutSI(0XA9);//1/32占空比
OutMI(0XA0);OutSI(0XA0);//时钟线输出
OutMI(0XEE);OutSI(0XEE);//写模式

OutMI(0X00);OutMI(0XC0);
OutSI(0X00);OutSI(0XC0);

OutMI(0XAF);OutSI(0XAF);
}

/*------------------------------------------------------------------------------
--
调用方式:void SetPage(uchar page0,uchar page1)
函数说明:同时设置主从显示页为0-3页。(内函数,私有,用户不直接调用)
--------------------------------------------------------------------------------
-*/
void SetPage(uchar page0,uchar page1)
{
OutMI(0xB8|page1);OutSI(0xB8|page0);
}

/*------------------------------------------------------------------------------
--
调用方式:void SetAddress(uchar address0,uchar address1)
函数说明:同时设置主从列地址为0-121。(内函数,私有,用户不直接调用)
--------------------------------------------------------------------------------
-*/
void SetAddress(uchar address0,uchar address1)
{
OutMI(address1&0x7F);OutSI(address0&0x7F);
}

/*------------------------------------------------------------------------------
--
调用方式:void PutChar0(uchar ch)
函数说明:在左页当前地址画一个字节8个点。(内函数,私有,用户不直接调用)
--------------------------------------------------------------------------------
-*/
void PutChar0(uchar ch)
{
OutSD(ch);
}

/*------------------------------------------------------------------------------
--
调用方式:void PutChar1(uchar ch)
函数说明:在右页当前地址画一个字节8个点。(内函数,私有,用户不直接调用)
--------------------------------------------------------------------------------
-*/
void PutChar1(uchar ch)
{
OutMD(ch);
}

/*------------------------------------------------------------------------------
--
调用方式:void DrawBmp(uchar x,bit layer,uchar width,uchar *bmp)
函数说明:画一个图,横坐标是x,layer表示上下层,width是图形的宽,高都是16,bmp是
图形指针
          使用zimo21软件,采用纵向取模得到bmp数据。
--------------------------------------------------------------------------------
-*/
void DrawBmp(uchar x0,bit layer,uchar width,uchar *bmp)
{
uchar x,address,i=0;     //address表示显存的物理地址
uchar page=0;
bit window=0;  //page表示上下两页,window表示左右两页
if (layer) page=2;

for (x=x0;x<x0+width;x++)
{
if (x>60) {window=1;address=x%61;}
else address=x;

SetPage(page,page);
SetAddress(address,address);

if (window) PutChar1(bmp[i]);
   else PutChar0(bmp[i]);//画上层

SetPage(page+1,page+1);
SetAddress(address,address);

if (window) PutChar1(bmp[i+width]);
           else PutChar0(bmp[i+width]);//画下层
    i++;
}
}


/*------------------------------------------------------------------------------
--
调用方式:void clrscr(void)
函数说明:清屏
--------------------------------------------------------------------------------
-*/
void clrscr(void)
{
uchar i;
uchar page;
for (page=0;page<4;page++)
{
SetPage(page,page);
SetAddress(0,0);
for (i=0;i<61;i++){PutChar0(0);PutChar1(0);}
}
}

void main()
{
uint j;
LcdIni(); //reset
clrscr(); //
for(j=0;j<6;j++)
   DrawBmp(16*j,0,16,table+32*j); //table为字模表格首址,显示六个汉字
while (1);
}


5楼: >>参与讨论
huangxd
这个液晶确实很难调试。
我也有一个12232的,至今调不通过,可能是我的电路接的有问题,6800时序与8080时序的电路接法好象不同

6楼: >>参与讨论
cysmwander
这个其实不难
  呵呵,看懂液晶操作的时序和控制命令就可以了,如果出现花屏在E1,E2分别对地接一个102的电容就可以了!

7楼: >>参与讨论
hotpower
这个是我实际用过的
 

http://www.21icbbs.com/club/bbs/showEssence.asp?id=5770

8楼: >>参与讨论
shbguo
to:huangxd大哥
to:huangxd大哥
    真是谢谢huangxd大侠啊,小弟回去试验了一下,果真很灵!!!虽然现在是刚刚起步,单对于刚毕业的我来说,是很大的鼓励!!!谢谢huangxd,也谢谢21ic.com上论坛的各位大侠和高手,在这里有我们的良师益友!!!

9楼: >>参与讨论
huangxd
不客气,我还想请教你啊。
不知道你的确实完全调通了吗?我自己有一个我都调不通,我用的LCM是16个脚的,里面除了E1,E2,A0外,还有一个RW脚,但是我贴的程序里面的函数,比如:
void OutMI(uchar i)
{
E1=1;_nop_();_nop_();
A0=0;_nop_();_nop_();
DATA=i;_nop_();_nop_();
E1=0;_nop_();_nop_();
}并没有对RW脚操作,不知道你用的LCM是几个脚的,你直接搬这个函数就可以用吗?

10楼: >>参与讨论
huangxd
第二个源程序

#include "reg51.h"
#include "intrins.h"
#include "absacc.h"
#include ".\inc\ASCII816.h" //标准ASCII码库
#include ".\inc\HZTable.h" //自制的汉字库
#include ".\inc\menu.h"</P><P>  //自制的菜单库
sbit LCD12232_A0=P3^3;
sbit LCD12232_RW=P3^1; //读写
sbit LCD12232_E1=P3^5; //片选1(MASTER)
sbit LCD12232_E2=P3^4; //片选2(slave)
#define LCD12232_DATA P1 //数据口
void ClearScreen(void);
/*----------------------------------------------------------------------------
调用方式:void OutMI(unsigned CHAR i)
函数说明:发指令i到主窗口。(内函数,私有,用户不直接调用)
------------------------------------------------------------------------------*/
void OutMI(unsigned CHAR i)
{
LCD12232_E2=0; //确认
LCD12232_A0=0;
LCD12232_RW=1;
LCD12232_E1=1; _nop_();
LCD12232_DATA = i;
while( LCD12232_DATA & 0x80 ); //busy?
LCD12232_E1=0; _nop_();</P><P>LCD12232_RW=0;
LCD12232_E1=1; _nop_();</P><P>LCD12232_DATA=i;_nop_();
LCD12232_E1=0; _nop_();
}
/*------------------------------------------------------------------------------
调用方式:void OutMD(unsigned CHAR i)
函数说明:发数据i到主窗口。(内函数,私有,用户不直接调用)
-------------------------------------------------------------------------------*/
void OutMD(unsigned CHAR i)
{
LCD12232_E2=0; //确
LCD12232_A0=0;
LCD12232_RW=1;
LCD12232_E1=1; _nop_();
LCD12232_DATA = i;
while( LCD12232_DATA & 0x80 );
LCD12232_E1=0; _nop_();LCD12232_A0=1;
LCD12232_RW=0;
LCD12232_E1=1; _nop_();
LCD12232_DATA=i; _nop_();
LCD12232_E1=0; _nop_();
}
*------------------------------------------------------------------------------
调用方式:void OutSI(unsigned CHAR i)
函数说明:发指令i到从窗口。(内函数,私有,用户不直接调用)
-------------------------------------------------------------------------------*/
void OutSI(unsigned CHAR i)
{
LCD12232_E1=0; //确认
LCD12232_A0=0;
LCD12232_RW=1;
LCD12232_E2=1; _nop_();
LCD12232_DATA = i;
while( LCD12232_DATA & 0x80 );
LCD12232_E2=0; _nop_();
LCD12232_RW=0;
LCD12232_E2=1; _nop_();
LCD12232_DATA=i; _nop_();
LCD12232_E2=0; _nop_();
}
/*------------------------------------------------------------------------------
调用方式:void OutSD(unsigned CHAR i)
函数说明:发数据i到从窗口。(内函数,私有,用户不直接调用)
-------------------------------------------------------------------------------*/
void OutSD(unsigned CHAR i)
{
LCD12232_E1=0; //确认
LCD12232_A0=0;
LCD12232_RW=1;
LCD12232_E2=1; _nop_();
LCD12232_DATA =i;
while( LCD12232_DATA & 0x80 );
LCD12232_E2=0; _nop_();
LCD12232_A0=1;
LCD12232_RW=0;
LCD12232_E2=1; _nop_();
LCD12232_DATA=i; _nop_();
LCD12232_E2=0; _nop_();
}</P><P>/*--------------------------------------------------------------------------------------------------*/
//显示8*8点阵
//字模被竖着切分
//lin:行(0-3), column: 列(0-14)
//address : 字模区首地址
void Show88(unsigned CHAR lin,unsigned CHAR column,unsigned int address)
{
unsigned CHAR i,j;</P><P> if( column > 14) return;</P><P></P><P> if( column < 7 ) //8*8点阵都在左屏(MASTER)
{ OutMI( 0xB8 | lin); //设置显示行
OutMI( column*8 ); //设置显示列
for(i=0; i<8 ; i++ ) { OutMD( CBYTE[address+i] ); }
}
if( column == 7) //8*8点阵,前6个在左屏(MASTER),后两个在右屏(Slave)
{ OutMI( 0xB8 | lin); //设置显示行
OutMI( column*8 ); //左屏
for(i=0; i<6 ; i++ )
{ OutMD( CBYTE[address+i] ); }</P><P> OutSI( 0xB8 | lin); //设置显示行
OutSI( 0 ); //右屏
for(i=0; i<3 ; i++ ) { OutSD( CBYTE[address+i+5] ); }
}
if( column > 7) //8*8点阵都在右屏(Slave)
{ OutSI( 0xB8 | lin); //设置显示行
OutSI( column*8-61 );
for(i=0; i<8 ; i++ ) { OutSD( CBYTE[address+i] ); }
}
}</P><P>/*------------------------------------------------------------------------------------------------*/
//显示8*16字符
//旋转90度:字模被竖着切分
//lin:行(0-3), column: 列(0-15)
//CHARacter:字符代码(标准ASCII码)
void ShowChar(unsigned CHAR lin,unsigned CHAR column,unsigned CHAR CHARacter)
{ lin=lin<<1;
Show88(lin ,column,ASCII816[CHARacter-0x20] );
Show88(lin+1,column,ASCII816[CHARacter-0x20]+8 );
}
/*----------------------------------------------------------------------------------------------*/
//显示一个汉字
//旋转90度:字模被竖着切分
//lin:行(0-3), column: 列(0-7)
//hzcode: 汉字代码(自定义的)
//uCHAR code HZtable
void ShowHZ(unsigned CHAR lin,unsigned CHAR column,unsigned int hzcode)
{
lin=lin<<1; //lin*2
Show88(lin,column,HZTable[hzcode]);
Show88(lin,column+1,HZTable[hzcode]+8);
Show88(lin+1,column,HZTable[hzcode]+16);
Show88(lin+1,column+1,HZTable[hzcode]+24);
}
////////////////////////////////////////////////////////////////////////</P><P>
/*------------------------------------------------------------------------------
调用方式:void LcdIni(void)
函数说明:12232点阵液晶初始化,开机后仅调用一次。
------------------------------------------------------------------------------*/
void InitLCD(void)
{
OutMI(0XE2);OutSI(0XE2);//复位
OutMI(0XAE);OutSI(0XAE);//POWER SAVE
OutMI(0XA4);OutSI(0XA4);//动态驱动
OutMI(0XA9);OutSI(0XA9);//1/32占空比
OutMI(0XA0);OutSI(0XA0);//时钟线输出
OutMI(0XEE);OutSI(0XEE);//写模式
OutMI(0XC0);OutMI(0X00);//显示起始行为0,列地址为0
OutSI(0XC0);OutSI(0X00);//显示起始行为0,列地址为0
OutMI(0XAF);OutSI(0XAF); //开显示
ClearScreen();
}</P><P>/*------------------------------------------------------------------------------
调用方式:void clrscr(void)
函数说明:清屏
------------------------------------------------------------------------------*/
void clrscr(void)
{
unsigned CHAR i;
unsigned CHAR page;
for( page=0;page<2; page ++)
{
for(i=0;i<5;i++) ShowChar( page,i,' ');
}
}///////////////////////////////////////////////////////////////////////
/*------------------------------------------------------------------------------
调用方式:void SetPage(unsigned CHAR page0,unsigned CHAR page1)
函数说明:同时设置主从显示页为0-3页。(内函数,私有,用户不直接调用)
------------------------------------------------------------------------------*/
void SetPage(unsigned CHAR page0,unsigned CHAR page1)
{
OutMI(0xB8|page1);
OutSI(0xB8|page0);
}
/*------------------------------------------------------------------------------
调用方式:void SetAddress(unsigned CHAR address0,unsigned CHAR address1)
函数说明:同时设置主从列地址为0-121。(内函数,私有,用户不直接调用)
-------------------------------------------------------------------------------*/
void SetAddress(unsigned CHAR address0,unsigned CHAR address1)
{
OutMI(address1&0x7F);
OutSI(address0&0x7F);
}
/*------------------------------------------------------------------------------
调用方式:void PutChar0(unsigned CHAR ch)
函数说明:在左页当前地址画一个字节8个点。(内函数,私有,用户不直接调用)
-------------------------------------------------------------------------------*/
void PutChar0(unsigned CHAR ch)
{
OutSD(ch);
}
/*------------------------------------------------------------------------------
调用方式:void PutChar1(unsigned CHAR ch)
函数说明:在右页当前地址画一个字节8个点。(内函数,私有,用户不直接调用)
-------------------------------------------------------------------------------*/
void PutChar1(unsigned CHAR ch)
{
OutMD(ch);
}
/*------------------------------------------------------------------------------
调用方式:void DrawBmp(unsigned CHAR x,bit layer,unsigned CHAR width,unsigned CHAR *b
11楼: >>参与讨论
shbguo
to: huangxd again
你给的那个程序的确不能直接用,我用的是20脚的,但是我在你那个的思路基础上做了一些修改,虽然程序是我自己编的,但是可以说你的启发作用是功不可没的呀,谢谢!多多交流,向各位大虾学习!

12楼: >>参与讨论
ttt

花屏为什么要接102的电容而不接其它容量的电容呢?是瓷片的得不

参与讨论
昵称:
讨论内容:
 
 
相关帖子
如果做只读型射频卡读卡器,有没有专用芯片?
请教:光电隔离元件
keil c关于乘法
我用AT89C51来产生PWM……麻烦了,做不出来
关于系统电源开关问题
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号