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

📄 lcd12864a_430.c

📁 基于MSP430F22X4系列的液晶显示器12864的驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
                          
                          
               
                LCD_Display(Number5,0,5,0);
                LCD_Display(Number6,0,6,0);
                LCD_Display(Number7,0,7,0);
                LCD_Display(Number8,0,8,0);
                LCD_Display(Number9,0,9,0);*/
                   /*LCD_Delayt(65000);LCD_Delayt(65000);LCD_Delayt(65000);LCD_Delayt(65000);
					LCD_Delayt(65000);LCD_Delayt(65000);LCD_Delayt(65000);LCD_Delayt(65000);
		LCD_Clear(0x00);		LCD_Delayt(65000);LCD_Delayt(65000);LCD_Delayt(65000);LCD_Delayt(65000);
						LCD_Delayt(65000);LCD_Delayt(65000);LCD_Delayt(65000);LCD_Delayt(65000);*/
	}
}

//---------------------------------------------------------

void InitOsc(void) {
	
	unsigned char i,j;			//设置系统时钟
	BCSCTL1	= 0x00;				//启动XT2晶振,ACLK为XT1(32KHz)
	BCSCTL2	= 0x88;				//MCLK为XT2不分频;SMCLK为XT2,4MHz
	j=0;
	while(1) {
		IFG1 &= ~OFIFG;			//清OSCFault标志
		for (i=0xFF;i>0;--i);		//延时等待
		if ((IFG1 & OFIFG)!=0) {
			BCSCTL1 = 0x00;		//启动XT2晶振,ACLK为XT1(32KHz)
			BCSCTL2 = 0X88;		//MCLK为XT2不分频,SMCLK为XT2不分频
			j++;			//如果检测到振荡器失效,则计数
			if (j>10)		//如果计数值超过10次,则认为是硬件问题
				;		//OSCFault();
		} 
		else {
			for (i=0xFF;i>0;--i);	//等待振荡器达到足够的幅度
			IFG1 &= ~OFIFG;		//清OSCFault标志
			IE1 |= OFIE + ACCVIE;	//振荡器故障,FLASH非法访问中断允许
			break;
		}
	}  
}
//---------------------------------------------------------
void LCD_Initialization(void) {

	LCD_DATA_DIR = 0xff;
	LCD_DATA_OUT = 0x00;			//设置8位数据端口
	LCD_RST_DIR |= LCD_RST;
	LCD_CS1_DIR |= LCD_CS1;
	LCD_CS2_DIR |= LCD_CS2;			//复位和片选输出
	LCD_RST_LO;
	LCD_CS1_LO;
	LCD_CS2_LO;

	LCD_DI_DIR |= LCD_DI;
	LCD_EN_DIR |= LCD_EN;
	LCD_RW_DIR |= LCD_RW;
	LCD_RW_LO;
	LCD_EN_LO;				//设置EN DI和RW
	LCD_Delayt(5);
	LCD_RST_HI;
	
	LCD_WriteByte(LCD_DisplayON,LCD_Instrument|LCD_Chip1);
	LCD_WriteByte(LCD_DisplayON,LCD_Instrument|LCD_Chip2);
	LCD_WriteByte(LCD_StartLine,LCD_Instrument|LCD_Chip1);
	LCD_WriteByte(LCD_StartLine,LCD_Instrument|LCD_Chip2);
	
	LCD_Clear(0x00);
}

unsigned char LCD_ReadByte(unsigned char flag) {
	unsigned char LCD_Result=0x00;
	LCD_EN_LO;;
	LCD_RW_HI;
	if((flag&LCD_Data)==0x01)
		LCD_DI_HI;
	else 
		LCD_DI_LO;
	if ((flag&LCD_Chip1)==0x02)
		LCD_CS1_HI;
	else
		LCD_CS2_HI;
	LCD_EN_HI;
	//LCD_Delayt(2);
	LCD_DATA_DIR = 0x00;
	LCD_Result=(LCD_DATA_IN&0xFF);
	LCD_DATA_DIR = 0xFF;
	LCD_EN_LO;
	LCD_CS1_LO;
	LCD_CS2_LO;
	return LCD_Result;
}

void LCD_WriteByte(unsigned char I_Data,unsigned char flag) {
	unsigned char itemp=0;
	do {
		itemp=LCD_ReadByte(flag&0xFE);
	} while(itemp&0x80);
	//LCD_Delayt(2);
	LCD_EN_LO;
	LCD_RW_LO;
	if((flag&LCD_Data)==0x01)
		LCD_DI_HI;
	else
		LCD_DI_LO;
	if ((flag&LCD_Chip1)==0x02)
		LCD_CS1_HI;
	else
		LCD_CS2_HI;
	LCD_EN_HI;
	LCD_DATA_OUT = I_Data;
	//LCD_Delayt(2);
	LCD_EN_LO;
	LCD_CS1_LO;
	LCD_CS2_LO;
}
unsigned char LCD_Location(unsigned char XPos,unsigned char YPos)
{	unsigned char ce_flag=YPos<64?LCD_Chip1:LCD_Chip2;
	XPos=XPos&0x07;
	YPos=YPos&0x3F;
	LCD_WriteByte(LCD_StartLine,LCD_Instrument|LCD_Chip1);
	LCD_WriteByte(LCD_StartLine,LCD_Instrument|LCD_Chip2);
	LCD_WriteByte((LCD_XAddress+XPos),ce_flag&0xFE);
	LCD_WriteByte((LCD_YAddress+YPos),ce_flag&0xFE);
	return ce_flag;
}
void LCD_Clear(unsigned char I_Data)
{	unsigned char xtemp,ytemp;
	for (xtemp=0;xtemp<8;xtemp++)
	{	LCD_Location(xtemp,0);
		LCD_Location(xtemp,64);
		for (ytemp=0;ytemp<64;ytemp++)
		{	LCD_WriteByte(I_Data,LCD_Data|LCD_Chip1);
			LCD_WriteByte(I_Data,LCD_Data|LCD_Chip2);
		}
	}
}
void LCD_ClearRange(unsigned char Start_XPos,unsigned char Start_YPos,
					unsigned char End_XPos,unsigned char End_YPos)
{	unsigned char XPos,YPos,flag;
	for (XPos=Start_XPos;XPos<End_XPos;XPos++)
	{	flag=LCD_Location(XPos,Start_YPos);
		for (YPos=Start_YPos;YPos<End_YPos;YPos++)
		{	if (YPos==64)
				flag=LCD_Location(XPos,64);
			LCD_WriteByte(0x00,flag|LCD_Data);
		}
	}
}
void LCD_Delayt(unsigned int dtime)
{	unsigned int itemp;
	for (itemp=0;itemp<dtime;itemp++);
}
void LCD_Delayl(unsigned int dtime)
{	unsigned int itemp;
	for (itemp=0;itemp<dtime;itemp++)
		LCD_Delayt(10000);
}
void LCD_Display(const unsigned char *Buffer,unsigned char Start_XPos,
					unsigned char Start_YPos,unsigned char Rotate)
{	unsigned char XPos,YPos,flag;
	unsigned char Width=Buffer[0],Height=Buffer[1];
	for (XPos=0;XPos<Height;XPos++)
	{	flag=LCD_Location((XPos+Start_XPos),Start_YPos);
		for (YPos=0;YPos<Width;YPos++)
		{	if ((YPos+Start_YPos)==64)
				flag=LCD_Location((XPos+Start_XPos),64);
			if(Rotate == 1)
			{       LCD_WriteByte((0xFF-Buffer[XPos*Width+YPos+2]),flag|LCD_Data);
			} else {
			LCD_WriteByte(Buffer[XPos*Width+YPos+2],flag|LCD_Data);
			}
		}
	}
}
void LCD_DispNum(unsigned char dates,unsigned char Start_XPos,
				 unsigned char Start_YPos,unsigned char Rotate) {
					 //这是一个,注意仅仅是一个哦,显示数据的地方哦
	switch (dates) {
		case 0:
			LCD_Display(Number0,Start_XPos,Start_YPos,Rotate);
			break;
		case 1:
			LCD_Display(Number1,Start_XPos,Start_YPos,Rotate);
			break;
		case 2:
			LCD_Display(Number2,Start_XPos,Start_YPos,Rotate);
			break;
		case 3:
			LCD_Display(Number3,Start_XPos,Start_YPos,Rotate);
			break;
		case 4:
			LCD_Display(Number4,Start_XPos,Start_YPos,Rotate);
			break;
		case 5:
			LCD_Display(Number5,Start_XPos,Start_YPos,Rotate);
			break;
		case 6:
			LCD_Display(Number6,Start_XPos,Start_YPos,Rotate);
			break;
		case 7:
			LCD_Display(Number7,Start_XPos,Start_YPos,Rotate);
			break;
		case 8:
			LCD_Display(Number8,Start_XPos,Start_YPos,Rotate);
			break;
		case 9:
			LCD_Display(Number9,Start_XPos,Start_YPos,Rotate);
			break;
	}
}
void LCD_DispNums(unsigned char dates,unsigned char Start_XPos,
				  unsigned char Start_YPos,unsigned char Rotate){
	unsigned int itemp,jtemp;                                                     // 显示一组数据
	jtemp = dates;
	itemp = dates/10000;
	LCD_DispNum(itemp,Start_XPos,Start_YPos,Rotate);
	jtemp = jtemp - itemp*10000;
	itemp = jtemp/1000;
	LCD_DispNum(itemp,Start_XPos,Start_YPos+8,Rotate);
	jtemp = jtemp - itemp*1000;
	itemp = jtemp/100;
	LCD_DispNum(itemp,Start_XPos,Start_YPos+16,Rotate);
	//LCD_DispNum(itemp,Start_XPos,Start_YPos,Rotate);
	jtemp = jtemp - itemp*100;
	itemp = jtemp/10;
	LCD_DispNum(itemp,Start_XPos,Start_YPos+24,Rotate);
	//LCD_DispNum(itemp,Start_XPos,Start_YPos+8,Rotate);
	itemp = jtemp - itemp*10;
	LCD_DispNum(itemp,Start_XPos,Start_YPos+32,Rotate);
	//LCD_DispNum(itemp,Start_XPos,Start_YPos+16,Rotate);
}
void delay(unsigned int time)
 {
     int i;
     int j,k;
     for(j=0;j<time;j++)
     {for (k=0;k<time;k++)
     
     for(i=0;i<time;i++)
       _NOP();
     }

}
void second()
{
  unsigned char  i,j=0;
 
    for(i=0;i<10;i++)
    {
    
     LCD_DispNums(i,2,32,0);
    delay(58);}
    
     if(i==9)
      {
        j=j+1;
       LCD_DispNums(j,2,24,0);
      delay(58);}
  
  


}

⌨️ 快捷键说明

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