📄 mg12232.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 + -