⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd240.c

📁 240*128点阵液晶(6963)驱动程序,经过测试过非常好用
💻 C
字号:
#include        <reg52.h>
#include        <absacc.h>
#include        <intrins.h>
#include	<hzk.h>

#define lcd_data          XBYTE[0x0000]   /*液晶显示数据入口*/
#define lcd_com           XBYTE[0x8000]   /*液晶显示命令入口*/

bdata unsigned char flag;
sbit f_bw=flag^0;

/*******************************************************************/
/*检查是否可以操作液晶*/
void lcd_ready(void)
{
idata unsigned char l_status=0;
while(l_status!=3)
    {
    l_status=lcd_com;
    l_status=l_status&0x03;
    }
}

/***********************************************/
/*液晶全屏清除程序*/
void lcd_clr(void)
{
data unsigned char l_adr,h_adr;
data unsigned int i;
l_adr=0;
h_adr=0;
lcd_ready();lcd_com=0x90;      /*关闭显示*/

lcd_ready();lcd_com=0xc0;      /*数据写,地址加1*/

lcd_ready();lcd_com=0xb0;      /* 采用自动写方式 */

lcd_ready();lcd_data=l_adr;

lcd_ready();lcd_data=h_adr;

lcd_ready();lcd_com=0x24;      /*地址设置*/

for (i=0;i<8192;i++)
    {
    lcd_ready();
    lcd_data=0x00;
    lcd_ready();
    lcd_com=0xc4 ;              /*写入一个数据*/
    }

lcd_ready();lcd_com=0xb2;       /* 不采用自动方式 */

lcd_ready();lcd_com=0xc4;       /*数据写,地址不变*/

lcd_ready();lcd_com=0x98;       /*打开显示*/
}


/***********************************************/
/*液晶初始化*/
void lcd_init(void)
{
lcd_ready();lcd_com=0x90;      /*关闭显示*/
lcd_ready();lcd_data=0;
lcd_ready();lcd_data=0;
lcd_ready();lcd_com=0x40;      /*  文本区首址为 0000  */

lcd_ready();lcd_data=0;
lcd_ready();lcd_data=0;
lcd_ready();lcd_com=0x42;      /*  图形区首址为 0000  */

lcd_ready();lcd_data=30;
lcd_ready();lcd_data=0;
lcd_ready();lcd_com=0x41;      /*  文本区域设置  30字节每行*/

lcd_ready();lcd_data=30;
lcd_ready();lcd_data=0;
lcd_ready();lcd_com=0x43;      /*  图形区域设置  30字节每行  */

lcd_ready();lcd_com=0x80;      /* or显示方式 */

lcd_clr();

lcd_ready();lcd_com=0xb2;      /* 不采用自动方式 */

lcd_ready();lcd_com=0xc4;      /*数据写,地址不变*/

lcd_ready();lcd_com=0x98;      /*打开显示*/
}


/* 8 x 16 汉字字符显示程序 */
void lcd_showa(unsigned char x,unsigned char y,unsigned char arr[])
{
/*参数x为显示汉字的横向地址 最大值29 (0--29)
  参数y为显示汉字的纵向地址 最大值127 (0--127)
  参数arr[]为显示数据表名称       */
data unsigned int adr_pt;  /*液晶显示地址指针,用于确定显示位置*/
data unsigned char hz_pt;  /*汉字短语内部寻址指针*/
data unsigned int  hzk_pt;  /*汉字库寻址指针,用于在汉字库中提取数据*/
data unsigned char j;
data unsigned char  l_adr; /* 液晶显示RAM地址低位 */
data unsigned char  h_adr; /* 液晶显示RAM地址高位 */


	hz_pt=0;	/*第一个数据*/
	adr_pt=30*y+x;  /*确定显示首址*/

        while (arr[hz_pt]!=0xff)  /*短语结束标志为0xff*/
        {
        l_adr=adr_pt%256;
        h_adr=(adr_pt-l_adr)/256;  /*计算显示RAM地址*/

        hzk_pt=arr[hz_pt]*16;     /*计算显示字符的起始地址*/

		for (j=0;j<16;j++)
		{
			lcd_ready();
			lcd_data=l_adr;
			lcd_ready();
			lcd_data=h_adr;
			lcd_ready();
			lcd_com=0x24; /*地址设置*/

                        if (f_bw)	/*反向显示*/
                        { lcd_ready();  
                          lcd_data=~hzk0816[hzk_pt]; 
                        }
                        else
                        { lcd_ready();  
                          lcd_data=hzk0816[hzk_pt];  
                        }
                       	lcd_ready();
			lcd_com=0xc4; /*写入一个数据*/

                        hzk_pt++;    /*汉字库寻址指针加1*/

                        l_adr=l_adr+30;
                        if(l_adr<30) h_adr++;
		}
         adr_pt=adr_pt+1;
         hz_pt++;  /*短语内部指针加1,显示下一个字符*/
	}
        f_bw=0;

}


/* 8 x 16 , 16 x 16汉字字符显示程序 */
void lcd_showb(unsigned char x,unsigned char y,unsigned char arr[])
{
/*参数x为显示汉字的横向地址 最大值29 (0--29)
  参数y为显示汉字的纵向地址 最大值127 (0--127)
  参数arr[]为显示数据表名称       */
idata unsigned int adr_pt;  /*液晶显示地址指针,用于确定显示位置*/
idata unsigned char hz_pt;  /*汉字短语内部寻址指针*/
idata unsigned int hzk_pt; /*ASCII寻址指针,用于在字库中提取数据*/
/*idata unsigned int hzk2_pt; /*汉字库寻址指针,用于在字库中提取数据*/
idata unsigned char j;
idata unsigned char  l_adr; /* 液晶显示地址低位 */
idata unsigned char  h_adr; /* 液晶显示地址高位 */


	hz_pt=0;
	adr_pt=30*y+x;  /*确定显示首址*/

        while (arr[hz_pt]!=0xff)  /*短语结束标志为0xff*/
        {
        l_adr=adr_pt%256;
        h_adr=(adr_pt-l_adr)/256; /*计算显示位置的低位,高位地址*/

       /* 本次采用8X16 16X16 两种字库,一个索引的方法处理*/
       /* 短语中,遇到254,则表明下一个字符从16X8字库中取出*/
       /* 短语由0XFF结束*/
       		if (arr[hz_pt]==254)
       		{
       		    hz_pt++;
       		    hzk_pt=arr[hz_pt]*16;/*计算显示字符的起始地址*/

       		    		for (j=0;j<16;j++)
				{
	   			  lcd_ready();
				  lcd_data=l_adr;
	   			  lcd_ready();
				  lcd_data=h_adr;
	   			  lcd_ready();
				  lcd_com=0x24; /*地址设置*/

                       		  if (f_bw)
                       		  {  lcd_ready();
                       		     lcd_data=~hzk0816[hzk_pt]; 
                       		  }
                        	  else
                        	  {  lcd_ready();
                        	     lcd_data=hzk0816[hzk_pt];  
                        	  }
                       		  lcd_ready();
				  lcd_com=0xc4; /*写入一个数据*/
                       		  hzk_pt++;    /*汉字库寻址指针加1*/
                                  l_adr=l_adr+30;
                                  if(l_adr<30) h_adr++;
				}
       			adr_pt=adr_pt+1;
         		hz_pt++;  /*短语内部指针加1,显示下一个字符*/
       		}
       		else
       		{
        		hzk_pt=arr[hz_pt]*32;     /*计算显示字符的起始地址*/

			for (j=0;j<16;j++)
			{
     			        lcd_ready();
				lcd_data=l_adr;
     			        lcd_ready();
				lcd_data=h_adr;
     			        lcd_ready();
				lcd_com=0x24; /*地址设置*/

                        	if (f_bw)
                        	{  lcd_ready();  lcd_data=~hzk1616[hzk_pt]; }
                        	else
                        	{  lcd_ready();   lcd_data=hzk1616[hzk_pt];  }

                       		lcd_ready();
				lcd_com=0xc0; /*写入一个数据*/

                        	hzk_pt++;    /*汉字库寻址指针加1*/

                        	if (f_bw)
                        	{  lcd_ready();   lcd_data=~hzk1616[hzk_pt]; }
                        	else
                        	{  lcd_ready(();  lcd_data=hzk1616[hzk_pt];  }

				lcd_ready();
				lcd_com=0xc0;

                        	hzk_pt++;    /*汉字库寻址指针加1*/

                                l_adr=l_adr+30;
                                if(l_adr<30) h_adr++;

			}
         	adr_pt=adr_pt+2;
         	hz_pt++;  /*短语内部指针加1,显示下一个字符*/
         	}
	}
        f_bw=0;
}


/* 24 x 24汉字字符显示程序 */
void lcd_showc(unsigned char x,unsigned char y,unsigned char arr[])
{
/*参数x为显示汉字的横向地址 最大值29 (0--29)
  参数y为显示汉字的纵向地址 最大值127 (0--127)
  参数arr[]为显示数据表名称       */
idata unsigned int adr_pt;  /*液晶显示地址指针,用于确定显示位置*/
idata unsigned char hz_pt;  /*汉字短语内部寻址指针*/
idata unsigned int hzk_pt; /*ASCII寻址指针,用于在字库中提取数据*/
/*idata unsigned int hzk2_pt; /*汉字库寻址指针,用于在字库中提取数据*/
idata unsigned char j;
idata unsigned char  l_adr; /* 液晶显示地址低位 */
idata unsigned char  h_adr; /* 液晶显示地址高位 */


	hz_pt=0;
	adr_pt=30*y+x;  /*确定显示首址*/

        while (arr[hz_pt]!=0xff)  /*短语结束标志为0xff*/
        {
        l_adr=adr_pt%256;
        h_adr=(adr_pt-l_adr)/256; /*计算显示位置的低位,高位地址*/

	hzk_pt=arr[hz_pt]*72;     /*计算显示字符的起始地址*/

	for (j=0;j<24;j++)
	{
	        lcd_ready();
		lcd_data=l_adr;
	        lcd_ready();
		lcd_data=h_adr;
	        lcd_ready();
		lcd_com=0x24; /*地址设置*/

        	if (f_bw)
        	{  lcd_ready();  lcd_data=~hzk2424[hzk_pt]; }
        	else
        	{  lcd_ready();   lcd_data=hzk2424[hzk_pt];  }

       		lcd_ready();
		lcd_com=0xc0; /*写入一个数据*/

        	hzk_pt++;    /*汉字库寻址指针加1*/

        	if (f_bw)
        	{  lcd_ready();   lcd_data=~hzk2424[hzk_pt]; }
        	else
        	{  lcd_ready(();  lcd_data=hzk2424[hzk_pt];  }

		lcd_ready();
		lcd_com=0xc0;

        	hzk_pt++;    /*汉字库寻址指针加1*/

        	if (f_bw)
        	{  lcd_ready();   lcd_data=~hzk2424[hzk_pt]; }
        	else
        	{  lcd_ready(();  lcd_data=hzk2424[hzk_pt];  }

		lcd_ready();
		lcd_com=0xc0;

        	hzk_pt++;    /*汉字库寻址指针加1*/

                l_adr=l_adr+30;
                if(l_adr<30) h_adr++;

         	adr_pt=adr_pt+2;
         	hz_pt++;  /*短语内部指针加1,显示下一个字符*/
         	}
	}
        f_bw=0;
}

/* 32 x 32汉字字符显示程序 */
void lcd_showd(unsigned char x,unsigned char y,unsigned char arr[])
{
/*参数x为显示汉字的横向地址 最大值29 (0--29)
  参数y为显示汉字的纵向地址 最大值127 (0--127)
  参数arr[]为显示数据表名称       */
idata unsigned int adr_pt;  /*液晶显示地址指针,用于确定显示位置*/
idata unsigned char hz_pt;  /*汉字短语内部寻址指针*/
idata unsigned int hzk_pt; /*ASCII寻址指针,用于在字库中提取数据*/
/*idata unsigned int hzk2_pt; /*汉字库寻址指针,用于在字库中提取数据*/
idata unsigned char j;
idata unsigned char  l_adr; /* 液晶显示地址低位 */
idata unsigned char  h_adr; /* 液晶显示地址高位 */


	hz_pt=0;
	adr_pt=30*y+x;  /*确定显示首址*/

        while (arr[hz_pt]!=0xff)  /*短语结束标志为0xff*/
        {
        l_adr=adr_pt%256;
        h_adr=(adr_pt-l_adr)/256; /*计算显示位置的低位,高位地址*/

	hzk_pt=arr[hz_pt]*128;     /*计算显示字符的起始地址*/

	for (j=0;j<32;j++)
	{
	        lcd_ready();
		lcd_data=l_adr;
	        lcd_ready();
		lcd_data=h_adr;
	        lcd_ready();
		lcd_com=0x24; /*地址设置*/

        	if (f_bw)
        	{  lcd_ready();  lcd_data=~hzk3232[hzk_pt]; }
        	else
        	{  lcd_ready();   lcd_data=hzk3232[hzk_pt];  }

       		lcd_ready();
		lcd_com=0xc0; /*写入一个数据*/

        	hzk_pt++;    /*汉字库寻址指针加1*/

        	if (f_bw)
        	{  lcd_ready();   lcd_data=~hzk3232[hzk_pt]; }
        	else
        	{  lcd_ready(();  lcd_data=hzk3232[hzk_pt];  }

		lcd_ready();
		lcd_com=0xc0;

        	hzk_pt++;    /*汉字库寻址指针加1*/

        	if (f_bw)
        	{  lcd_ready();   lcd_data=~hzk3232[hzk_pt]; }
        	else
        	{  lcd_ready(();  lcd_data=hzk3232[hzk_pt];  }

		lcd_ready();
		lcd_com=0xc0;

        	hzk_pt++;    /*汉字库寻址指针加1*/

        	if (f_bw)
        	{  lcd_ready();   lcd_data=~hzk3232[hzk_pt]; }
        	else
        	{  lcd_ready(();  lcd_data=hzk3232[hzk_pt];  }

		lcd_ready();
		lcd_com=0xc0;

        	hzk_pt++;    /*汉字库寻址指针加1*/

                l_adr=l_adr+30;
                if(l_adr<30) h_adr++;

         	adr_pt=adr_pt+2;
         	hz_pt++;  /*短语内部指针加1,显示下一个字符*/
         	}
	}
        f_bw=0;
}


main()
{ unsigned char p[]={0,254,1,2,3,255};
  unsigned int i;
  lcd_init();

  while(1)
  {
     lcd_showb(1,1,p);
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -