msp430串口通信带12864头文件

发布时间:2012-09-01 18:11:10   来源:文档文库   
字号:

/******************************************************

程序功能:PC通过串口调试精灵向MCU发送数据,MCU将其在1602

液晶上显示

-------------------------------------------------------

通信格式:N.8.1, 9600

------------------------------------------------------

测试说明:打开串口调试助手,正确设置通信格式,向从PC机上

向学习板发送数据,观察液晶上显示的字符。

******************************************************/

#include

#include "12864.h"

#include"delay.h"

void InitUART(void);

void PutString(uchar *ptr);

uchar table1[]={"波特率:9600"};

uchar table2[]={"接收到的数据为:"};

uchar table[]={"0123456789"};

uchar buffer[100]={0};

uchar i=0,K=0;

/***************主函数************/

void main( void )

{

/*下面六行程序关闭所有的IO*/

uchar *tishi = "sennd data to MCU, and they will be displayed on 12864!";

WDTCTL = WDTPW + WDTHOLD; //关狗

InitUART(); //初始化UART

init(); //初始化LCD

PutString(tishi);

_EINT();

Disp_HZ(0x80,table1,6);

Disp_HZ(0x90,table2,8);

/* while(1)

{

// LPM1;

Disp_HZ(0x80,table1,6);

Disp_HZ(0x90,table2,8);

}*/

}

/*******************************************

函数名称:PutSting

能:向PC机发送字符串

数:ptr--指向发送字符串的指针

返回值 :无

********************************************/

void PutString(uchar *ptr)

{

while(*ptr != '\0')

{

while (!(IFG1 & UTXIFG0)); // TX缓存空闲?发送完毕UTXIFG01IFG1=0X80

TXBUF0 = *ptr++; // 发送数据

}

while (!(IFG1 & UTXIFG0));

TXBUF0 = '\n';

}

/*******************************************

函数名称:InitUART

能:初始化UART端口

数:无

返回值 :无

********************************************/

void InitUART(void)

{

UCTL0 |= SWRST;

P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXD

P3DIR|=BIT4;

ME1 |= URXE0 + UTXE0; // Enable USART0 T/RXD

UCTL0 |= CHAR; // 8-bit character

UTCTL0 |= SSEL0; // UCLK = ACLK

U0BR0 = 0x03; // 32k/9600 - 3.41

U0BR1 = 0x00; //

UMCTL0 = 0x4A; // Modulation

UCTL0 &= ~SWRST; // Initialize USART state machine

IE1 |= URXIE0; // 使能USART0的接收中断

}

/*******************************************

函数名称:UART0_RXISR

能:UART0的接收中断服务函数,在这里唤醒

CPU,使它退出低功耗模式

数:无

返回值 :无

********************************************/

#pragma vector = UART0RX_VECTOR

__interrupt void UART0_RXISR(void)

{

i++;

if(i==32)

{

i=0;

write_cmd(0x01); //清除显示

Disp_HZ(0x80,table1,6);

Disp_HZ(0x90,table2,8);

} //退出低功耗模式

buffer[i]=RXBUF0;

if(i<=15)

{

write_cmd(0x88);

for(K=0;K<=i;K++)

write_data(buffer[K]);

}

else

{

write_cmd(0x88);

for(K=0;K<=15;K++)

write_data(buffer[K]);

write_cmd(0x98);

for(K=16;K<=i;K++)

write_data(buffer[K]);

}

}

/*******************************************

函数名称:PutChar

能:向PC机发送一个字符对应的ASCII

数:zifu--发送的字符

返回值 :无

********************************************/

void PutChar(uchar zifu)

{

while (!(IFG1 & UTXIFG0));

if(zifu > 9) //发送键值1~16对应的ASCII

{

TXBUF0 = 0x30 + zifu/10;

while (!(IFG1 & UTXIFG0));

TXBUF0 = 0x30 + zifu%10;

}

else

{

TXBUF0 = 0x30 + zifu;

}

while (!(IFG1 & UTXIFG0));

TXBUF0 = '\n'; //发送回车字符

}

12864头文件

#ifndef __CRY12864_H__

#define __CRY12864_H__

#include"delay.h"

extern const unsigned char shuzi_table[];

#define Busy 0x80

#define Lcd_dataIn P6DIR=0x00 //数据口方向设置为输入

#define lcd_dataout P6DIR=0XFF

#define mcu2lcd_data P6OUT

#define lcd2mcu_data P6IN

#define lcd_cmdout P3DIR|=0X07

#define rs_h P3OUT|=BIT0

#define rs_l P3OUT&=~BIT0

#define rw_h P3OUT|=BIT1

#define rw_l P3OUT&=~BIT1

#define en_h P3OUT|=BIT2

#define en_l P3OUT&=~BIT2

/*void ifbusy() //读忙状态

{uchar lCdtemp = 0;

while(1)

{ LCD_DataIn;

rs_l;

rw_h;

en_h;

_NOP();

lcdtemp = LCD2MCU_Data;

en_l;

if((lCdtemp&Busy)==0)

break;

}

}*/

void write_cmd(uchar cmd)

{//ifbusy();

rs_l;

rw_l;

//lcd_dataout;

mcu2lcd_data=cmd;

delayms(5);

en_h;

delayms(5);

en_l;

}

void write_data(uchar dat)

{

//ifbusy();

rs_h;

mcu2lcd_data=dat;

delayms(5);

en_h;

delayms(5);

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); //设定显示的起始地址

}*/

void init()

{

lcd_dataout;

lcd_cmdout;

en_l;

write_cmd(0x30);

write_cmd(0x0c);

write_cmd(0x01);

}

void initina2(void) //LcD显示图片(扩展)初始化程序

{

write_cmd(0x36); //Extended Function Set RE=1: extended instruction

delayms(1); //大于100uS的延时程序

write_cmd(0x36); //Extended Function Set:RE=1: extended instruction set

delayms(1); ////大于37uS的延时程序

write_cmd(0x3E); //EXFUNcTION(DL=8BITS,RE=1,G=1)

delayms(1); //大于100uS的延时程序

write_cmd(0x01); //cLEAR ScREEN

delayms(1); //大于100uS的延时程序

}

/*******************************************

函数名称:clear_GDRAM

:清除液晶GDRAM中的随机数据

:

返回值 :

********************************************/

void clear_GDRAM(void)

{

uchar i,j,k;

write_cmd(0x34); //打开扩展指令集

i = 0x80;

for(j = 0;j < 32;j++)

{

write_cmd(i++);

write_cmd(0x80);

for(k = 0;k < 16;k++)

{

write_data(0x00);

}

}

i = 0x80;

for(j = 0;j < 32;j++)

{

write_cmd(i++);

write_cmd(0x88);

for(k = 0;k < 16;k++)

{

write_data(0x00);

}

}

write_cmd(0x30); //回到基本指令集

}

/*******************************************

函数名称:Disp_HZ

能:控制液晶显示汉字

数:addr--显示位置的首地址

pt--指向显示数据的指针

num--显示字符个数

返回值 :无

********************************************/

void Disp_HZ(uchar addr,const uchar * pt,uchar num)

{

uchar i;

write_cmd(addr);

for(i = 0;i < (num*2);i++)

{

write_data(*(pt++));

delayms(1);

}

}

/*******************************************

函数名称:Draw_TX

能:显示一个16*16大小的图形

数:Yaddr--Y地址

Xaddr--X地址

dp--指向图形数据存放地址的指针

返回值 :无

********************************************/

void Draw_TX(uchar Yaddr,uchar Xaddr,const uchar * dp)

{

uchar j;

uchar k=0;

// write_cmd(0x01); //清屏,只能清除DDRAM

write_cmd(0x34); //使用扩展指令集,关闭绘图显示

for(j=0;j<16;j++)

{

write_cmd(Yaddr++); //Y地址

write_cmd(Xaddr); //X地址

write_data(dp[k++]);

write_data(dp[k++]);

}

write_cmd(0x36); //打开绘图显示

// write_cmd(0x30); //回到基本指令集模式

}

/*******************************************

函数名称:DisplayGraphic

:在整个液晶屏幕上画图

:

返回值 :

********************************************/

void DisplayGraphic(const uchar *adder)

{

int i,j;

//*******显示上半屏内容设置

for(i=0;i<32;i++) //

{

write_cmd(0x80 + i); //SET 垂直地址 VERTIcAL ADD

write_cmd(0x80); //SET 水平地址 HORIZONTAL ADD

for(j=0;j<16;j++)

{

write_data(*adder);

adder++;

}

}

//*******显示下半屏内容设置

for(i=0;i<32;i++) //

{

write_cmd((0x80 + i)); //SET 垂直地址 VERTIcAL ADD

write_cmd(0x88); //SET 水平地址 HORIZONTAL ADD

for(j=0;j<16;j++)

{

write_data(*adder);

adder++;

}

}

write_cmd(0x36); //打开绘图显示

}

/*在显示时DDAMGDRAM是同时显示的,也就是它们的显示结果是叠加在一起的

//SM12864液晶基本指令集控制命令测试//

//1.设定DDRAM地址命令

write_cmd(0x90); //设定DDRAM地址,因为此时DDRAM地址已经溢出

//2.显示状态命令

write_cmd(0x08); //整体显示关,游标关,游标位置关

write_cmd(0x0c); //整体显示开,游标关,游标位置关

write_cmd(0x0e); //整体显示开,游标开,游标位置关

write_cmd(0x0f); //整体显示开,游标开,游标位置开

//3.位址归位

write_cmd(0x02); //位址归位,游标回到原点

write_cmd(0x84); //DDRAM地址设为0x88,游标在此闪烁

//4.点设定指令

//(以下四个命令是控制写入字符以后光标及整屏显示的移动)

write_cmd(0x07); //光标右移整体显示左移

write_Data(0x20); //写入两个空格

write_Data(0x20);

write_cmd(0x05); //光标左移整体显示右移

write_Data(0x20); //写入两个空格

write_Data(0x20);

write_cmd(0x06); //光标右移整体显示不移动

write_Data(0x20); //写入两个空格

write_Data(0x20);

write_cmd(0x04); //光标左移整体显示不移动

write_Data(0x20); //写入两个空格

write_Data(0x20);

//5.游标和显示移位控制

//(以下四个命令无需写入显示数据,直接控制光标和整屏显示的移动)

write_cmd(0x10); //光标左移

write_cmd(0x14); //光标右移

write_cmd(0x18); //整体显示左移,光标跟随

write_cmd(0x1c); //整体显示右移,光标跟随

write_cmd(0x0c); //关闭光标

//6.进入扩展功能模式命令

write_cmd(0x34); //打开扩展功能模式,绘图显示关闭

//7.反白命令

write_cmd(0x04); //同时反白13

write_cmd(0x04); //再次反白13行,相当于关闭13行反白

write_cmd(0x05); //同时反白24

write_cmd(0x05); //再次反白24行,相当于关闭24行反白

//8.睡眠模式命令

write_cmd(0x08); //进入睡眠模式

write_cmd(0x0c); //退出睡眠模式

//9.待命模式命令

write_cmd(0x01); //进入待命模式

//10.打开GDRAM显示

write_cmd(0x36); //打开扩展功能模式,打开绘图显示

Draw_TX(0x80,0x84,laba); //设置16*16大小图形

clear_GDRAM(); //清除上电复位后RAM中的随机数值

Draw_TX(0x80,0x84,laba); //重新显示设置16*16大小图形

//11.关闭GDRAM显示

write_cmd(0x34); //打开扩展功能模式,关闭绘图显示

//12.设定基本指令集

write_cmd(0x30); //回到基本指令集

//13.清除显示命令*/

#endif

本文来源:https://www.2haoxitong.net/k/doc/14191ed4240c844769eaee81.html

《msp430串口通信带12864头文件.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式