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

📄 lcd.c

📁 C8051F040单片机与DM12864液晶接口
💻 C
字号:
#include "c8051f040.h"
#include <intrins.h>		//	液晶点阵显示试验  -128*64,控制器DM12864I
#define LCD_DATA P7
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_E = P2^2;
sbit LCD_CS1 = P2^6;
sbit LCD_CS2 = P2^7;
void Delay1us(unsigned char);
void Delay1ms(unsigned char);
void Delay1s(unsigned char T);
char code zero[]={
     	0xF8,0xFC,0x04,0xC4,0x24,
		0xFC,0xF8,0x00,0x07,0x0F,
		0x09,0x08,0x08,0x0F,0x07,
		0x00
};
char code one[]={
     	0x00,0x10,0x18,0xFC,0xFC,
		0x00,0x00,0x00,0x00,0x08,
		0x08,0x0F,0x0F,0x08,0x08,
		0x00
};
char code two[]={
	  	0x08,0x0C,0x84,0xC4,0x64,
		0x3C,0x18,0x00,0x0E,0x0F,
		0x09,0x08,0x08,0x0C,0x0C,
		0x00
};
char code three[]={
    	0x08,0x0C,0x44,0x44,0x44,
		0xFC,0xB8,0x00,0x04,0x0C,
		0x08,0x08,0x08,0x0F,0x07,
		0x00
};
char code  four[]={
     	0xC0,0xE0,0xB0,0x98,0xFC,
		0xFC,0x80,0x00,0x00,0x00,
		0x00,0x08,0x0F,0x0F,0x08,
		0x00
};
char code  five[]={
    	0x7C,0x7C,0x44,0x44,0xC4,
		0xC4,0x84,0x00,0x04,0x0C,
		0x08,0x08,0x08,0x0F,0x07,
		0x00
};
char code  six[]={
      	0xF0,0xF8,0x4C,0x44,0x44,
		0xC0,0x80,0x00,0x07,0x0F,
		0x08,0x08,0x08,0x0F,0x07,
		0x00
};
char code  seven[]={
      	0x0C,0x0C,0x04,0x84,0xC4,
		0x7C,0x3C,0x00,0x00,0x00,
		0x0F,0x0F,0x00,0x00,0x00,
		0x00
};
char code  eight[]={
      	0xB8,0xFC,0x44,0x44,0x44,
		0xFC,0xB8,0x00,0x07,0x0F,
		0x08,0x08,0x08,0x0F,0x07,
		0x00
};
char code  nine[]={
      	0x38,0x7C,0x44,0x44,0x44,
		0xFC,0xF8,0x00,0x00,0x08,
		0x08,0x08,0x0C,0x07,0x03,
		0x00
};
char code  chen[]={
		0x00, 0xfe, 0x22, 0x5a, 0x86, 0x08, 0x88, 0x48, 0x38, 0x0f, 0xe8, 0x08, 0x88, 0x0c, 0x08, 0x00, 0x00, 0xff, 0x04, 0x08, 0x07, 0x20, 0x11, 0x0d, 0x41, 0x81, 0x7f, 0x01, 0x05, 0x19, 0x30, 0x00
};
char code  hao[]={0x00, 0x00, 0x80, 0xbe, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xbf, 0x82, 0x00, 0x00, 0x00, 0x04, 0x84, 0x84, 0x44, 0x44, 0x24, 0x14, 0x0f, 0x14, 0x24, 0x24, 0x44, 0xc4, 0x46, 0x04, 0x00};
char code  wen[]={
		0x00, 0xfc, 0x01, 0x12, 0x16, 0xf0, 0x52, 0x52, 0x52, 0xf2, 0x1a, 0x12, 0x02, 0xff, 0x02, 0x00, 0x00, 0xff, 0x00, 0x08, 0x08, 0x0f, 0x09, 0x09, 0x09, 0x7f, 0x08, 0x48, 0x80, 0x7f, 0x00, 0x00
};
char code niao[]={0x00, 0x00, 0x00, 0xfc, 0x04, 0x16, 0x65, 0x04, 0x84, 0x04, 0xfe, 0x04, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x13, 0x12, 0x12, 0x12, 0x12, 0x12, 0x13, 0x5a, 0x92, 0x42, 0x3f, 0x02, 0x00};
char code ren[]={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};
#define SELECTCS 1
void LCD_WriteCommand1(char ch) //向LCD控发送控制命令	   左半边
{	
	LCD_CS1=SELECTCS;
	LCD_CS2=!SELECTCS;
	LCD_RW=0;
	LCD_RS=0;
	LCD_DATA=ch;
	LCD_E=1;
	Delay1us(30);
	LCD_E=0;
}

void LCD_WriteCommand2(char ch)	//向LCD控制发送控制命令			右半边
{
	LCD_CS2=SELECTCS;
	LCD_CS1=!SELECTCS;	  
	LCD_RW=0;
	LCD_RS=0;
	LCD_DATA=ch;
	LCD_E=1;
	Delay1us(30);
	LCD_E=0;
}

void LCD_WriteData1(char ch)	//发送数据 左半边
{
	
	LCD_CS1=SELECTCS;
	LCD_CS2=!SELECTCS;
	LCD_RW=0;
	LCD_RS=1;
	LCD_DATA=ch;
	LCD_E=1;
	Delay1us(30);
	LCD_E=0;
}

void LCD_WriteData2(char ch)	//发送数据 右半边 
{

	LCD_CS1=!SELECTCS;
	LCD_CS2=SELECTCS;
	LCD_RW=0;
	LCD_RS=1;					
	LCD_DATA=ch;
	LCD_E=1;
	Delay1us(30);
	LCD_E=0;
//	LCD_CS1=!SELECTCS;
}
void InitLCD(void)	//初始化LCD
{
	char i,j;
	LCD_WriteCommand1(0xc0);	
	LCD_WriteCommand2(0xc0);
	LCD_WriteCommand1(0x3f);  	//开显示 和设定起始行
	LCD_WriteCommand2(0x3f);
	for (j=0;j<8;j++)			//清屏
	{
		LCD_WriteCommand1(0xB8+j);	//清左半屏
		LCD_WriteCommand1(0x40);
		for (i=0;i<64;i++)
			LCD_WriteData1(0x00);

		LCD_WriteCommand2(0xB8+j);	//清右半屏
		LCD_WriteCommand2(0x40);
		for (i=0;i<64;i++)
			LCD_WriteData2(0x00);
	}
}
void LCD_WriteHZ(char x,char y,char *HZ) //显示16*16点阵汉字	   x表示起始页,y表示起始列(对于整个液晶来说)
{
	unsigned char i;
	Delay1ms(15);

	for (i=0;i<32;i++)
	{
		if ((y+i%16)<64)					//64列以内显示在左半屏
		{
			LCD_WriteCommand1(0xb8+x+i/16);
			LCD_WriteCommand1(0x40+y+i%16);
			LCD_WriteData1(HZ[i]);
		}
		else								//64列以外显示在右半屏
		{
			LCD_WriteCommand2(0xb8+x+i/16);
			LCD_WriteCommand2(0x40+y-64+i%16);
			LCD_WriteData2(HZ[i]);
		}
	}
}
void LCD_WriteSZ(char x,char y,char *SZ) //显示8*16点阵数字	   x表示起始页,y表示起始列(对于整个液晶来说)
{
	unsigned char i;
	Delay1ms(8);

	for (i=0;i<16;i++)
	{
		if ((y+i%8)<64)					//64列以内显示在左半屏
		{
			LCD_WriteCommand1(0xB8+x+i/8);
			LCD_WriteCommand1(0x40+y+i%8);
			LCD_WriteData1(SZ[i]);
		}
		else								//64列以外显示在右半屏
		{
			LCD_WriteCommand2(0xB8+x+i/8);
			LCD_WriteCommand2(0x40+y-64+i%8);
			LCD_WriteData2(SZ[i]);
		}
	}
}			 
void TestLCD(void){

					LCD_WriteSZ(0,0,zero);
					/*LCD_WriteSZ(0,8,one);
					Delay1ms(100);
					LCD_WriteSZ(0,16,two);
					Delay1ms(100);
					LCD_WriteSZ(0,24,three);
					Delay1ms(100);
					LCD_WriteSZ(0,32,four);
					Delay1ms(100);
					LCD_WriteSZ(0,40,five);
					Delay1ms(100);
					LCD_WriteSZ(0,48,six);
					Delay1ms(100);
					LCD_WriteSZ(0,56,seven);
					Delay1ms(100);
					LCD_WriteSZ(0,64,eight);
					Delay1ms(100);
					LCD_WriteSZ(0,72,nine);
					Delay1ms(100);
					LCD_WriteSZ(0,80,nine);
					Delay1ms(100);
					LCD_WriteSZ(0,88,eight);
					Delay1ms(100);
					LCD_WriteSZ(0,96,seven);
					Delay1ms(100);
					LCD_WriteSZ(0,104,six);
					Delay1ms(100);
					LCD_WriteSZ(0,112,five);
					Delay1ms(100);
					LCD_WriteSZ(0,120,four);
					Delay1ms(100);
					LCD_WriteSZ(0,128,three);
					Delay1ms(100);*/
					LCD_WriteSZ(2,0,two);
					//LCD_WriteSZ(2,8,one);
					//Delay1ms(100);
					//LCD_WriteSZ(2,16,zero);
					Delay1ms(100);
			
		
	}	
void Port_IO_Init()
{
    // P0.0  -  Unassigned,  Open-Drain, Digital
    // P0.1  -  Unassigned,  Open-Drain, Digital
    // P0.2  -  Unassigned,  Open-Drain, Digital
    // P0.3  -  Unassigned,  Open-Drain, Digital
    // P0.4  -  Unassigned,  Open-Drain, Digital
    // P0.5  -  Unassigned,  Open-Drain, Digital
    // P0.6  -  Unassigned,  Open-Drain, Digital
    // P0.7  -  Unassigned,  Open-Drain, Digital

    // P1.0  -  Unassigned,  Open-Drain, Digital
    // P1.1  -  Unassigned,  Open-Drain, Digital
    // P1.2  -  Unassigned,  Open-Drain, Digital
    // P1.3  -  Unassigned,  Open-Drain, Digital
    // P1.4  -  Unassigned,  Open-Drain, Digital
    // P1.5  -  Unassigned,  Open-Drain, Digital
    // P1.6  -  Unassigned,  Open-Drain, Digital
    // P1.7  -  Unassigned,  Open-Drain, Digital

    // P2.0  -  Unassigned,  Open-Drain, Digital
    // P2.1  -  Unassigned,  Open-Drain, Digital
    // P2.2  -  Unassigned,  Open-Drain, Digital
    // P2.3  -  Unassigned,  Open-Drain, Digital
    // P2.4  -  Unassigned,  Open-Drain, Digital
    // P2.5  -  Unassigned,  Open-Drain, Digital
    // P2.6  -  Unassigned,  Open-Drain, Digital
    // P2.7  -  Unassigned,  Open-Drain, Digital

    // P3.0  -  Unassigned,  Open-Drain, Digital
    // P3.1  -  Unassigned,  Open-Drain, Digital
    // P3.2  -  Unassigned,  Open-Drain, Digital
    // P3.3  -  Unassigned,  Open-Drain, Digital
    // P3.4  -  Unassigned,  Open-Drain, Digital
    // P3.5  -  Unassigned,  Open-Drain, Digital
    // P3.6  -  Unassigned,  Open-Drain, Digital
    // P3.7  -  Unassigned,  Open-Drain, Digital

    SFRPAGE   = CONFIG_PAGE;
    P2MDOUT   = 0xFF;
    P3MDOUT   = 0xFF;
	P4MDOUT   = 0xFF;
    P5MDOUT   = 0xFF;
    P6MDOUT   = 0xFF;
    P7MDOUT   = 0xFF;
    XBR0 = 0x04; 
	XBR1 = 0x04; 
	XBR2 = 0x40; 
	XBR3 = 0x00;
}
void Oscillator_Init()
{
    SFRPAGE   = CONFIG_PAGE;
    OSCICN    = 0x83;
}

void Delay1us(unsigned char T) 
{	while(T){
	T--;
	}
}
void Delay1ms(unsigned char T)
{
	while (T)
	{
		Delay1us(200);
		Delay1us(200);
		Delay1us(200);
		Delay1us(200);
		Delay1us(200);
		T--;
	}
}
void Delay1s(unsigned char T)
{
	while (T)
	{
		Delay1ms(200);
		Delay1ms(200);
		Delay1ms(200);
		Delay1ms(200);
		Delay1ms(200);
		T--;
	}
}
void main(){
	WDTCN = 0x07;
	WDTCN = 0xde;
	WDTCN = 0xad;           //关看门狗
	Port_IO_Init();
	Oscillator_Init();
	InitLCD();
	TestLCD();
}

⌨️ 快捷键说明

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