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

📄 mg12232.c

📁 MSP430F149的液晶驱动程序,主要是对液晶显示模块MG-12232的读写操作,从而实现数据的显示功能.
💻 C
字号:
#include <msp430x14x.h>
#include "mg12232.h"

char WordTable[] = {
    0x00,0xF8,0x48,0x48,0x48,0x48,0xFF,0x48,
	0x48,0x48,0x48,0xFC,0x08,0x00,0x00,0x00,
	0x00,0x07,0x02,0x02,0x02,0x02,0x3F,0x42,
	0x42,0x42,0x42,0x47,0x40,0x70,0x00,0x00
};
void main(void)
{
	// 关闭看门狗
	WDTCTL = WDTPW + WDTHOLD;   
	// 关闭中断
    _DINT();			
    
    // 初始化
    Init_CLK();
    Init_Port();
	
	//初始化MG-12232
	LcdDisplayInit(0);
	LcdDisplayInit(1);

	//显示的起始行为第0行,起始列为第0列,
	//起始页为第0页,显示区为E1区,内容为"电"
	LcdDisplayWord(0,0xC0,0xB8,0,WordTable);
	return;
}
void Init_CLK(void)
{
    unsigned int i;
    BCSCTL1 = 0X00;	//将寄存器的内容清零
					//XT2震荡器开启
					//LFTX1工作在低频模式
					//ACLK的分频因子为1
					
    do 
    {
		// 清除OSCFault标志
	    IFG1 &= ~OFIFG;    
	    for (i = 0x20; i > 0; i--);                
    }
    while ((IFG1 & OFIFG) == OFIFG);// 如果OSCFault =1   
					
	//将寄存器的内容清零
    BCSCTL2 = 0X00;		
	//MCLK的时钟源为TX2CLK,分频因子为1
    BCSCTL2 += SELM1;	
	//SMCLK的时钟源为TX2CLK,分频因子为1
    BCSCTL2 += SELS;
	return;
}
void Init_Port(void)
{
	// P5.0 P5.1 P5.2 P5.3为输出
	P5DIR |= BIT0;
	P5DIR |= BIT1;
	P5DIR |= BIT2;
	P5DIR |= BIT3;
	return;
}
void E1_High(void)
{
	//P5.2管脚输出为高电平
	P5OUT |= BIT2;		
    _NOP();
    _NOP();
    return;
}
void E1_Low(void)
{
	//P5.2管脚输出为低电平
	P5OUT &= ~(BIT2);		
    _NOP();
    _NOP();
    return;
}
void E2_High(void)
{
	//P5.3管脚输出为高电平
	P5OUT |= BIT3;		
    _NOP();
    _NOP();
    return;
}
void E2_Low(void)
{
	//P5.3管脚输出为低电平
	P5OUT &= ~(BIT3);		
    _NOP();
    _NOP();
    return;
}
void A0_High(void)
{
	//P5.0管脚输出为高电平
	P5OUT |= BIT0;		
    _NOP();
    _NOP();
    return;
}
void A0_Low(void)
{
	//P5.0管脚输出为低电平
	P5OUT &= ~(BIT0);		
    _NOP();
    _NOP();
    return;
}
void R_W_High(void)
{
	//P5.1管脚输出为高电平
	P5OUT |= BIT1;		
    _NOP();
    _NOP();
    return;
}
void R_W_Low(void)
{
	//P5.1管脚输出为低电平
	P5OUT &= ~(BIT1);		
    _NOP();
    _NOP();
    return;
}
//等待空闲状态
void WaitIdle(int nZone)
{
	char nTemp;
	//设置P4口为输入方向
	P4DIR = 0;
	for(;;)
	{
		if(nZone == 0)
		{
			//E1区
            E1_High();
			E2_Low();
		}
		else
		{
			//E2区
			E2_High();
			E1_Low();
		}
		R_W_High();
		A0_Low();
		//取出D7
		nTemp = (P4IN & BIT7);
		nTemp >>= 7;
		//空闲就跳出循环
		if(nTemp == 0) break;
	}
	return;
}
void SendCommand(int nZone,char nVal)
{
	//等待闲
    WaitIdle(nZone);
	//设置P4口为输出方向
	P4DIR = 0xff;
	if(nZone == 0)
	{
		//E1区
        E1_High();
		E2_Low();
	}
	else
	{
		//E2区
		E2_High();
		E1_Low();
	}
	R_W_Low();
	A0_Low();
	P4OUT = nVal;
	//写入指令
    if(nZone == 0)
	{
		//E1区
		E1_Low();
	}
	else
	{
		//E2区
		E2_Low();
	}
	R_W_High();
	return;
}
void WriteData(int nZone,char nVal, char nAddr)
{
	//设置列地址
	SendCommand(nZone,nAddr);
	//等待空闲
    WaitIdle(nZone);
	//设置P4口为输出方向
	P4DIR = 0xff;
	if(nZone == 0)
	{
		//E1区
        E1_High();
		E2_Low();
	}
	else
	{
		//E2区
		E2_High();
		E1_Low();
	}
	R_W_Low();
	A0_High();
	P4OUT = nVal;
	//写入指令
    if(nZone == 0)
	{
		//E1区
		E1_Low();
	}
	else
	{
		//E2区
		E2_Low();
	}
	R_W_High();
	return;
}
void DisplayOn(int nZone)
{
	char nTemp;
	for(;;)
	{
		//发送显示开命令
		SendCommand(nZone,0xAF);
		WaitIdle(nZone);
		//读状态
		//设置为输入方向
		P4DIR = 0x00;
		if(nZone == 0)
		{
			//E1区
            E1_High();
			E2_Low();
		}
		else
		{
			//E2区
			E2_High();
			E1_Low();
		}
		R_W_High();
		A0_Low();
		//取出D5
		nTemp = (P4IN & BIT5);
		nTemp >>= 5;
		//如果打开就跳出循环
		if(nTemp == 0) break;
	}
	return;
}
void DisplayOff(int nZone)
{
	char nTemp;
	for(;;)
	{
		//发送显示开命令
		SendCommand(nZone,0xAE);
		WaitIdle(nZone);
		//读状态
		//设置为输入方向
		P4DIR = 0x00;
		if(nZone == 0)
		{
			//E1区
            E1_High();
			E2_Low();
		}
		else
		{
			//E2区
			E2_High();
			E1_Low();
		}
		R_W_High();
		A0_Low();
		//取出D5
		nTemp = (P4IN & BIT5);
		nTemp >>= 5;
		//如果打开就跳出循环
		if(nTemp == 1) break;
	}
	return;
}
void ClearScreen(int nZone)
{
	int i,j;
	char nPageNum;
	//设置页地址代码
	nPageNum = 0xB8;
	for(i = 0;i < 4;i++)
	{
		SendCommand(nZone,0x00);
		for(j = 0;j < 80;j++)
		{
			//等待闲
			WaitIdle(nZone);
			//写入0x00以清屏
			WriteData(nZone,0x00,j);
		}
		//页地址增加
		nPageNum += 1;
	}
    return;
}
void LcdDisplayInit(int nZone)
{
	char nCommand;
	//关显示
	DisplayOff(nZone);
	//静态显示驱动
	nCommand = 0xA4;
	SendCommand(nZone,nCommand);
	//占空比设置
	nCommand = 0xA9;
	SendCommand(nZone,nCommand);
	//复位
	nCommand = 0xE2;
	SendCommand(nZone,nCommand);
	//ADC选择
	nCommand = 0xA0;
	SendCommand(nZone,nCommand);
	//清屏
	ClearScreen(nZone);
	//开显示
	WaitIdle(nZone);
	DisplayOn(nZone);
	return;
}
void LcdDisplayWord(int nZone,char nRow,char nPageNo,char nColAddr,char nTable[])
{
	int i;
	char nTemp;
	//设置行地址
	SendCommand(nZone,nRow);
	//设置页地址
	SendCommand(nZone,nPageNo);
	//显示前8行
	for(i = 0;i < 16;i++)
	{
		nTemp = nTable[i];
		WriteData(nZone,nTemp,i);
	}
	nPageNo += 1;
	//设置页地址
	SendCommand(nZone,nPageNo);
	//显示后8行
	for(i = 0;i < 16;i++)
	{
		nTemp = nTable[i + 16];
		WriteData(nZone,nTemp,i);
	}
	return;
}

⌨️ 快捷键说明

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