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

📄 lcd12232.c

📁 自己单片机板c程序
💻 C
字号:
#include <reg51.h>
#include <intrins.h>
//#include <at89x51.h>

sbit LCD_RS=P1^0;//定义引脚
sbit LCD_RW=P1^1;
sbit LCD_E=P1^2;
#define LCD_Data P2
#define Busy    0x80 //用于检测LCD状态字中的Busy标识



void WriteDataLCD(unsigned char WDLCD);
void WriteCommandLCD(unsigned char WCLCD,BuysC);
unsigned char ReadDataLCD(void);
unsigned char ReadStatusLCD(void);
void LCDInit(void);
void LCDClear(void);
void LCDFlash(void);
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
void DisplayImage (unsigned char code *DData);
void Delay5Ms(void);
void Delay400Ms(void);


code unsigned char  uctech[] = {"51单片机学习网"};
code unsigned char  net[] = {"www.lydz8.com"};
//----------------------------------------------------------------------------
code unsigned char tmp[]={//122*32点阵图形数据,林洋电子吧
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,
0x80,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,
0x80,0x00,0x8F,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,
0x80,0x03,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,
0x80,0x01,0xFF,0xF8,0x00,0x10,0x80,0x20,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x40,
0x80,0x01,0xFF,0xF0,0x80,0x10,0x83,0x24,0x02,0x01,0xFE,0x03,0xF0,0x00,0x00,0x40,
0x80,0x03,0xFF,0xF8,0x20,0x10,0x80,0x44,0x1F,0xE0,0x0C,0x3A,0x90,0x00,0x00,0x40,
0x80,0x03,0xFF,0xFC,0xE0,0x3F,0xF0,0x3B,0x12,0x20,0x30,0x2A,0x90,0x00,0x00,0x40,
0x80,0x0F,0xFF,0xFC,0x38,0x10,0xC2,0x08,0x12,0x20,0x20,0x2A,0x90,0x00,0x00,0x40,
0x80,0x0F,0xFC,0xAF,0x9E,0x1D,0xC1,0x7F,0x1F,0xE3,0xFF,0x2B,0xF0,0x00,0x00,0x40,
0x80,0x2F,0xF8,0x00,0x20,0x35,0xA0,0x08,0x12,0x20,0x20,0x2A,0x10,0x00,0x00,0x40,
0x80,0x03,0xF0,0x00,0x20,0x32,0x91,0x08,0x1F,0xE0,0x20,0x3A,0x00,0x38,0x00,0x40,
0x80,0x01,0xF0,0x01,0x00,0x16,0x91,0x7F,0x12,0x00,0x20,0x2A,0x00,0x30,0x00,0x40,
0x80,0x00,0x38,0x0C,0x00,0x10,0x82,0x08,0x02,0x10,0x20,0x02,0x10,0x20,0x00,0x40,
0x80,0x00,0x1F,0xE0,0x00,0x10,0x82,0x08,0x01,0xF0,0x60,0x01,0xF0,0x20,0x00,0x40,
0x80,0x00,0x3F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x40,
0x80,0x01,0xFB,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x60,0x40,
0x80,0x03,0xFF,0xE8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xF8,0x40,
0x80,0x01,0xDF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0xF8,0x40,
0x80,0x01,0xFF,0xB0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0xF8,0x40,
0x80,0x03,0xFD,0xFE,0x00,0x00,0x00,0x08,0x01,0x01,0x80,0x00,0x00,0x0D,0xF8,0x40,
0x80,0x05,0xF7,0xFF,0x80,0x00,0x00,0x08,0x01,0x02,0x40,0x00,0x00,0x27,0xF8,0x40,
0x80,0x07,0xFE,0xFE,0x83,0xDE,0xF0,0x09,0x27,0x3A,0x40,0x73,0x3E,0x61,0xF9,0x40,
0x80,0x07,0xEF,0x7B,0x03,0xDE,0xF0,0x08,0xC9,0x19,0x80,0x84,0xAA,0xE3,0xF9,0xC0,
0x80,0x0D,0xFF,0xBC,0x01,0x8C,0x60,0x08,0xC9,0x32,0x40,0x94,0xAA,0xE3,0xFC,0xC0,
0x80,0x06,0xBF,0xF8,0x01,0x8C,0x62,0x08,0xC7,0x3B,0xC8,0x63,0x2A,0xE7,0xFD,0x40,
0x80,0xFF,0xFF,0xFD,0x00,0x00,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0xC7,0xFE,0x40,
0xDF,0xFF,0x7E,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC3,0xF8,0x40,
0xFF,0xF8,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0xE0,0x40,
0xFF,0xE1,0xFF,0xF7,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,
0x80,0x01,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0};
//--------------------------------------------------------------------------

void main(void)
{
 Delay400Ms(); //启动等待,等LCD讲入工作状态
 LCDInit(); //LCM初始化
 Delay5Ms(); //延时片刻(可不要)
 while(1){
 		LCDClear();
		DisplayImage(tmp);//显示图形
		Delay400Ms();
		Delay400Ms();
		Delay400Ms();
		Delay400Ms();
		Delay400Ms();
		Delay400Ms();
		Delay400Ms();
		LCDClear();
		DisplayListChar(0, 0, uctech);	//显示字库中的中文数字
 		DisplayListChar(0, 5, net);		//显示字库中的中文数字
		Delay400Ms();
		Delay400Ms();
		Delay400Ms();
		Delay400Ms();
 		LCDFlash();	//闪烁效果
		//}
	}
}

//写数据
void WriteDataLCD(unsigned char WDLCD)
{
 ReadStatusLCD(); //检测忙 
 LCD_RS = 1;
 LCD_RW = 0;
 LCD_Data = WDLCD;
 LCD_E = 1;
 LCD_E = 1;
 LCD_E = 1;
 LCD_E = 0;
}

//写指令
void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测
{
 if (BuysC) ReadStatusLCD(); //根据需要检测忙 
 LCD_RS = 0;
 LCD_RW = 0; 
 LCD_Data = WCLCD;
 LCD_E = 1; 
 LCD_E = 1;
 LCD_E = 1;
 LCD_E = 0;  
}

//读数据
unsigned char ReadDataLCD(void)
{
 LCD_RS = 1; 
 LCD_RW = 1;
 LCD_E = 0;
 LCD_E = 0;
 LCD_E = 1;
 return(LCD_Data);
}

//读状态
unsigned char ReadStatusLCD(void)
{
 LCD_Data = 0xFF; 
 LCD_RS = 0;
 LCD_RW = 1; 
 LCD_E = 1;
 while (LCD_Data & Busy); //检测忙信号
 LCD_E = 0;
 return(LCD_Data);
}

void LCDInit(void) //LCM初始化
{
 WriteCommandLCD(0x30,1); //显示模式设置,开始要求每次检测忙信号
 WriteCommandLCD(0x01,1); //显示清屏
 WriteCommandLCD(0x06,1); // 显示光标移动设置
 WriteCommandLCD(0x0C,1); // 显示开及光标设置
}
void LCDClear(void) //清屏
{
 WriteCommandLCD(0x01,1); //显示清屏
 WriteCommandLCD(0x34,1); // 显示光标移动设置
 WriteCommandLCD(0x30,1); // 显示开及光标设置
}
void LCDFlash(void)	//闪烁效果
{
 WriteCommandLCD(0x08,1); //显示清屏
 Delay400Ms();
 WriteCommandLCD(0x0c,1); // 显示开及光标设置
 Delay400Ms();
 WriteCommandLCD(0x08,1); //显示清屏
 Delay400Ms();
 WriteCommandLCD(0x0c,1); // 显示开及光标设置
 Delay400Ms();
 WriteCommandLCD(0x08,1); //显示清屏
 Delay400Ms();
}
//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
 Y &= 0x1;
 X &= 0xF; //限制X不能大于15,Y不能大于1
 if (Y) X |= 0x10; //当要显示第二行时地址码+0x10;
 X |= 0x80; // 算出指令码
 WriteCommandLCD(X, 0); //这里不检测忙信号,发送地址码
 WriteDataLCD(DData);
}

//按指定位置显示一串字符
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
 unsigned char ListLength,X2;
  ListLength = 0;
  X2=X;
 Y &= 0x01;
 X &= 0x0F; //限制X不能大于15,Y不能大于1
 if (Y) X2 |= 0x10; //当要显示第二行时地址码+0x10;
 X2 |= 0x80; // 算出指令码
 WriteCommandLCD(X2, 1); //这里不检测忙信号,发送地址码
 while (DData[ListLength]>=0x20) //若到达字串尾则退出
  {
   if (X <= 0x0F) //X坐标应小于0xF
    {
     WriteDataLCD(DData[ListLength]); //
     ListLength++;
	 X++;
	 Delay5Ms();
    }
  }
}

//图形显示122*32
void DisplayImage (unsigned char code *DData){
	unsigned char x,y;
	for(x=0;x<32;x++){				//32行
		WriteCommandLCD(0x34,1);
		WriteCommandLCD((0x80+x),1);//列地址
		WriteCommandLCD(0x80,1);	//行地址
		WriteCommandLCD(0x30,1);
		for(y=0;y<16;y++)			
			WriteDataLCD(DData[x*16+y]);//读取数据写入LCD		
	}
	WriteCommandLCD(0x36,1);	//扩充功能设定
	WriteCommandLCD(0x30,1);
}

//5ms延时
void Delay5Ms(void)
{
 unsigned int TempCyc = 5552;
 while(TempCyc--);
}

//400ms延时
void Delay400Ms(void)
{
 unsigned char TempCycA = 5;
 unsigned int TempCycB;
 while(TempCycA--)
 {
  TempCycB=7269;
  while(TempCycB--);
 };
}

⌨️ 快捷键说明

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