mg12232.c
资源名称:msp430.rar [点击查看]
上传用户:xs588588
上传日期:2021-03-30
资源大小:242k
文件大小:5k
源码类别:
DSP编程
开发平台:
C/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;
- }