#include "msp430x14x.h"
#include "Cry12864.h"
#include "Cry12864.C"
int add;
char data[16];
char flash_data[16];
char hang1[16];
void write_SegA(void);
void Copy_A2B(void);
void Read_SegB(void);
int t = 0;//流水灯判断标志位
unsigned char a;
void main( void )
{
P3DIR = 0XFF;P3OUT = 0XFF;//12864液晶屏启用代码
P4DIR = 0XFF;P4OUT = 0XFF;
P5DIR = 0XFF;P5OUT = 0XFF;
P6DIR = 0XFF;P6OUT = 0XFF;
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;//关闭看门狗
P6DIR |= BIT2;P6OUT |= BIT2; //关闭电平转换
FCTL2 = FWKEY + FSSEL0 + FN0;
data[0]='M';data[1]='Y';
data[2]=' ';data[3]='L';
data[4]='O';data[5]='V';
data[6]='E';data[7]=' ';
data[8]='L';data[9]='i';
data[10]='t';data[11]='t';
data[12]='l';data[13]='e';
data[14]=' ';data[15]='Q';
add = 16;
for(int i = 0; i <= 10000; i++);
Ini_Lcd();
write_SegA();
Copy_A2B();
Read_SegB();
hang1[0]=flash_data[0];//将字符送进缓冲区,使之在屏幕显示
hang1[1]=flash_data[1];
hang1[2]=flash_data[2];
hang1[3]=flash_data[3];
hang1[4]=flash_data[4];
hang1[5]=flash_data[5];
hang1[6]=flash_data[6];
hang1[7]=flash_data[7];
hang1[8]=flash_data[8];
hang1[9]=flash_data[9];
hang1[10]=flash_data[10];
hang1[11]=flash_data[11];
hang1[12]=flash_data[12];
hang1[13]=flash_data[13];
hang1[14]=flash_data[14];
hang1[15]=flash_data[15];
Disp_HZ(0x80,hang1,16);
P3SEL |= 0X30;//0011 0000 选择p3.4和p3.5做UART通信接口
P2DIR = 0XFF;
P2OUT=0x7f;
UCTL0 |= CHAR;//选择8位字符char(8位数据,一位停止位)
UTCTL0 |= SSEL0;// UCLK=ACLK UTCTL0同步异步通信传输模块 SSEL0选择时钟源
UBR00 = 0x03;//波特率9600
UBR10 = 0x00;
UMCTL0 = 0x4A;
ME1 |= UTXE0 + URXE0;//使能USART0的发送和接收
UCTL0 &=~ SWRST;//初始化UARI状态机
IE1 |= URXIE0;//使能USART0的接收中断,IE是中断使能寄存器
_EINT();//打开全局中断
while(1)
{
if(t == 1)//流水灯代码
{
a=P2OUT&0x01;
P2OUT>>=1;//小灯右移
a<<=7;
P2OUT|=a;
for(int i=0;i<=30000;i++);//软延时
}
}
}
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx(void)
{
unsigned char n;
while((IFG1 & UTXIFG0)==0); //等待以前的字符发送完毕,IFG是中断标志寄存器
TXBUF0=RXBUF0;//接收到的字符发送出去
n = RXBUF0; //标志位
if(n=='1')//点亮第一个小灯
{
P2OUT=0xFE;
}
if(n=='2')//熄灭第一个小灯
P2OUT=0xFF;
if(n=='3')//开启蜂鸣器
{
P6SEL = 0X00;
P6DIR = 0XFF;
P6OUT = 0X00;
}
if(n=='4')//关闭蜂蜜器
{
P6DIR = 0x00;
}
if(n=='5')//流水灯标志位置1
{
t=1;
}
if(n=='6')//流水灯标志位复位
{
t=0;
}
}
void write_SegA(void)
{
char *Flash_data_ptr;
unsigned int *Flash_int_ptr;
unsigned int i;
Flash_data_ptr = (char *)0x1080;
FCTL1 = FWKEY + ERASE;
FCTL3 = FWKEY;
*Flash_data_ptr = 0;
FCTL1 = FWKEY + WRT;
for(i = 0; i < 16; i++)
{
*Flash_data_ptr++ = data[i];
}
Flash_int_ptr = (unsigned int *)Flash_data_ptr;
*Flash_int_ptr = add;
FCTL1 = FWKEY;
FCTL3 = FWKEY + LOCK;
}
void Copy_A2B(void)
{
char *Flash_data_ptrA;
char *Flash_data_ptrB;
unsigned int *Flash_int_ptrA;
unsigned int *Flash_int_ptrB;
unsigned int i;
Flash_data_ptrA = (char *)0x1080;
Flash_data_ptrB = (char *)0x1000;
FCTL1 = FWKEY + ERASE;
FCTL3 = FWKEY;
*Flash_data_ptrB = 0;
FCTL1 = FWKEY + WRT;
for(i = 0; i < 16; i++)
{
*Flash_data_ptrB++ = *Flash_data_ptrA++;
}
Flash_int_ptrA = (unsigned int *)Flash_data_ptrA;
Flash_int_ptrB = (unsigned int *)Flash_data_ptrB;
*Flash_int_ptrB = *Flash_int_ptrA;
FCTL1 = FWKEY;
FCTL3 = FWKEY + LOCK;
}
void Read_SegB(void)
{
char *Flash_data_ptr1;
unsigned int j;
Flash_data_ptr1=(char *)0x1000;
for(j = 0; j < 16; j++)
{
flash_data[j]= *Flash_data_ptr1++;
}
}
Cry12864.C
#include <msp430x14x.h>
typedef unsigned char uchar;
typedef unsigned int uint;
extern const unsigned char shuzi_table[];
#define LCD_DataIn P4DIR=0x00 //数据口方向设置为输入
#define LCD_DataOut P4DIR=0xff //数据口方向设置为输出
#define LCD2MCU_Data P4IN
#define MCU2LCD_Data P4OUT
#define LCD_CMDOut P3DIR|=0x07 //P3口的低三位设置为输出
#define LCD_RS_H P3OUT|=BIT0 //P3.0
#define LCD_RS_L P3OUT&=~BIT0 //P3.0
#define LCD_RW_H P3OUT|=BIT1 //P3.1
#define LCD_RW_L P3OUT&=~BIT1 //P3.1
#define LCD_EN_H P3OUT|=BIT2 //P3.2
#define LCD_EN_L P3OUT&=~BIT2 //P3.2
/*******************************************
函数名称:Delay_1ms
功 能:延时约1ms的时间
参 数:无
返回值 :无
********************************************/
void Delay_1ms(void)
{
uchar i;
for(i = 150;i > 0;i--) _NOP();
}
/*******************************************
函数名称:Delay_Nms
功 能:延时N个1ms的时间
参 数:n--延时长度
返回值 :无
********************************************/
void Delay_Nms(uint n)
{
uint i;
for(i = n;i > 0;i--) Delay_1ms();
}
/*******************************************
函数名称:Write_Cmd
功 能:向液晶中写控制命令
参 数:cmd--控制命令
返回值 :无
********************************************/
void Write_Cmd(uchar cmd)
{
uchar lcdtemp = 0;
LCD_RS_L;
LCD_RW_H;
LCD_DataIn;
do //判忙
{
LCD_EN_H;
_NOP();
lcdtemp = LCD2MCU_Data;
LCD_EN_L;
}
while(lcdtemp & 0x80);
LCD_DataOut;
LCD_RW_L;
MCU2LCD_Data = cmd;
LCD_EN_H;
_NOP();
LCD_EN_L;
}
/*******************************************
函数名称:Write_Data
功 能:向液晶中写显示数据
参 数:dat--显示数据
返回值 :无
********************************************/
void Write_Data(uchar dat)
{
uchar lcdtemp = 0;
LCD_RS_L;
LCD_RW_H;
LCD_DataIn;
do //判忙
{
LCD_EN_H;
_NOP();
lcdtemp = LCD2MCU_Data;
LCD_EN_L;
}
while(lcdtemp & 0x80);
LCD_DataOut;
LCD_RS_H;
LCD_RW_L;
MCU2LCD_Data = dat;
LCD_EN_H;
_NOP();
LCD_EN_L;
}
/*******************************************
函数名称:Ini_Lcd
功 能:初始化液晶模块
参 数:无
返回值 :无
********************************************/
void Ini_Lcd(void)
{
LCD_CMDOut; //液晶控制端口设置为输出
Delay_Nms(500);
Write_Cmd(0x30); //基本指令集
Delay_1ms();
Write_Cmd(0x02); // 地址归位
Delay_1ms();
Write_Cmd(0x0c); //整体显示打开,游标关闭
Delay_1ms();
Write_Cmd(0x01); //清除显示
Delay_1ms();
Write_Cmd(0x06); //游标右移
Delay_1ms();
Write_Cmd(0x80); //设定显示的起始地址
}
/*******************************************
函数名称:Disp_HZ
功 能:控制液晶显示汉字
参 数:addr--显示位置的首地址
pt--指向显示数据的指针
num--显示字符个数
返回值 :无
********************************************/
void Disp_HZ(char addr,char * pt,char num)
{
char i;
Write_Cmd(addr);
for(i = 0;i<num;i++)
Write_Data(*(pt++));
}
Cry12864.h
void Delay_1ms(void);
void Delay(unsigned int n);
void Write_Cmd(unsigned char cod);
void Write_Data(unsigned char dat);
void Ini_Lcd(void);
void Disp_HZ(char addr,char * pt,char num);
void Disp_ND(unsigned char addr,unsigned int thickness);
void Draw_TX(unsigned char Yaddr,unsigned char Xaddr,const unsigned char * dp) ;
void Draw_PM(const unsigned char *ptr);