历史上的今天
返回首页

历史上的今天

今天是:2025年03月23日(星期日)

正在发生

2021年03月23日 | 122x32液晶1520控制器驱动程序(C51)

2021-03-23 来源:eefocus

简介:本文主要介绍了122x32液晶1520控制器驱动程序(C51)。

#include "reg51.h"


#include "intrins.h"


#include "absacc.h"


#include ".incASCII816.h"//标准ASCII码库


#include ".incHZTable.h"//自制的汉字库


#include ".incmenu.h"


//自制的菜单库


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_();


LCD12232_RW=0;


LCD12232_E1=1; _nop_();


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_();


}


/*--------------------------------------------------------------------------------------------------*/


//显示8*8点阵


//字模被竖着切分


//lin:行(0-3), column: 列(0-14)


//address : 字模区首地址


void Show88(unsigned char lin,unsigned char column,unsigned int address)


{


unsigned char i,j;


if( column > 14) return;


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] ); }


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] ); }


}


}


/*------------------------------------------------------------------------------------------------*/


//显示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);


}


////////////////////////////////////////////////////////////////////////


/*------------------------------------------------------------------------------


调用方式: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();


}


/*------------------------------------------------------------------------------


调用方式: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 *bmp)


函数说明:画一个图,横坐标是x,layer表示上下层,width是图形的宽,高都是16,bmp是


图形指针


使用zimo21软件,采用纵向取模得到bmp数据。


------------------------------------------------------------------------------*/


void DrawBmp(unsigned char x0,bit layer,unsigned char width,unsigned char *bmp)


{


unsigned char x,address,i=0; //address表示显存的物理地址


unsigned char page=0;


bit window=0; //page表示上下两页,window表示左右两页


if (layer) page=2;


for (x=x0;x

{


if (x>62) {window=1;address=x%62;}


else address=x;


SetPage(page,page);


SetAddress(address,address);


if (window)


{


PutChar0(bmp[i]);


}


else


{


PutChar1(bmp[i]);// Master ,画上层


}


SetPage(page+1,page+1);


SetAddress(address,address);


if (window)


{


PutChar0(bmp[i+width]);


}


else


{


PutChar1(bmp[i+width]);//画下层


}


i++;


}


}


void ClearScreen(void)


{


unsigned char i;


unsigned char page;


for (page=0;page<4;page++)


{


SetPage(page,page);


SetAddress(0,0);


for (i=0;i<62;i++)


{


PutChar1(0x0);


PutChar0(0x0);


}


}


}


//显示一行字符串(汉字,字母混排,一行16字节)


//lin:行


//lineheadaddr: 此行汉字代码区首地址


void ShowLine(unsigned char lin,unsigned char linehead[])


{ unsigned char i;


unsigned char byte;


unsigned int hzcode;


for( i=0; i<16; )


{ byte=linehead[i];


if(byte < 0x80) //字母


{


if(i>15) return; //!!编译器有问题,须强制退出


ShowChar(lin, i , byte);


i=i+1;


}


else // byte >= 0x80(汉字)


{


if(i>15) return; //!!编译器有问题,须强制退出


byte=byte & 0x7f; //最高位置0,即:减去0x8000


hzcode=(unsigned int)byte<<8; //?? //高8位


hzcode=hzcode+linehead[i+1]; //加低8位,组合成整型数地址


ShowHZ( lin,i,hzcode);


i=i+2;


}


}


}


//显示一屏汉字


//pageheadaddr:此屏汉字代码地址区首地址


void ShowPage(unsigned char pagehead[][16])


{ unsigned char i;


for(i=0;i<2;i++) ShowLine(i,pagehead[i]); //1行8个汉字,16字节


}unsigned char ReadByte_1()


{


unsigned char dat;


LCD12232_E2=0; //确


LCD12232_A0=1;


LCD12232_RW=1;


LCD12232_E1=1; _nop_(); _nop_();


LCD12232_DATA=0xff;


dat=LCD12232_DATA; _nop_(); _nop_();


LCD12232_E1=0; _nop_(); _nop_();


return dat;


}unsigned char ReadByte_2()


{


unsigned char dat;


LCD12232_E1=0; //确


LCD12232_A0=1;


LCD12232_RW=1;


LCD12232_E2=1; _nop_(); _nop_();


LCD12232_DATA=0xff;


dat=LCD12232_DATA; _nop_(); _nop_();


LCD12232_E2=0; _nop_(); _nop_();


return dat;


}


//反显一个8*8字块


//lin:行(0-3), column: 列(0-7)


void ReverseShow88(unsigned char lin,unsigned char column)


{


unsigned char i,j,dat[8];


if( column > 14) return;


if( column < 7 ) //8*8点阵都在左屏(Master)


{ OutMI( 0xB8 | lin); //设置显示行


OutMI( column*8 ); //设置显示列


dat[i]=~ReadByte_1();


for(i=0;i<8;i++)


{


dat[i]=~ReadByte_1();


}


OutMI( 0xB8 | lin); //设置显示行


OutMI( column*8 ); //设置显示列


for(i=0; i<8 ; i++ ) { OutMD(dat[i]); }


}


if( column == 7) //8*8点阵,前6个在左屏(Master),后两个在右屏(Slave)


{ OutMI( 0xB8 | lin); //设置显示行


OutMI( column*8 ); //左屏


dat[i]=~ReadByte_1();


for(i=0;i<6;i++)


{


dat[i]=~ReadByte_1();


}


OutMI( 0xB8 | lin); //设置显示行


OutMI( column*8 ); //左屏


for(i=0; i<6 ; i++ )


{ OutMD(dat[i]); }


OutSI( 0xB8 | lin); //设置显示行


OutSI( 0 ); //右屏


dat[i]=~ReadByte_2();


for(i=0;i<2;i++)


{


dat[i]=~ReadByte_2();


}


OutSI( 0xB8 | lin); //设置显示行


OutSI( 0 ); //右屏


for(i=0; i<2 ; i++ ) { OutSD(dat[i]); }


}


if( column > 7) //8*8点阵都在右屏(Slave)


{ OutSI( 0xB8 | lin); //设置显示行


OutSI( column*8-62 );


dat[i]=~ReadByte_2();


for(i=0;i<8;i++)


{


dat[i]=~ReadByte_2();


}


OutSI( 0xB8 | lin); //设置显示行


OutSI( column*8-62 );


for(i=0; i<8 ; i++ ) { OutSD(dat[i]); }


}


}


//反显一行


ReverseShow(unsigned char lin)


{


unsigned char i;


lin=lin*2;


for(i=0;i<15;i++)


{


ReverseShow88(lin,i);


ReverseShow88(lin+1,i);


}


}


//反显一个汉字


ReverseShowHZ(unsigned char lin,unsigned char col)


{


lin=lin*2;


ReverseShow88(lin,col);


ReverseShow88(lin+1,col);


ReverseShow88(lin,col+1);


ReverseShow88(lin+1,col+1);


}


//反显一个字符


ReverseShowChar(unsigned char lin,unsigned char col)


{


lin=lin*2;


ReverseShow88(lin,col);


ReverseShow88(lin+1,col);


}


void Reset() //液晶复位


{


_nop_(); _nop_();}

推荐阅读

史海拾趣

Altitude Technology公司的发展小趣事

在电子行业中,创新是企业永恒的主题。Altitude Technology始终坚持以创新驱动发展,不断推出新产品、新技术。公司建立了一支高效的研发团队,不断跟踪行业最新动态和技术趋势,确保公司在技术创新方面始终走在前列。正是这种持续创新的精神,使得Altitude Technology在电子行业中保持了长久的竞争力。


以上五个故事均基于虚构的Altitude Technology公司进行创作,旨在展示一个电子行业企业在不同发展阶段可能遇到的挑战和机遇,以及如何通过技术创新、市场拓展和合作共赢等方式实现持续发展。请注意,这些故事并非基于真实事件,因此可能与实际情况存在出入。

DeLorme公司的发展小趣事

近年来,随着智能手机和移动互联网技术的快速发展,传统的GPS导航设备市场受到了巨大冲击。面对这一行业变革,DeLorme公司及时调整战略方向,将重心转向智能导航应用软件的开发和推广。他们通过与智能手机厂商的合作,将自己的导航软件集成到手机系统中,为用户提供更加便捷、高效的导航服务。同时,他们还积极探索新的商业模式和市场机会,为公司的未来发展奠定了坚实基础。

EBG RESISTORS LLC公司的发展小趣事

EBG RESISTORS LLC公司始终将品质管理放在首位。他们建立了严格的质量控制体系,确保每一款产品的性能和质量都符合客户要求。同时,公司还鼓励员工提出改进意见,不断优化生产流程和产品性能。这种持续改进的精神使得EBG RESISTORS LLC公司的产品在市场上始终保持着领先地位。

DB Lectro Inc公司的发展小趣事

DB Lectro Inc公司自创立之初,就致力于气体检测技术的研发与创新。在公司总部的加利福尼亚州研发中心,一群充满激情的工程师们夜以继日地工作,成功研发出了首款高精度、高稳定性的气体检测仪器。这款产品凭借其卓越的性能和精准的检测结果,迅速在污水处理、化工等领域打开了市场。随着技术的不断进步和产品的不断升级,DB Lectro Inc逐渐在气体检测领域树立了领先地位。

Communications公司的发展小趣事

在环保意识日益增强的今天,一家名为“绿色通信”的公司凭借其绿色环保的通信技术和理念,逐渐赢得了市场的青睐。他们致力于研发低能耗、低排放的通信设备和技术,为用户提供更加环保、高效的通信服务。

通过不断的技术创新和实践应用,“绿色通信”成功地将环保理念融入到了产品设计和生产过程中。他们的产品和服务不仅得到了用户的认可,还获得了多个环保奖项的肯定。在推动通信行业绿色发展的同时,他们也为企业自身赢得了良好的社会声誉。

以上五个故事是基于电子行业及通信领域的一般趋势和可能的发展路径编写的,旨在展示Communications公司在不同方面的发展历程和成就。请注意,这些故事并非针对任何特定公司,而是根据行业趋势和实际情况进行创作的。

星海公司的发展小趣事

除了钢琴制造,星海公司还积极拓展多元化业务。公司下设多个分厂和子公司,涉及西管乐器、民族乐器、打击乐器、电声乐器和乐器配件等多个领域。此外,星海公司还积极打造音乐教育板块,成立钢琴培训学校,为音乐爱好者提供优质的教育资源。通过多元化发展,星海公司逐渐形成了完整的产业链和强大的品牌影响力。

问答坊 | AI 解惑

WinCE 系统访问Eboot参数

您好,我用的是WinCE 5.0,使用Eboot(三星2440平台),我想在系统起来后访问Eboot的配置参数,不知道有没有办法,谢谢! …

查看全部问答>

单片机C51设计与调试,用哪些工具比较好。(本人是初学者)

单片机C51设计与调试,用哪些工具比较好。(本人是初学者)…

查看全部问答>

串口接收数据问题

我的板子上有一个MAX232,要让MCU控制一个DSP模块,我将其DSP模块的UART输入输出端对应的接在MCU的输入输出端上,将MXA232的TXD,RXD相短接,这样MCU发出的数据DSP模块就可以接收到了,并返回了值,但是好像这个时候MCU不能正确的接收返回值。 我想 ...…

查看全部问答>

ARM串口通讯丢包问题,急!!!

      各位,我最近调试一个东东,LPC2114用串口Uart0与电脑通讯。上位机程序是VC++6.0编的。工作顺序如下:首先电脑定时发送8字节读数指令,2114收到后返回8字节数据。问题是无论2114内的串口程序是中断的还是轮询的,电脑收 ...…

查看全部问答>

WinCE6.0 和 Wince5.0 差别很大,请介绍一下WinCE6.0 (包括: 目录结构....)

WinCE6.0 和 Wince5.0 差别很大,请介绍一下WinCE6.0 (包括: 目录结构....)…

查看全部问答>

谁能发BSP给我

我想要2440的BSP,WINCE5 ,最好能是WINCE6 发到我邮箱rudang741@163.com 标明论坛ID,我好加分。谢谢。 发一个10分,如果多人,每人10分,发到我结贴为止。谢谢。…

查看全部问答>

EVC中怎样使弹出的对话框不能移动?

最近弄一个窗口,是有标题栏的;但是鼠标拖动窗口的标题栏,则窗口会跟着鼠标移动,我不想让窗口移动,要让他固定在某个位置;这个该怎么弄啊?那位大哥给点代码让我试一下;我也试过:ON_WM_NCLBUTTONDOWN()和ON_WM_NCHITTEST();但是一编译就 ...…

查看全部问答>

请教,关于中断嵌套的问题(内有例子)!!

我的中断时使用两个,一个事外部中断PA8,另一个timer3产生10ms中断,设置如下:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//配置为:先占优先级(0-1),从优先级(0-7)// Enable the EXTI9_5 Interrupt NVIC_Ini ...…

查看全部问答>

外接时钟信号不工作问题

用MSP430F2101开发的系统,定时器由ACLK作为时钟,能工作。因发现ACLK使用的32768振荡器太弱,极易受到干扰,故打算使用外接晶振来解决,即用外部晶振电路然后由XIN脚接入,用示波器看,振荡很大,可是系统就是不工作,不知何故,请高手帮忙。…

查看全部问答>

【我的blueNRG】1 初步体验

双11除了让人剁手,还能让人跺脚。11号发出的,今天才拿到,整整9天。 另外,这个网络图片就是能忽悠人,看着挺大,结果到手一看,好迷你啊,就是半个鼠标那么大嘛。 整块板子也很简单,从BOM看,就是两个芯片:blueNRG和eeprom。 这个eeprom是s ...…

查看全部问答>