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

📄 12232.c

📁 12232的一个显示汉字的C语言程序
💻 C
字号:
/*-----------------------------------------------------------------*/
/*LCD12232液晶显示驱动实验.                                        */
/*E1:主驱动器使能信号,写操作时低电平有效,读操作时高电平有效,负电压.*/
/*E2:从驱动器使能信号,写操作时低电平有效,读操作时高电平有效.       */
/*RW:读写选择信号,低电平时写,高电平时读.                           */
/*A0:寄存器选择信号.                                               */     
/*各个引脚对应的接线关系如下所示:                                  */                                  
/*          |DB0-----P1.0 | DB4-----P1.4 | E1-------P2.0 |         */
/*          |DB1-----P1.1 | DB5-----P1.5 | E2-------P2.1 |         */
/*          |DB2-----P1.2 | DB6-----P1.6 | RW-------P2.2 |         */
/*          |DB3-----P1.3 | DB7-----P1.7 | A0-------P2.3 |         */  
/*-----------------------------------------------------------------*/

#include<STC89C51.H>
#include <stdlib.h>
#include <intrins.h>
#include <string.h>

sbit  E1=P2^0;  /* 定义P2.0端口为E1 */
sbit  E2=P2^1;  /* 定义P2.1端口为E2 */
sbit  RW=P2^2;  /* 定义P2.2端口为RW */
sbit  A0=P2^3;  /* 定义P2.3端口为RS */

void delay(char k);  /* 延时子程序 */
void lcdinitial(void);  /* 初始化子程序 */
void clrram(void);  /* 复位子程序 */
void writeMI(unsigned char i);  /* 主驱动器发指令 */
void writeSI(unsigned char i);  /* 从驱动器发指令 */
void writeMD(unsigned char i);  /* 主驱动器发数据 */
void writeSD(unsigned char i);  /* 从驱动器发数据 */
void SetPage(unsigned char page1,page2);  /* 设置页地址 */
void display(unsigned char word,unsigned char layer,unsigned char width,unsigned char code *array);
unsigned char code arrayadress1[];  /* 定义数组arrayadress1 */
unsigned char code arrayadress2[];  /* 定义数组arrayadress2 */
unsigned char code arrayadress3[];  /* 定义数组arrayadress3 */
unsigned char code arrayadress4[];  /* 定义数组arrayadress4 */

/*-----------------主函数-----------------*/
void main(void)
{
 delay(10);  /* 延时子程序 */
 lcdinitial();  /* 初始化子程序 */ 
 delay(10);  /* 延时子程序 */
 while(1)
   {
    delay(400);  /* 延时子程序 */
    clrram();  /* 复位子程序(清屏子程序) */
    display(6,0,12,arrayadress1);
    //display(6,1,96,arrayadress1+16);              
    //display(5,2,80,arrayadress2);
    //display(5,3,80,arrayadress2+16);
    //delay(400);  /* 延时子程序 */
    //clrram();  /* 复位子程序(清屏子程序) */
    //display(6,0,96,arrayadress3);
    //display(6,1,96,arrayadress3+16);
    //display(5,2,114,arrayadress4);
    //display(5,3,114,arrayadress4+16);
    //delay(400);  /* 延时子程序 */
   }
}

/* 初始化子程序 */
void lcdinitial(void)			
{
 writeMI(0xE2);
 writeSI(0xE2);  /* 复位指令 */
 /****************************/
 writeMI(0xAE);
 writeSI(0xAE);  /* 关闭显示工作状态 */
 /****************************/
 writeMI(0xA4);
 writeSI(0xA4);  /* 关闭休闲工作状态 */ /* 此指令要在设置显示开关指令以后才能使用 */
 /****************************/
 writeMI(0xA9);
 writeSI(0xA9);  /* 占空比1/32时为0xA9,占空比1/16时为0xA8 */ 
 /****************************/
 writeMI(0xA0);
 writeSI(0xA0);  /* 正向排序设置 */
 /****************************/
 writeMI(0xEE);
 writeSI(0xEE);  /* 结束指令改写方式 */
 /****************************/
 writeMI(0x00);
 writeMI(0xC0);  /* 设置主控制器显示起始行为第一行 */
 writeSI(0x00);
 writeSI(0xC0);  /* 设置从控制器显示起始行为第一行 */
 /****************************/
 writeMI(0xAF);
 writeSI(0xAF);  /* 开启显示工作状态 */               
}
/*******************以下函数是对内部函数进行的写指令的控制*******************/
/* 主驱动器发指令函数writMI(unsigned char i)是内部函数,从i发指令 */
void writeMI(unsigned char i)
{
 do 
  {
   E1=0;
   E2=0; 
   A0=0;
   RW=1;
   E1=1;
   _nop_();
  }   /* 判断主控制器忙 */
 while(P1&0x80);  /* 当P1端口为0x80时表示处于忙状态,此时不能进行其他操作 */
 E1=0;
 RW=0;
 A0=0;
 E1=1;
 _nop_();
 P1=i;
 _nop_();
 E1=0;/* 低电平时发指令 */
} 

/* 从驱动器发指令函数writSI(unsigned char i)是内部函数,从i发指令 */
void writeSI(unsigned char i)
{
 do
  {
   E1=0;
   E2=0;
   A0=0;
   RW=1; 
   E2=1;
   _nop_();             
  }   /* 判断从控制器忙 */
 while(P1&0x80);  /* 当P1端口为0x80时表示处于忙状态,此时不能进行其他操作 */                  
 E2=0;
 RW=0; 
 A0=0; 
 E2=1;
 _nop_();
 P1=i; 
 _nop_();
 E2=0;  /* 低电平时发指令 */
}
/****************************************************************************/

/* 复位子程序(清屏子程序) */
void clrram(void)                       
{
 unsigned char  line;
 unsigned char  page;
 for(page=0;page<4;page++)  /* 页面选择,page为0时为第0页,page为1时为第1页,page为2时为第2页,page为3时为第3页 */
    {
     SetPage(page,page);  /* 设置页面地址 */
     writeMI(0x00);  /* 主驱动器发指令函数 */  /* 设置主窗口显示地址 */              
     writeSI(0x00);  /* 从驱动器发指令函数 */  /* 设置从窗口显示地址 */
     for(line=0;line<62;line++)
        { 
		 writeMD(0x00);  /* 主驱动器发数据函数 */             
         writeSD(0x00);  /* 从驱动器发数据函数 */
		}
    }
}

/* 设置页地址 */
void SetPage(unsigned char page1,page2)
{  
 writeMI(0xB8|page1);  /* 设置主窗口页面地址 */                   
 writeSI(0xB8|page2);  /* 设置从窗口页面地址 */
}

/*******************以下函数是对内部函数进行的发数据的控制*******************/
/* 主驱动器发数据函数writMD(unsigned char i)是内部函数,从i发数据 */
void  writeMD(unsigned char i)
{  
 do
  {
   E1=0;
   E2=0;
   A0=0; 
   RW=1;
   E1=1;
   _nop_();  
  }  /* 判断主控制器忙 */
 while(P1&0x80);  /* 当P1端口为0x80时表示处于忙状态,此时不能进行其他操作 */ 
 E1=0;
 RW=0;
 A0=1;
 E1=1;
 _nop_();
 P1=i;
 _nop_();
 E1=0;  /* 低电平时发指令 */
}

/* 从驱动器发数据函数writiSD(unsigned char i)是内部函数,从i发数据 */
void  writeSD(unsigned char i)
{  
 do
  {
   E1=0;
   E2=0;
   A0=0;
   RW=1; 
   E1=1; 
   _nop_();
  }  /* 判断从控制器忙 */
 while(P1&0x80);  /* 当P1端口为0x80时表示处于忙状态,此时不能进行其他操作 */ 
 E2=0;
 RW=0;
 A0=1;
 E2=1;
 _nop_();
 P1=i;
 _nop_();
 E2=0;  /* 低电平时发指令 */
}  
/****************************************************************************/
//display(6,0,96,arrayadress1);
void display(unsigned char word,unsigned char  layer, unsigned char width,unsigned char code *array)
{
 unsigned char  x;
 unsigned char  k=16 ;    
 unsigned char  address;  /* address表示显存的物理地址 */
 unsigned char  p=0;     	   
 unsigned char  page;  /* page表示页地址 */
 if(layer==0)  
   {
    page=0;
   }
 if(layer==1)
   {
    page=1;
   }
 if(layer==2)
   {
    page=2;
   }
 if(layer==3)
   {
    page=3;
   }  /* 通过四个if语句可以确定page表示页地址的值 */ 
 
 address=61-(word*16)/2;  /* 确定address表示显存的物理地址的值 */  
 writeMI(0xB8|page);  /* 主控制器发页地址 */
 writeMI(address);  /* 主控制器发窗口地址 */
 for(x=0;x<=width/2;x++)
	{	 
	 if(k--)
       {
	    writeMD(array[p]);  /* 左-上层数据输出 */
        p++;
	   }
	 else 
	   {
	    k=16;
		p=p+16;
	   }  
    }
 for(x=0;x<=width/2;x++)
	{	 
	 if(k--)
       {
	    writeMD(array[p+16]);  /* 左-下层数据输出 */
        p++;
	   }
	 else 
	   {
	    k=16;
		p=p+32;
	   }  
    }
// writeSI(0xB8|page);  /* 从控制器发页地址 */
 //writeSI();  /* 从控制器发窗口地址 */
 //for(x=0;x<=width/2;x++)
//	{ 
//	 if(k--)
  //     { 
//	    writeSD(array[p]);  /* 右-上层数据输出 */        
   //     p++;
//	   }
   //  else 
	//   {
//	    k=16;
//		p=p+16;
//	   }
  //  }
 //for(x=0;x<=width/2;x++)
//	{ 
//	 if(k--)
   //    { 
	 //   writeSD(array[p+16]);  /* 右-下层数据输出 */        
    //    p++;
	//   }
    // else 
	//   {
	 //   k=16;
	//	p=p+32;
	//   }
   // }      
       
}
/* 延时子程序 */
void delay(char k)
{
 unsigned int i,j,s;
 for(s=0;s<k;s++)
    {
    for(i=0;i<=100;i++)
       {
        for(j=0;j<=100;j++);
       }
    }
}
   
unsigned char code arrayadress1[]={
/* 点阵:16x16
   提取点阵方向:纵向
   字节掉转:是
   字节方式:C语言 */
0x04,0x34,0xC4,0x04,0xC4,0x3C,0x20,0x10,    // 欢
0x0F,0xE8,0x08,0x08,0x28,0x18,0x00,0x00,
0x10,0x08,0x06,0x01,0x82,0x8C,0x40,0x30,
0x0C,0x03,0x0C,0x10,0x60,0xC0,0x40,0x00,

0x40,0x42,0x44,0xC8,0x00,0xFC,0x04,0x02,    // 迎
0x82,0xFC,0x04,0x04,0x04,0xFE,0x04,0x00,
0x00,0x40,0x20,0x1F,0x20,0x47,0x42,0x41,
0x40,0x7F,0x40,0x42,0x44,0x63,0x20,0x00,

0x40,0x40,0x42,0x44,0x58,0xC0,0x40,0x7F,    // 光
0x40,0xC0,0x50,0x48,0x46,0x64,0x40,0x00,
0x00,0x80,0x40,0x20,0x18,0x07,0x00,0x00,
0x00,0x3F,0x40,0x40,0x40,0x40,0x70,0x00,

0x00,0xFC,0x00,0xFF,0x40,0x20,0x10,0x0C,    // 临
0x2B,0x48,0xC8,0x08,0x08,0x8C,0x08,0x00,
0x00,0x1F,0x00,0xFF,0x00,0xFF,0x41,0x41,
0x41,0x7F,0x41,0x41,0x41,0xFF,0x01,0x00,

0x10,0x10,0x10,0xFF,0x90,0x50,0x00,0x3F,    // 指
0x48,0x48,0x48,0x44,0x46,0xC4,0x70,0x00,
0x02,0x42,0x81,0x7F,0x00,0x00,0x00,0xFF,
0x49,0x49,0x49,0x49,0x49,0xFF,0x01,0x00,

0x00,0x00,0x7E,0x92,0x92,0x92,0x92,0x92,    // 导
0x92,0x92,0x92,0xBF,0x82,0xE0,0x00,0x00,
0x04,0x04,0x04,0x04,0x14,0x24,0x04,0x04,
0x44,0x84,0x7F,0x04,0x04,0x06,0x04,0x00,




};

unsigned char code arrayadress2[]={

/* 点阵:16x16
   提取点阵方向:纵向
   字节掉转:是
   字节方式:C语言 */
0x40,0x60,0x5E,0x48,0x48,0xFF,0x48,0x4C,    // 制
0x68,0x40,0xF8,0x00,0x00,0xFF,0x00,0x00,
0x00,0x00,0x3F,0x01,0x01,0xFF,0x11,0x21,
0x1F,0x00,0x07,0x40,0x80,0x7F,0x00,0x00,

0x80,0x40,0x20,0xF8,0x87,0x40,0x30,0x0F,    // 作
0xF8,0x88,0x88,0xC8,0x88,0x0C,0x08,0x00,
0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,
0xFF,0x08,0x08,0x08,0x0C,0x08,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x7F,    // 人
0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,
0x03,0x0C,0x10,0x20,0x40,0xC0,0x40,0x00,

0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,0x80,    // :
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x31,0x7B,0x7B,0x31,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x02,0xE2,0x22,0x22,0x3F,0x82,0x80,0xFF,    // 张
0x80,0xA0,0x90,0x88,0x86,0xC0,0x80,0x00,
0x00,0x43,0x82,0x42,0x3E,0x00,0x00,0xFF,
0x40,0x23,0x0C,0x10,0x20,0x60,0x20,0x00,

0x08,0x08,0x88,0x88,0x88,0x88,0x88,0xFF,    // 志
0x88,0x88,0x88,0xC8,0x88,0x0C,0x08,0x00,
0x20,0x18,0x00,0x3C,0x40,0x40,0x42,0x44,
0x4C,0x40,0x40,0x70,0x00,0x08,0x30,0x00,

0x40,0x20,0x38,0xE7,0x24,0x24,0x24,0x10,    // 铭
0x1C,0xA7,0x44,0x24,0x14,0x0C,0x00,0x00,
0x00,0x01,0x01,0x7F,0x21,0x11,0x04,0x02,
0xFF,0x42,0x42,0x42,0x42,0xFF,0x02,0x00,




};

unsigned char code arrayadress3[]={
 /* 点阵:16x16
   提取点阵方向:纵向
   字节掉转:是
   字节方式:C语言   */
0x10,0x22,0x64,0x0C,0x80,0x04,0xC4,0x34,    // 液
0x05,0xC6,0xBC,0x24,0x24,0xE6,0x04,0x00,
0x04,0x04,0xFE,0x01,0x02,0x01,0xFF,0x42,
0x21,0x16,0x08,0x15,0x23,0x60,0x20,0x00,

0x00,0x00,0x00,0x00,0xFF,0x49,0x49,0x49,    // 晶
0x49,0x49,0xFF,0x00,0x00,0x80,0x00,0x00,
0x00,0xFF,0x49,0x49,0x49,0x49,0xFF,0x00,
0xFF,0x49,0x49,0x49,0x49,0xFF,0x01,0x00,

0x00,0x00,0x00,0xFE,0x92,0x92,0x92,0x92,    // 显
0x92,0x92,0x92,0xFF,0x02,0x00,0x00,0x00,
0x40,0x42,0x44,0x4D,0x40,0x7F,0x40,0x40,
0x40,0x7F,0x40,0x49,0x44,0x66,0x40,0x00,

0x40,0x40,0x42,0x42,0x42,0x42,0x42,0xC2,    // 示
0x42,0x42,0x42,0x43,0x42,0x60,0x40,0x00,
0x00,0x10,0x08,0x04,0x06,0x40,0x80,0x7F,
0x00,0x00,0x02,0x04,0x0C,0x18,0x00,0x00,

0x10,0x0C,0x04,0x44,0x8C,0x94,0x35,0x06,    // 实
0xF4,0x04,0x04,0x04,0x04,0x14,0x0C,0x00,
0x02,0x82,0x82,0x42,0x42,0x23,0x12,0x0E,
0x03,0x0A,0x12,0x22,0x42,0xC3,0x02,0x00,

0x02,0xFA,0x02,0x02,0xFF,0x42,0x20,0x50,    // 验
0x4C,0x43,0x4C,0x50,0x20,0x60,0x20,0x00,
0x10,0x31,0x11,0x49,0x89,0x7F,0x42,0x5C,
0x40,0x4F,0x60,0x58,0x47,0x60,0x40,0x00,

};

unsigned char code arrayadress4[]={
/* 点阵:16x16
   提取点阵方向:纵向
   字节掉转:是
   字节方式:C语 */      
0x00,0x40,0x42,0x42,0x42,0x42,0xFE,0x42,    // 无
0xC2,0x42,0x43,0x42,0x60,0x40,0x00,0x00,
0x00,0x80,0x40,0x20,0x18,0x06,0x01,0x00,
0x3F,0x40,0x40,0x40,0x40,0x40,0x70,0x00,

0x00,0x20,0x30,0xAC,0x63,0x20,0x30,0x20,    // 线
0x20,0xFF,0x90,0x92,0x94,0xD0,0x80,0x00,
0x20,0x62,0x23,0x12,0x12,0x12,0x41,0x41,
0x21,0x17,0x18,0x24,0x42,0x80,0xE0,0x00,

0x00,0xF8,0x48,0x48,0x48,0x48,0xFF,0x48,    // 电
0x48,0x48,0x48,0xFC,0x08,0x00,0x00,0x00,
0x00,0x07,0x02,0x02,0x02,0x02,0x3F,0x42,
0x42,0x42,0x42,0x47,0x40,0x70,0x00,0x00,

0x10,0x10,0xFF,0x10,0x10,0x80,0x10,0x10,    // 协
0xFF,0x10,0x10,0x10,0xF8,0x90,0x00,0x00,
0x00,0x00,0xFF,0x00,0x04,0x43,0x20,0x1C,
0x03,0x00,0x40,0x80,0x7F,0x00,0x03,0x00,

0x80,0x80,0x40,0x20,0x50,0x48,0x44,0x43,    // 会
0x44,0x48,0x50,0x20,0x40,0xC0,0x40,0x00,
0x00,0x00,0x02,0x42,0x62,0x52,0x4E,0x42,
0x42,0x52,0x62,0xC3,0x02,0x00,0x00,0x00,

};







⌨️ 快捷键说明

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