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

📄 12864a.c

📁 12864液晶驱动文件!包含5个文件!非常的有用!为C51的开发!
💻 C
📖 第 1 页 / 共 4 页
字号:
#include "c8051f020.h"  
#include <intrins.h>              

#define LCD_DATA P7
#define LCD_RS   P10
#define LCD_RW   P11
#define LCD_E    P12
#define LCD_CS1  P13
#define LCD_CS2  P14
#define LCD_RST  P15
#define SELECTCS 0

void SYSCLK_Init (void);      //初始化时钟
void Timer0_Init (void);      //初始化定时器
void PORT_Init (void);        //初始化IO口
void TestLCD(void);


void main (void) 
{
	WDTCN = 0xde;
	WDTCN = 0xad;           //关看门狗
	SYSCLK_Init ();         //初始化时钟
	Timer0_Init();			//初始化定时器
 	PORT_Init ();           //初始化IO口 
	EA=1;					//开中断
    TestLCD();
}

 
void SYSCLK_Init (void)
{
   int i;                              // delay counter
   OSCXCN = 0x65;                      // start external oscillator with
                                       // 18.432MHz crystal
   for (i=0; i < 256; i++) ;           // Wait for osc. to start up
   while (!(OSCXCN & 0x80)) ;        // Wait for crystal osc. to settle
   OSCICN = 0x88;                      // select external oscillator as SYSCLK
                                       // source and enable missing clock
                                       // detector
//	OSCICN = 0x07;                     // interal 16MHZ
}

void PORT_Init (void)
{
   // XBR0    = 0x07;                  // Enable SMBus, SPI0, and UART0
   // XBR1    = 0x00;
    XBR2    = 0x44;                    // Enable crossbar and weak pull-ups
    P74OUT  = 0x00;
}

unsigned char Count1ms;
void Timer0_Init (void)
{
   	CKCON|=0x8;
   	TMOD|=0x1;    	//16Bit
	Count1ms=10;
   	TR0 = 0;                           // STOP Timer0
   	TH0 = (-SYSCLK/1000) >> 8;    	   // set Timer0 to overflow in 1ms
   	TL0 = -SYSCLK/1000;
   	TR0 = 1;                           // START Timer0
   	IE|= 0x2; 
}

void Timer0_ISR (void) interrupt 1     //1ms
{
	TH0 = (-SYSCLK/1000) >> 8;  
   	TL0 = -SYSCLK/1000;
	if (Count1ms) Count1ms--;
}

void Delay1us(unsigned char us)
{
	while (us)
	{
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_();
	  --us;
	}
} 

void Delay1ms(unsigned char T)
{
	Count1ms=T;
	while (Count1ms);
}

void Delay1s(unsigned char T)
{
	while (T)
	{
		Delay1ms(200);
		Delay1ms(200);
		Delay1ms(200);
		Delay1ms(200);
		Delay1ms(200);
		T--;
	}
}

 
void LCD_WaitReady1(void)            //判断LCD控制芯片KS0108是否忙
{
	LCD_DATA=0xff;
	_nop_();
	LCD_CS2=SELECTCS;
	LCD_RW=1;
	LCD_RS=0;
	LCD_E=1;
	while (LCD_DATA&0x80);
	LCD_CS2=!SELECTCS;
}

void LCD_WaitReady2(void)            //判断LCD控制芯片KS0108是否忙
{
	LCD_DATA=0xff;
	_nop_();
	LCD_CS1=SELECTCS;
	LCD_RW=1;
	LCD_RS=0;
	LCD_E=1;
	while (LCD_DATA&0x80);
	LCD_CS1=!SELECTCS;
}

void LCD_WriteCommand1(char ch)      //向LCD控制芯片KS0108发送控制命令
{
	LCD_WaitReady1();
	LCD_CS2=SELECTCS;
	LCD_RW=0;
	LCD_RS=0;
	LCD_DATA=ch;
	LCD_E=1;
	LCD_E=0;
	LCD_CS2=!SELECTCS;
}

void LCD_WriteCommand2(char ch)	    //向LCD控制芯片KS0108发送控制命令
{
	LCD_WaitReady2();
	LCD_CS1=SELECTCS;
	LCD_RW=0;
	LCD_RS=0;
	LCD_DATA=ch;
	LCD_E=1;
	LCD_E=0;
	LCD_CS1=!SELECTCS;
}

void LCD_WriteData1(char ch)    	//向LCD控制芯片KS0108发送数据命令
{
	LCD_WaitReady1();
	LCD_CS2=SELECTCS;
	LCD_RW=0;
	LCD_RS=1;
	LCD_DATA=ch;
	LCD_E=1;
	LCD_E=0;
	LCD_CS2=!SELECTCS;
}

void LCD_WriteData2(char ch)    	//向LCD控制芯片KS0108发送数据命令
{
	LCD_WaitReady2();
	LCD_CS1=SELECTCS;
	LCD_RW=0;
	LCD_RS=1;
	LCD_DATA=ch;
	LCD_E=1;
	LCD_E=0;
	LCD_CS1=!SELECTCS;
}

void InitLCD(void)	                     //初始化LCD
{
	char i,j;
	LCD_RST=0;
    Delay1ms(5);	
	LCD_RST=1;
    Delay1ms(1);
	LCD_WriteCommand1(0xc0);	          //显示起始行
	LCD_WriteCommand2(0xc0);              //显示起始行
	LCD_WriteCommand1(0x3f);              //开显示
	LCD_WriteCommand2(0x3f);              //开显示

	for (j=0;j<8;j++)		    	      //清屏
	{
		LCD_WriteCommand1(0xB8+j);        //页(Y)地址,清左半屏
		LCD_WriteCommand1(0x40);          //(X)地址
		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 ClearLCD(void)
{
	char i,j;
    for (j=0;j<8;j++)		    	      //清屏
	{
		LCD_WriteCommand1(0xB8+j);        //页(Y)地址,清左半屏
		LCD_WriteCommand1(0x40);          //(X)地址
		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 *Dot) //显示16*16点阵汉字
{
char i;
	for (i=0;i<32;i++)
	{
		if ((x+i%16)<64)
		{
			LCD_WriteCommand1(0xB8+y+i/16);
			LCD_WriteCommand1(0x40+x+i%16);
			LCD_WriteData1(Dot[i]);
		}
		else
		{
			LCD_WriteCommand2(0xB8+y+i/16);
			LCD_WriteCommand2(0x40+x-64+i%16);
			LCD_WriteData2(Dot[i]);
		} 
	}
}
   
void DispBmp1(char x,char *buf)     	//显示一幅位图
{
int i,j;
	for (j=0;j<8;j++)			//显示位图
	{
	 	LCD_WriteCommand1(0xB8+j);	
	 	LCD_WriteCommand1(0x40+x);		
        for (i=0;i<64-x;i++)
	      	LCD_WriteData1(buf[(j*2)*64+i]);
        LCD_WriteCommand1(0xB8+j);	
        LCD_WriteCommand1(0x40);
		for (i=64-x;i<64;i++)
		   LCD_WriteData1(buf[(j*2+1)*64+i]);
	 	LCD_WriteCommand2(0xB8+j);	
	 	LCD_WriteCommand2(0x40+x);
	 	for (i=0;i<64-x;i++)
	 		LCD_WriteData2(buf[(j*2+1)*64+i]);
	 	LCD_WriteCommand2(0xB8+j);
        LCD_WriteCommand2(0x40);  
        for (i=64-x;i<64;i++)     
			LCD_WriteData2(buf[(j*2)*64+i]);
	}
}

void DispBmp2(char x,char *buf)     	//显示一幅位图
{
int i,j;
	for (j=0;j<8;j++)			//显示位图
	{
	 	LCD_WriteCommand1(0xB8+j);	
	 	LCD_WriteCommand1(0x40+63-x);		

⌨️ 快捷键说明

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