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

📄 lcd12232先上后下送数据功能完成.txt

📁 基于89s52单片机控制的液晶显示程序
💻 TXT
字号:
/******************************************
基本功能:练习LCD12232的静态显示,实现显示
多个汉字的功能。

     Author:           CHANG  MING
     Create Time:      2009/3/7


*****************************************/
#include<reg51.h>
#include<intrins.h>

sbit LCD_A0 = P3^4;
sbit LCD_RW = P3^3;
sbit LCD_E1 = P2^0;
sbit LCD_E2 = P2^1;
sbit LCD_RST= P3^0;
#define DATA  P1

#define  N          10
unsigned char code strru[]={
0x10,0x61,0x06,0xE0,0x18,0x84,0xE4,0x1C,0x84,0x65,0xBE,0x24,0xA4,0x64,0x04,0x00, //1上0

0x00,0x00,0x00,0x00,0x7E,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x7E,0x00,0x00,0x00,0x00, //2上0

0x00,0x00,0x00,0x3E,0x2A,0xEA,0x2A,0x2A,0x2A,0xEA,0x2A,0x3E,0x00,0x00,0x00,0x00, //3上0

0x00,0x20,0x20,0x22,0x22,0x22,0x22,0xE2,0x22,0x22,0x22,0x22,0x22,0x20,0x20,0x00, //4上0

0x00,0x00,0xFF,0x09,0x49,0x59,0xE9,0x49,0x49,0x49,0xE9,0x59,0x49,0x4F,0x00,0x00, //5上0

0x00,0x00,0x00,0x3E,0x2A,0xEA,0x2A,0x2A,0x2A,0xEA,0x2A,0x3E,0x00,0x00,0x00,0x00, //6上0

0x00,0x20,0x20,0x22,0x22,0x22,0x22,0xE2,0x22,0x22,0x22,0x22,0x22,0x20,0x20,0x00, //7上0

0x00,0x10,0x0C,0x24,0x24,0x24,0x25,0x26,0xA4,0x64,0x24,0x04,0x14,0x0C,0x00,0x00, //8上2

0x10,0x0C,0x03,0xC2,0x36,0x4A,0x42,0x52,0x48,0x47,0x42,0xF6,0x4A,0x42,0x42,0x00, //9上2

0x20,0x30,0xAE,0x64,0x30,0x00,0x04,0x24,0xE4,0x3F,0x24,0xE4,0x04,0x04,0x00,0x00, //10上2

};
unsigned char code strrd[]={
0x04,0x04,0xFF,0x00,0x01,0x00,0xFF,0x41,0x21,0x12,0x0C,0x1B,0x61,0xC0,0x40,0x00, //1下1

0x00,0x7F,0x25,0x25,0x25,0x25,0x7F,0x00,0x00,0x7F,0x25,0x25,0x25,0x25,0x7F,0x00, //2下1

0x20,0x21,0x22,0x2C,0x20,0x3F,0x20,0x20,0x20,0x3F,0x28,0x24,0x23,0x20,0x20,0x00, //3下1

0x10,0x08,0x04,0x03,0x00,0x40,0x80,0x7F,0x00,0x00,0x01,0x02,0x0C,0x18,0x00,0x00, //4下1

0x40,0x30,0x0F,0x82,0x42,0x32,0x0F,0x02,0x02,0x02,0xFF,0x02,0x02,0x02,0x02,0x00, //5下1

0x20,0x21,0x22,0x2C,0x20,0x3F,0x20,0x20,0x20,0x3F,0x28,0x24,0x23,0x20,0x20,0x00, //6下1

0x10,0x08,0x04,0x03,0x00,0x40,0x80,0x7F,0x00,0x00,0x01,0x02,0x0C,0x18,0x00,0x00, //7下1

0x00,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00, //8下3

0x04,0x02,0x01,0xFF,0x00,0x00,0x01,0x06,0x0C,0x40,0x80,0x7F,0x00,0x00,0x00,0x00, //9下3

0x22,0x23,0x22,0x12,0x12,0x00,0x20,0x11,0x0D,0x41,0x81,0x7F,0x01,0x09,0x31,0x00,//10下3

};

//延时程序*******************************
void delay(unsigned int process_i)
{    unsigned int part_i;
     for(;process_i>0;process_i--)
     for(part_i=0;part_i<124;part_i++)
     ;
}

//判断是E1否处于忙状态********************
unsigned char LCD_busye1(void)
{   
    unsigned char   result;
    DATA=0xff;
    LCD_A0 = 0;
    LCD_RW = 1;
    LCD_E1 = 1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    result = DATA & 0x80;
    LCD_E1 = 0;		   //很重要,读完数据后将E电平拉低
    return result;
}  

//判断是E2否处于忙状态********************
unsigned char LCD_busye2(void)  
{
    unsigned char  result;
    DATA=0xff;
    LCD_A0 = 0;
    LCD_RW = 1;
    LCD_E2 = 1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    result = DATA & 0x80;
    LCD_E2 = 0;
 	return result;
}

//写数据*******************************
void LCD_writedata(unsigned char process_i,unsigned char process_data)
{
    while(LCD_busye1());		//忙判断
    while(LCD_busye2()!=0x00);

    if(process_i==1)
     {
     LCD_A0 = 1;
     LCD_RW = 0;
     LCD_E1 = 1;
     DATA   = process_data;
     //delay(5);
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     LCD_E1 = 0;
     //delay(5);
      }
    if(process_i==2)
     {
     LCD_A0 = 1;
     LCD_RW = 0;
     DATA   = process_data;
     LCD_E2 = 1;
     _nop_();
     _nop_(); 
	 _nop_();
     _nop_();
     LCD_E2 = 0;
     //delay(5);
     }
}

//写指令*******************************
void LCD_writecommand(unsigned char process_data)
{   
    while(LCD_busye1());	   //忙判断
    while(LCD_busye2()!=0x00);

    LCD_A0 = 0;
    LCD_RW = 0;
    LCD_E1 = 1;
    DATA   = process_data;
    //delay(5);
    _nop_();
    _nop_();
    _nop_();
    _nop_(); 
    LCD_E1 = 0;
    delay(5);

    LCD_A0 = 0;
    LCD_RW = 0;
    LCD_E2 = 1;
    DATA   = process_data;
     //delay(5);
    _nop_();
    _nop_();
    _nop_();
    _nop_(); 
    LCD_E2 = 0;
    delay(5);

}

//端口初始化*********************************
#define LCD_rest      0xe2
#define LCD_on        0xaf
#define LCD_duty      0xa9      //占空比32
#define LCD_drive     0xa4      //驱动
#define LCD_line      0xc0      //起始行
#define LCD_direction 0xa1      //显示方向
#define LCD_page      0xb8      //显示起始页
#define LCD_column    0x00      //显示起始列
#define LCD_end       0xee

void LCD_inite(void)
{
   LCD_writecommand(LCD_rest);
   LCD_writecommand(LCD_on);
   LCD_writecommand(LCD_duty);
   LCD_writecommand(LCD_drive);
   //LCD_writecommand(LCD_line); 
   LCD_writecommand(LCD_direction);
   //LCD_writecommand(LCD_page);
   //LCD_writecommand(LCD_column);
   LCD_writecommand(LCD_end);
}

//main()*************************************

void main(void)
{  
   unsigned char i=0;
   unsigned char flag=0;   //控制上下屏
   unsigned char flag1=0;  //控制左右屏
   unsigned char k=0;	   //控制交界次数


   LCD_inite();  
						   //字符的上半部分
   while(i<N*16)
   {
	 if(i/16/7%2==0)	   //page0、page2选择
	    flag=0;
     else 
        flag=2;

     if(i/16%7>=4)		  //左右屏选择
        flag1=2;
     else
        flag1=1;

	 if(i%16==0 && i/16%7==0)	   //确定字符起始位置
     {
       LCD_writecommand(LCD_page | flag); //起始地址设置
	   LCD_writecommand(LCD_line);
       LCD_writecommand(LCD_column );
	 }

     if(i/16%7==3)				  //交界处字符特殊处理
	 {
       for(;i<=(60+96*k);i++)
	   LCD_writedata(1,strru[i]); //左区有效
       for(;i<=(63+96*k);i++)
	   LCD_writedata(2,strru[i]); //右区有效 
       k++;            
     } 

     LCD_writedata(flag1,strru[i]); 
     i++;

   }
   
   i=0;
   k=0; 
   while(i<N*16)		//写字符的下半部分
   {
	 if(i/16/7%2==0)
	    flag=1;
     else 
        flag=3;

     if(i/16%7>=4)
        flag1=2;
     else
        flag1=1;

	 if(i%16==0 && i/16%7==0)
     {
       LCD_writecommand(LCD_page | flag);
	   LCD_writecommand(LCD_line);
       LCD_writecommand(LCD_column );
	 }

     if(i/16%7==3)
	 {
       for(;i<=(60+96*k);i++)
	   LCD_writedata(1,strrd[i]);
       for(;i<=(63+96*k);i++)
	   LCD_writedata(2,strrd[i]);
       k++;            
     } 

     LCD_writedata(flag1,strrd[i]);
     i++;
     
   }
	
   while(1) ;
}

⌨️ 快捷键说明

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