|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
求助12232液晶显示程序!!! |
作者:shbguo 栏目:单片机 |
小弟近来想做一个液晶显示,用51单片机来控制12232液晶显示器,可是搞了几天下来,仍是毫无头绪,因为以前从未用过液晶显示,所以想求助各位高手和前辈,给一个小小的单片机驱动液晶显示程序,哪怕一点点也好!这对刚入门的我可是巨大的帮助!谢谢啊 |
2楼: | >>参与讨论 |
作者: hotpower 于 2005/4/1 22:18:00 发布:
网上到处都是... |
3楼: | >>参与讨论 |
作者: Ethenet 于 2005/4/1 23:07:00 发布:
那里买的到哪里要程序最方便了 |
4楼: | >>参与讨论 |
作者: huangxd 于 2005/4/2 8:23:00 发布:
————————》》》 〖说明〗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 于 2005/4/2 8:26:00 发布:
这个液晶确实很难调试。 我也有一个12232的,至今调不通过,可能是我的电路接的有问题,6800时序与8080时序的电路接法好象不同 |
6楼: | >>参与讨论 |
作者: cysmwander 于 2005/4/2 10:56:00 发布:
这个其实不难 呵呵,看懂液晶操作的时序和控制命令就可以了,如果出现花屏在E1,E2分别对地接一个102的电容就可以了! |
7楼: | >>参与讨论 |
作者: hotpower 于 2005/4/4 22:21:00 发布:
这个是我实际用过的 |
8楼: | >>参与讨论 |
作者: shbguo 于 2005/4/10 15:39:00 发布:
to:huangxd大哥 to:huangxd大哥 真是谢谢huangxd大侠啊,小弟回去试验了一下,果真很灵!!!虽然现在是刚刚起步,单对于刚毕业的我来说,是很大的鼓励!!!谢谢huangxd,也谢谢21ic.com上论坛的各位大侠和高手,在这里有我们的良师益友!!! |
9楼: | >>参与讨论 |
作者: huangxd 于 2005/4/10 17:34:00 发布:
不客气,我还想请教你啊。 不知道你的确实完全调通了吗?我自己有一个我都调不通,我用的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 于 2005/4/13 14:02:00 发布:
第二个源程序 #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 于 2005/4/18 23:34:00 发布:
to: huangxd again 你给的那个程序的确不能直接用,我用的是20脚的,但是我在你那个的思路基础上做了一些修改,虽然程序是我自己编的,但是可以说你的启发作用是功不可没的呀,谢谢!多多交流,向各位大虾学习! |
12楼: | >>参与讨论 |
作者: ttt 于 2008/4/4 0:52:59 发布:
花屏为什么要接102的电容而不接其它容量的电容呢?是瓷片的得不 |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |