12232点阵信利液晶基本驱动程序

/*————————————————————
〖说明〗12232点阵信利液晶基本驱动程序,国内很多122×32的液晶与之完全兼容,
该液晶左右分MASTER和SLAVE,上下共分4页,左边列地址从0-61,
右边列地址从0-61,由于芯片内部线路的落后,所以使用较麻烦。
〖版本〗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);}
}
}

急!板注:我用了你的源代码,可是他是在左右屏同时显示一样的字符的,我只想显示一
屏,怎么修改? [keilc51] [3次] 01-9-10 上午 11:46:28

检查cs信号(E1,E2)的处理,你可能把左右两块同时打开了? [晓奇] [1次] 01-9-10 下午
12:39:26

在每个子函数里,E1,E2选中后都会关掉,应该不会是这个问题吧。 [keilc51] [2次] 01-
9-10 下午 02:42:44

可能是什么问题呢?谁能看看龙版注的程序? [keilc51] [1次] 01-9-10 下午 06:03:41

我可没有在左右屏同时显示一样的字符,你是不是在硬件上把两个片选E1/E2接一起了?
[龙啸九天] [1次] 01-9-10 下午 09:23:51

没有呀,如果我要显示超过4个汉字时(16*16),右边屏的汉字同时会在左屏显示,而且把
左屏原来的汉字覆盖了。 [keilc51] [2次] 01-9-11 上午 09:33:01

以下是我的主程序,再请大虾帮我看一下: [keilc51] [18次] 01-9-12 上午 10:18:37
void main()
{
uint j;
LcdIni(); //reset
clrscr(); //
for(j=0;j<6;j++)
DrawBmp(16*j,0,16,table+32*j); //table为字模表格首址,显示六个汉字
while (1);
}


点击这里回复这篇贴子>>
_____________________________________________________________________________
Copyright?,C51BBS论坛 2000-2001



我公司用新的才50RMB [独孤九剑] [25次] 01-11-14 上午 11:30:01

是啊,那些人简直就是抢钱!!我宁愿等他们降下来再说。 [傲气雄鹰] [22次] 01-11-14
下午 12:57:53

加入R/W控制脚的改进的信利12232基本驱动程序 [mikewolf] [85次] 01-12-18 17:40:57
非常感谢龙斑,使我在对TRULY12232编程时用了很短的时间就搞定了!!!!!!!!!

/*
*====================================================================
* 以下是TRULY12232控制程序
*/
#define lcd_E1 p23 /*液晶主窗口选择端口*/
#define lcd_E2 p22 /*液晶从窗口选择端口*/
#define lcd_RW p21 /*液晶读写控制 */
#define lcd_A0 p20 /*液晶数据或寄存器 */
#define lcd_DATA P0 /*8位数据口 */

/* 发命令i到主窗口*/

void lcd_MC(uchar i)
{
lcd_E1=1;
lcd_A0=0;
lcd_RW=0;
lcd_DATA=i;
lcd_E1=0;
}

/* 写数据i到主窗口*/

void lcd_MD(uchar i)
{
lcd_E1=1;
lcd_A0=1;
lcd_RW=0;
lcd_DATA=i;
lcd_E1=0;
}

/* 读主窗口状态*/

uchar lcd_MRE(void)
{
uchar i;
lcd_E1=1;
lcd_A0=0;
lcd_RW=1;
i=lcd_DATA;
lcd_E1=0;
return(i);
}

/* 读主窗口数据*/

uchar lcd_MRD(void)
{
uchar i;
lcd_E1=1;
lcd_A0=1;
lcd_RW=1;
i=lcd_DATA;
lcd_E1=0;
return(i);
}


/* 发命令i到从窗口*/

void lcd_SC(uchar i)
{
lcd_E2=1;
lcd_A0=0;
lcd_RW=0;
lcd_DATA=i;
lcd_E2=0;
}

/* 写数据i到从窗口*/

void lcd_SD(uchar i)
{
lcd_E2=1;
lcd_A0=1;
lcd_RW=0;
lcd_DATA=i;
lcd_E2=0;
}

/* 读从窗口状态*/

uchar lcd_SRE(void)
{
uchar i;
lcd_E2=1;
lcd_A0=0;
lcd_RW=1;
i=lcd_DATA;
lcd_E2=0;
return(i);
}

/* 读从窗口数据*/

uchar lcd_SRD(void)
{
uchar i;
lcd_E2=1;
lcd_A0=1;
lcd_RW=1;
i=lcd_DATA;
lcd_E2=0;
return(i);
}


/* 清屏 */

void lcd_clear(void)
{
uchar i;
uchar page;
for (page=0;page<4;page++)
{
lcd_MC(0xB8|page); /*设置显示页面*/
lcd_SC(0xB8|page);
lcd_MC(0&0x7F); /*设置列地址*/
lcd_SC(0&0x7F);
for (i=0;i<61;i++)
{
lcd_SD(0);
lcd_MD(0);
}
}
}

/* 画一个图,横座标是X,layer表示上下层,width是图形的宽,高都是16,bmp是图形
指针 */
/* 使用zimo21软件,采用纵向取模得到bmp数据 */

void lcd_DrawBmp(uchar x0,bit layer,uchar width,uchar *bmp)
{
uchar x,address,i=0;
/* address表示显存的物理地址 */
uchar page=2;
bit window=0;
/* page 表示上下两页,windows表示左右两页 */
if (layer) page=0;

for (x=x0;x<x0+width;x++)
{
if (x>60)
{
window=1;
address=x%61;
}
else
address=x;
/*同时设置主从显示页为0-3页*/
lcd_MC(0xB8|page);
lcd_SC(0xB8|page);
/*同时设置主从列地址为0-121*/
lcd_MC(address&0x7F);
lcd_SC(address&0x7F);

if (window) lcd_SD(bmp[i]);
else lcd_MD(bmp[i]); /* 画上层 */
lcd_MC(0xB8|(page+1));
lcd_SC(0xB8|(page+1));
lcd_MC(address&0x7F);
lcd_SC(address&0x7F);

if (window) lcd_SD(bmp[i+width]);
else lcd_MD(bmp[i+width]); /* 画下层 */

i++;
}
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值