MSP430程序库三12864液晶程序库
msp430程序12864头文件
#ifndef __CRY12864_H__#define __CRY12864_H__#include"delay.h"extern const unsigned char shuzi_table[];#define Busy 0x80#define LCD_DataIn P5DIR=0x00 //数据口方向设置为输入#define lcd_dataout P5DIR=0XFF#define mcu2lcd_data P5OUT#define LCD2MCU_Data P5IN#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&=~BIT2uint i,x;/*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();lcd_dataout;rs_l;rw_l;//lcd_dataout;mcu2lcd_data=cmd;delayms(5);en_h;delayms(5);en_l;}void write_data(uchar dat){lcd_dataout;//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(){en_l;write_cmd(0x30);write_cmd(0x0c);write_cmd(0x01);}void initina2(void) //LCD显示图片(扩展)初始化程序{write_cmd(0x36); //Extended Function Set RE=1: extended instructiondelayms(1); //大于100uS的延时程序write_cmd(0x36); //Extended Function Set:RE=1: extended instruction setdelayms(1); ////大于37uS的延时程序write_cmd(0x3E); //EXFUNCTION(DL=8BITS,RE=1,G=1)delayms(1); //大于100uS的延时程序write_cmd(0x01); //CLEAR SCREENdelayms(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); //清屏,只能清除DDRAMwrite_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 ADDwrite_cmd(0x80); //SET 水平地址HORIZONTAL ADDfor(j=0;j<16;j++){write_data(*adder);adder++;}}//*******显示下半屏内容设置for(i=0;i<32;i++) //{write_cmd((0x80 + i)); //SET 垂直地址VERTICAL ADDwrite_cmd(0x88); //SET 水平地址HORIZONTAL ADDfor(j=0;j<16;j++){write_data(*adder);adder++;}}write_cmd(0x36); //打开绘图显示}#endif。
MSP430单片机驱动12864液晶程序
MSP430单片机驱动12864液晶程序#include <msp430g2553.h>typedef unsigned char uchar;typedef unsigned int uint;#define LCD_PORT_DIR P2DIR //定义P2口#define LCD_PORT_OUT P2OUT#define CS BIT0#define SID BIT1#define SCLK BIT2#define LCD_OUT LCD_PORT_DIR |= CS + SID + SCLK //定义P2.0~2.2为输出#define CS_H LCD_PORT_OUT |= CS#define CS_L LCD_PORT_OUT &= ~CS#define SID_H LCD_PORT_OUT |= SID#define SID_L LCD_PORT_OUT &= ~SID#define SCLK_H LCD_PORT_OUT |= SCLK#define SCLK_L LCD_PORT_OUT &= ~SCLKvoid Delay_1ms(void);void Delay_Nms(uint n);void Write_1byte(uint RW,uint RS,uchar data);void Write_8bits(uchar bit);void Write_Cmd(uchar cmd);void Write_Dat(uchar dat);void Write_Datas(uchar *s);void Disp_Img(uchar *img);void Lcd_Init(void);void Locat_XY(uint x,uint y);void Write_Str(uint x,uint y,uchar *s);void Write_Str1(uint x,uint y, uchar q);//unsigned int SZ_bl[]={48,49,50,51,52,53,54,55,56,57};/*******************************************函数名称:Delay_1ms功能:延时约1ms的时间参数:无返回值:无********************************************/ void Delay_1ms(void){uchar i;for(i = 150;i > 0;i--);}/*******************************************函数名称:Delay_Nms功能:延时约N个1ms的时间参数:n--延时长度返回值:无********************************************/ void Delay_Nms(uint n){uint i;for(i = n;i > 0;i--) Delay_1ms();}/*******************************************函数名称:Write_1byte功能:向LCD写1byte数据参数:RW--读写控制,RS--数据命令控制data--数据RW:0为写,1为读RS:0为命令,1为数据返回值:无********************************************/ void Write_1byte(uint RW,uint RS,uchar data){uchar H_data,L_data,ID = 0xf8;if(RW == 1) ID = ID + 0x04;if(RS == 1) ID = ID + 0x02;H_data = data;H_data &= 0xf0;L_data = data;L_data &= 0x0f;L_data <<= 4;Write_8bits(ID);Delay_1ms();Write_8bits(H_data);Delay_1ms();Write_8bits(L_data);Delay_1ms();}/*******************************************函数名称:Write_8bits功能:向LCD连续写8bits数据参数:bit--数据返回值:无********************************************/ void Write_8bits(uchar bit){uint i;for(i=0;i<8;i++){if(bit & 0x80) SID_H;else SID_L;SCLK_H;bit <<= 1;SCLK_L;}}/*******************************************函数名称:Write_Cmd功能:向LCD写控制命令参数:cmd--控制命令返回值:无********************************************/ void Write_Cmd(uchar cmd){CS_L;_NOP();CS_H;_NOP();Write_1byte(0,0,cmd);Delay_1ms();CS_L;}/*******************************************函数名称:Write_Dat功能:向LCD写显示数据参数:dat--显示数据返回值:无********************************************/void Write_Dat(uchar dat){CS_L;_NOP();CS_H;_NOP();Write_1byte(0,1,dat);Delay_1ms();CS_L;_NOP();}/*******************************************函数名称:Lcd_Init功能:液晶初始化参数:无返回值:无********************************************/void Lcd_Init(void){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();Delay_1ms();}/*******************************************函数名称:Locat_XY功能:设置液晶显示地址参数:x--行地址,y--列地址0<=x<=3,0<=y<=7返回值:无********************************************/ void Locat_XY(uint x,uint y){switch(y){case 0:Write_Cmd(0x80+x);break;case 1:Write_Cmd(0x90+x);break;case 2:Write_Cmd(0x88+x);break;case 3:Write_Cmd(0x98+x);break;default:break;}}/*******************************************函数名称:Write_Datas功能:写字符串数据参数:*s--字符串数组返回值:无********************************************/ void Write_Datas(uchar *s){char i;while(*s>0){Write_Dat(*s);s++;for(i=10;i>0;i--);}}/*******************************************函数名称:Write_Str功能:向指定起始坐标写字符串参数:x--行地址,y--列地址,*s--字符串数组0<=x<=3,0<=y<=7返回值:无********************************************/void Write_Str(uint x,uint y, uchar *s){Locat_XY(x,y);Write_Datas(s);}/*******************************************函数名称:Write_Str1功能:向指定起始坐标写变量参数:x--行地址,y--列地址,q--字符串数组ASCll码值0<=x<=3,0<=y<=7返回值:无********************************************/void Write_Str1(uint x,uint y, uchar q){Locat_XY(x,y);Write_Dat(q);}/*******************************************函数名称:Disp-Img功能:显示图片参数:*img--图片数组返回值:无********************************************/void Disp_Img(uchar *img){uint j=0;uchar x,y;for(y=0;y<32;y++) //垂直坐标32位for(x=0;x<8;x++) //水平坐标16字{Write_Cmd(0x36); //开启扩展指令集Write_Cmd(y+0x80); //先写入垂直坐标Write_Cmd(x+0x80); //再写入水平坐标Write_Cmd(0x30); //基本指令集Write_Dat(img[j++]);Write_Dat(img[j++]);}for(y=0;y<32;y++) //垂直坐标32位for(x=0;x<8;x++) //水平坐标16字{Write_Cmd(0x36); //开启扩展指令集Write_Cmd(y+0x80); //先写入垂直坐标Write_Cmd(x+0x88); //在写入水平坐标Write_Cmd(0x30); //基本指令集Write_Dat(img[j++]);Write_Dat(img[j++]);}}。
基于MSP430的LCD12864显示图片程序
0x0D,0x60,0x00,0xD0,0x80,0x04,0x00,0xAD,0xED,0xF0,0xEE,0x00,0x43,0x40,0x2B,0xFD,
#define RS0P5OUT &= ~BIT5 //RS置低
#define RS1P5OUT |= BIT5 //RS置高
#define RW0P5OUT &= ~BIT6 //RW置低
#define RW1P5OUT |= BIT6 //RW置高
#define E0P5OUT &= ~BIT7 //E置低
#define E1P5OUT |= BIT7 //E置高
#define PSB0P5OUT &= ~BIT0 //PSB置低,串口方式
#define PSB1P5OUT |= BIT0 //PSB置高,并口方式
#define RES0P5OUT &= ~BIT1 //RST置低
#define RES1P5OUT |= BIT1 //RST置高
0xB5,0x60,0x0C,0xA8,0x06,0x40,0xAA,0x94,0xAB,0xFF,0xD4,0x00,0x54,0x80,0x14,0x07,
0xA8,0x09,0x02,0x52,0x18,0x85,0x55,0x57,0xAB,0xFF,0x94,0x00,0xA5,0x20,0x12,0x16,
0x4B,0x2A,0x80,0x4A,0x84,0x48,0x00,0x00,0x2B,0x45,0x53,0x00,0xAA,0xAA,0x00,0x94,
msp430单片机12864二级菜单
#include <msp430x14x.h>#define uchar unsigned char#define uint unsigned int#define LCD_data P5DIR=0XFF //数据口输出#define LCD_CMDOUT P3DIR|=0xe0 //P3口的高三位设置为输出#define LCD_RS_LOW P3OUT &= ~BIT7 //RS=0#define LCD_RS_HIGH P3OUT |=BIT7 //RS=1#define LCD_RW_LOW P3OUT &= ~BIT6 //RW=0#define LCD_RW_HIGH P3OUT |=BIT6 //RW=1#define LCD_EN_LOW P3OUT &= ~BIT5 //EN=0#define LCD_EN_HIGH P3OUT |=BIT5 //EN=1uchar k=0,flag=0,flag1=0;uchar dis1_[] = {"系统初始化. "};uchar dis2_[] = {"系统初始化.. "};uchar dis3_[] = {"系统初始化... "};uchar dis4_[] = {" 按选择键开始! "};uchar dis1[] = {"手1:手机设定"}; //一级菜单1uchar dis2[] = {"机2:管理器"}; //一级菜单2uchar dis3[] = {"菜3:通话"}; //一级菜单3uchar dis4[] = {"单4:信息功能"}; //一级菜单5uchar dis5[] = {"手5:文件管理"}; //一级菜单7uchar dis6[] = {"机6:通讯录"}; //一级菜单8uchar dis7[] = {"菜"}; //一级菜单8uchar dis8[] = {"单"}; //一级菜单8uchar dis1_1[] = {"手1:时间和日期"}; //一级菜单1下的子菜单1 uchar dis2_1[] = {"机2:语言"}; //一级菜单1下的子菜单2 uchar dis3_1[] = {"设3:语音控制"}; //一级菜单1下的子菜单3 uchar dis4_1[] = {"定4:关闭无线电"}; //一级菜单1下的子菜单4uchar dis1_2[] = {"管1:闹铃"}; //一级菜单2下的子菜单1 uchar dis2_2[] = {"理2:视频电话"}; //一级菜单2下的子菜单2 uchar dis3_2[] = {"器3:日历"}; //一级菜单2下的子菜单3 uchar dis4_2[] = {" 4:任务"}; //一级菜单2下的子菜单4uchar dis1_3[] = {"通1:全部"}; //一级菜单3下的子菜单1 uchar dis2_3[] = {"话2:已接来电"}; //一级菜单3下的子菜单2 uchar dis3_3[] = {" 3:未接来电"}; //一级菜单3下的子菜单3 uchar dis4_3[] = {" 4:已拨电话"}; //一级菜单3下的子菜单4uchar dis1_4[] = {"信1:编写新信息"}; //一级菜单4下的子菜单1uchar dis2_4[] = {"息2:收件箱"}; //一级菜单4下的子菜单2uchar dis3_4[] = {"功3:电子邮件"}; //一级菜单4下的子菜单3uchar dis4_4[] = {"能4:草稿箱"}; //一级菜单4下的子菜单4uchar dis1_5[] = {"文1:相册"}; //一级菜单5下的子菜单1uchar dis2_5[] = {"件2:音乐"}; //一级菜单5下的子菜单2uchar dis3_5[] = {"管3:视频"}; //一级菜单5下的子菜单3uchar dis4_5[] = {"理4:图片"}; //一级菜单5下的子菜单4uchar dis1_6[] = {"通1:快速拨号"}; //一级菜单6下的子菜单1uchar dis2_6[] = {"讯2: 我的名片"}; //一级菜单6下的子菜单2uchar dis3_6[] = {"录3: 组群"}; //一级菜单6下的子菜单3uchar dis4_6[] = {" 4:特定号码"}; //一级菜单6下的子菜单4void delay_1ms(uint x){uint i,j;for(j=0;j<x;j++)for(i=0;i<113;i++);}void write_cmd(uchar cmd)//写指令数据到LCD :RS=L,RW=L,E=高脉冲,D0-D7=指令码{LCD_RS_LOW ;LCD_RW_LOW ;LCD_EN_LOW ;P5OUT = cmd;delay_1ms(1);LCD_EN_HIGH;delay_1ms(1);LCD_EN_LOW;}void write_dat(uchar dat)//写显示数据到LCD :RS=H,RW=L,E=高脉冲,D0-D7=数据。
MSP430程序库(一)综述
MSP430程序库<一>综述我与msp430最初的接触来自机械工业出版社出版的《MSP430系列单片机系统工程设计与实践》这本书;我开始参加电子设计竞赛是在大二的暑假,放假之前听说竞赛用MSP430F169的单片机,然后就去图书馆找有关430单片机的书籍了,有关这款单片机的书不多,很幸运的是我借到了这本书;我写430单片机的程序风格很大程度上受到了此书的影响。
程序库的组织方式:程序库解决方案包含多个项目,每个项目是针对一个单元(如:uart异步串行口)的程序库和使用示例,如异步串行口的程序库,下图中UART项目,Uart.c是主要的程序库源代码,Uart.h是对应头文件,使用时需包含此头文件,main.c是使用示例代码。
程序库使用时只需.c文件和对应的.h文件即可。
文件组织方式:程序库的c文件和h文件一一对应,c文件至少包含两个头文件,其中一个是430的头文件,以使用单片机的硬件资源,另一个是其对应的头文件;如Uart.c开头即为#include<msp430x16x.h>#include"Uart.h"为防止重复包含头文件中均有#define语句如Uart.h开头和结尾:#ifndef__UART_H#define__UART_H#endif/*__UART_H*/程序库使用方式:第一步,先把c文件和h文件拷到工程文件夹;然后把c文件添加到项目中在左侧workspace中右击项目,选Add—>Add Files,选择刚添加的c文件;如图:最后在要调用库函数的程序文件中包含拷进来的头文件;之后,就可以正常调用程序库中的函数(H文件中声明的,需要的话,可以自行添加)。
程序库目前打算先从异步串行口写起,多谢网友们的支持了啊。
相关文章:/bbs/article_1077_368318.html。
msp430驱动12864液晶
#ifndef _LCD12864_INCLUDED_#define _LCD12864_INCLUDE/**************************************************************iO口宏定义区***************************************************************/#define CS_L P4OUT &= ~BIT3 //CS=0;sbit CS=P4.3;#define CS_H P4OUT |= BIT3 //CS=1;#define SID_L P4OUT &= ~BIT4 //SID=0;sbit SID=P4.4;#define SID_H P4OUT |= BIT4 //SID=1;#define SCK_L P4OUT &= ~BIT5 //SCK=0;sbit SCK=P4.5;#define SCK_H P4OUT |= BIT5 //SCK=1;#define SID_IN P4DIR &= ~BIT4 //定义p4.4为输入引脚sbit SID=P4.2;#define SID_OUT P4DIR |= BIT4 //定义p4.4为输出引脚/******************************************************************* 常量声明区********************************************************************/ unsigned char AC_TABLE[]={ //坐标编码0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,};/****************************************************************声明:建议读者先查阅我们提供的12864word文档资料,理解12864定坐标的方式。
基于MASP430F2133的AMPIRE12864液晶显示
基于MASP430的AMPIRE12864液晶显示一实现功能通过msp430F2132控制AMPIRE128X64液晶显示(数字或汉字)二12864液晶原理分析12864点阵液晶显示模块(LCM)就是由128*64个液晶显示点组成的一个128列*64行的阵列。
每个显示点对应一位二进制数,1表示亮,0表示灭。
存储这些点阵信息的RAM称为显示数据存储器。
要显示某个图形或汉字就是将相应的点阵信息写入到相应的存储单元中。
图形或汉字的点阵信息由自己设计,问题的关键就是显示点在液晶屏上的位置(行和列)与其在存储器中的地址之间的关系。
由于多数液晶显示模块的驱动电路是由一片行驱动器和两片列驱动器构成,所以12864液晶屏实际上是由左右两块独立的64*64液晶屏拼接而成,每半屏有一个512*8 bits显示数据RAM。
左右半屏驱动电路及存储器分别由片选信号CS1和CS2选择。
显示点在64*64液晶屏上的位置由行号(line,0~63)与列号(column,0~63)确定。
512*8 bits RAM中某个存储单元的地址由页地址(Xpage,0~7)和列地址(Yaddress,0~63)确定。
每个存储单元存储8个液晶点的显示信息。
为了使液晶点位置信息与存储地址的对应关系更直观关,将64*64液晶屏从上至下8等分为8个显示块,每块包括8行*64列个点阵。
每列中的8行点阵信息构成一个8bits二进制数,存储在一个存储单元中。
(注意:二进制的高低有效位顺序与行号对应关系因不同商家而不同)存放一个显示块的RAM区称为存储页。
即64*64液晶屏的点阵信息存储在8个存储页中,每页64个字节,每个字节存储一列(8行)点阵信息。
因此存储单元地址包括页地址(Xpage,0~7)和列地址(Yaddress,0~63)。
例如点亮128*64的屏中(20,30)位置上的液晶点,因列地址30小于64,该点在左半屏第29列,所以CS1有效;行地址20除以8取整得2,取余得4,该点在RAM中页地址为2,在字节中的序号为4;所以将二进制数据00010000(也可能是00001000,高低顺序取决于制造商)写入Xpage=2,Yaddress=29的存储单元中即点亮(20,30)上的液晶点。
用430-spi控制的12864程序
#include <msp430x14x.h>//#define RSH P3OUT|=BIT0 //P5.0//#define RSL P3OUT&=~BIT0 //P5.0//#define RWH P3OUT|=BIT1 //P5.1//#define RWL P3OUT&=~BIT1 //P5.1//#define EH P3OUT|=BIT2 //P5.2//#define EL P3OUT&=~BIT2 //P5.2unsigned char ee[]={0xFF,0xFF,0xFF,0xff,0xFF,0xFF,0xff,0x18,0xbd,0xDB,0xDB,0xD7,0xE7,0xEF,0xEF,0x1F,0xFF,0xFF,0xFF,0x3F,0xBF,0xBF,0xBF,0xA3,0x9D,0xBD,0xBD,0xBD, 0xBD,0x18,0xFF,0xFF};// FFH FFH FFH FFH FFH FFH FFH 18H BDH DBH DBH D7H E7H EFH EFH 1FH;"y",0// DB FFH FFH FFH 3FH BFH BFH BFH A3H 9DH BDH BDH BDH BDH 18H FFH FFH;void delay(char t)// 延时函数{ unsigned int i,j;for(i=0;i<t;i++)for(j=0;j<15;j++);}//测忙//void chk_busy()//{// P3OUT |= 0x01;// TXBUF0 = 0xfc;// delay(1);// TXBUF0 = 0x00;// delay(1);// TXBUF0 =0x00;// delay(1);//P3OUT &= ~0x01; // Latch data into 'HC165// P3OUT |= 0x01;// P4DIR=0X00;// RSL;/// RWH;// EH;// _NOP();// while((P4IN&0x80)==0x80);// / EL;// P4DIR=0XFF;//}void lcd_enable(char x)//LCD显示设置{P3OUT |= 0x01;//chk_busy();TXBUF0 = 0xf8;delay(1);TXBUF0 = 0xf0&x;delay(1);TXBUF0 = x<<4;delay(1);}void write(char x)//写一个字节数据函数{P3OUT |= 0x01;TXBUF0 = 0xfa;delay(1);TXBUF0 = 0xf0&x;delay(1);TXBUF0 = x<<4;delay(1);}void init()//LCD初始化函数{lcd_enable(0x30);//八位、基本指令lcd_enable(0x0c); //打开显示开关lcd_enable(0x01); //清除显示// lcd_enable(0x02);//地址归零// lcd_enable(0x14);//游标右移lcd_enable(0x06); //右移// lcd_enable(0x46);//右移// lcd_enable(0x81);}void write_0(int x,int y,char* s){lcd_enable(0x02);//地址归零char address;switch(x){ case 0: address = 0x80 + y; break;case 1: address = 0x90 + y; break;case 2: address = 0x88 + y; break;case 3: address = 0x98 + y; break;default: return;}lcd_enable(address);while (*s){write(*s++);}}void fan(){lcd_enable(0x34); //打开扩展指令集lcd_enable(0x05);lcd_enable(0x30); //回到基本指令集}void Clear_GDRAM(void){char i,j,k;lcd_enable(0x34); //打开扩展指令集i = 0x80;for(j = 0;j < 32;j++){lcd_enable(i++);lcd_enable(0x80);for(k = 0;k < 16;k++){write(0x00);}}i = 0x80;for(j = 0;j < 32;j++){lcd_enable(i++);lcd_enable(0x88);for(k = 0;k < 16;k++){write(0x00);}}lcd_enable(0x30); //回到基本指令集}void Draw_TX(unsigned char Yaddr,unsigned char Xaddr,const unsigned char * dp) {char j;char k = 0;lcd_enable(0x34); //使用扩展指令集,关闭绘图显示for(j = 0;j < 16;j++){lcd_enable(Yaddr++); //Y地址lcd_enable(Xaddr); //X地址write(dp[k++]); //送两个字节的显示数据write(dp[k++]);}lcd_enable(0x36); //打开绘图显示lcd_enable(0x30); //回到基本指令集模式}void main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;/*下面六行程序关闭所有的IO口*/P1DIR = 0XFF;P1OUT = 0XFF;P2DIR = 0XFF;P2OUT = 0XFF;P3DIR = 0XFF;P3OUT = 0XFF;P4DIR = 0XFF;P4OUT = 0XFF;P5DIR = 0XFF;P5OUT = 0XFF;P6DIR = 0XFF;P6OUT = 0XFF;ME1 |= USPIE0; // Enable USART0 SPI modeUCTL0 |= CHAR + SYNC + MM; // 8-bit SPI Master **SWRST** UTCTL0 |= CKPH + SSEL1 + SSEL0 + STC; // SMCLK, 3-pin mode,P3.1,3-SID,SCLK UBR00 = 0x02; // UCLK/2UBR10 = 0x00; // 0UMCTL0 = 0x00; // no modulationUCTL0 &= ~SWRST; // Initialize USART state machineP3SEL |= 0x0E; // P3.1-3 SPI option selectP3DIR |= 0x01; // P3.0 output directioninit();Clear_GDRAM();Draw_TX(0x81,0x81,ee);write_0(0,3,"你好");fan();write_0(1,3,"你好");write_0(2,1,"欢迎使用123");write_0(3,3,"你好");while(1);/* P1=0x00;write_0(1,3,"你好");write_0(2,1,"欢迎使它");while(1){if(P1&0x01)write_0(2,4,"对了");if(P1&0x02){lcd_enable(0x01); //清除显示lcd_enable(0x02);//地址归零write_0(2,3,"已清空");}}*/}。
msp430串口通信带12864头文件
/******************************************************程序功能:PC通过串口调试精灵向MCU发送数据,MCU将其在1602 液晶上显示-------------------------------------------------------通信格式:N.8.1, 9600------------------------------------------------------测试说明:打开串口调试助手,正确设置通信格式,向从PC机上向学习板发送数据,观察液晶上显示的字符。
******************************************************/#include <msp430.h>#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(); //初始化UARTinit(); //初始化LCDPutString(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缓存空闲?发送完毕UTXIFG0置1,IFG1=0X80TXBUF0 = *ptr++; // 发送数据}while (!(IFG1 & UTXIFG0));TXBUF0 = '\n';}/*******************************************函数名称:InitUART功能:初始化UART端口参数:无返回值:无********************************************/void InitUART(void){UCTL0 |= SWRST;P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXDP3DIR|=BIT4;ME1 |= URXE0 + UTXE0; // Enable USART0 T/RXDUCTL0 |= CHAR; // 8-bit characterUTCTL0 |= SSEL0; // UCLK = ACLKU0BR0 = 0x03; // 32k/9600 - 3.41U0BR1 = 0x00; //UMCTL0 = 0x4A; // ModulationUCTL0 &= ~SWRST; // Initialize USART state machineIE1 |= 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 instructiondelayms(1); //大于100uS的延时程序write_cmd(0x36); //Extended Function Set:RE=1: extended instruction setdelayms(1); ////大于37uS的延时程序write_cmd(0x3E); //EXFUNcTION(DL=8BITS,RE=1,G=1)delayms(1); //大于100uS的延时程序write_cmd(0x01); //cLEAR ScREENdelayms(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); //清屏,只能清除DDRAMwrite_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 ADDwrite_cmd(0x80); //SET 水平地址HORIZONTAL ADDfor(j=0;j<16;j++){write_data(*adder);adder++;}}//*******显示下半屏内容设置for(i=0;i<32;i++) //{write_cmd((0x80 + i)); //SET 垂直地址VERTIcAL ADDwrite_cmd(0x88); //SET 水平地址HORIZONTAL ADDfor(j=0;j<16;j++){write_data(*adder);adder++;}}write_cmd(0x36); //打开绘图显示}/*在显示时DDAM和GDRAM是同时显示的,也就是它们的显示结果是叠加在一起的//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); //同时反白1、3行write_cmd(0x04); //再次反白1、3行,相当于关闭1、3行反白write_cmd(0x05); //同时反白2、4行write_cmd(0x05); //再次反白2、4行,相当于关闭2、4行反白//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。
MSP430驱动12864-3图形点阵液晶(KS0108)
微控论坛原创主贴作者:zhangfuqiang82#include <MSP430x14x.h>//***************数据类型定义****************************#define uint unsigned int#define uchar unsigned char//***************液晶控制线定义****************************#define RS BIT1 //P3.1#define RW BIT0 //P3.0#define E BIT7 //P2.7#define CS1 BIT3 //P3.3#define CS2 BIT2 //P3.2#define RST BIT1 //P2.1//数据线:p4口//**************汉字定义为16*16,纵向,大小10,D0--D7 ,字体Times NewRoman******* *******const unsigned char code1[]={64,66,66,66,254,66,66,66,66,254,66,67,98,64,0,0,32,32,16,8,7,0,0, 0,0,63,0,0,0,0,0,0};//开const unsigned char code2[]={8,8,248,15,8,248,32,48,44,35,32,40,48,96,0,0,32,17,10,4,10,17,0, 63,17,17,17,17,63,0,0,0};//始const unsigned char code3[]={8,8,136,255,72,72,4,4,4,4,252,4,6,4,0,0,1,17,32,31,0,0,0,0,16,32,3 1,0,0,0,0,0};//打const unsigned char code4[]={0,252,68,68,66,67,2,0,252,4,4,4,252,0,0,0,0,15,8,4,4,2,2,0,63,0,2, 4,3,0,0,0};//印const unsigned char code5[]={4,4,132,196,52,12,23,20,20,212,52,20,6,4,0,0,2,1,0,63,0,1,1,17,33, 31,1,1,1,1,0,0};//存const unsigned char code6[]={64,32,248,7,64,204,32,40,168,255,168,176,172,32,0,0,0,0,63,0,0, 31,10,1,63,20,20,20,63,0,0,0};//储const unsigned char code7[]={16,97,134,64,254,2,250,2,254,0,252,0,255,0,0,0,2,62,1,32,19,8,7, 8,51,0,19,32,31,0,0,0};//测const unsigned char code8[]={0,32,32,190,170,170,170,170,170,170,170,191,34,32,0,0,0,32,40, 47,42,42,42,63,42,42,42,47,40,32,0,0};//量const unsigned char code9[]={32,33,230,0,128,136,136,255,136,136,255,136,136,136,0,0,16,8,7, 8,16,40,36,35,32,32,47,32,32,32,0,0};//进const unsigned char code10[]={16,136,68,227,24,32,34,34,34,34,226,35,50,32,0,0,1,0,0,63,0,0,0, 0,16,32,31,0,0,0,0,0};//行const unsigned char code11[]= {0,248,8,8,8,8,255,8,8,8,8,252,8,0,0,0,0,1,1,1,1,1,63,1,1,1,1,1,0, 0,0,0};//中const unsigned char code12[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,8,0,0,0,8,0,0,0,0,0,0};//点const unsigned char code100[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,32,32,32,32,32,32,32,32,32,32, 32,32,32,32,32};//线//******************函数声明*******************************void Init_Clock(void);void Init_IO(void);void Init_LCD (void);void delay (uint us);void delayl(uint ms);void WriteCommand_L (uchar com1);void WriteCommand_R (uchar com2);void WriteData_L (uchar dat1);void WriteData_R(uchar dat2);void ClearScreen(void);void AllScreen(void);void StateCheck(void);void WriteWord(uchar colum,uchar page, const uchar *code);void DrawLine(void);//*************系统主程序********************************** void main( void ){WDTCTL=WDTPW+WDTHOLD; //关闭看门狗Init_Clock();Init_IO();Init_LCD ();WriteWord(0,6, code1);WriteWord(16, 6, code2);WriteWord(48, 6, code3);WriteWord(64, 6, code4);WriteWord(96,6, code5);WriteWord(112, 6, code6);WriteWord(16, 2, code7);WriteWord(32, 2, code8);WriteWord(48, 2, code9);WriteWord(64, 2, code10);WriteWord(80, 2, code11);WriteWord(96, 2, code12);DrawLine();}//**********************IO初始化*************************** void Init_IO(void){P1DIR=0; //设置为输入P1SEL=0; //设置为一般IOP1OUT=0X00;P2DIR=0;P2SEL=0;P2OUT=0X00;P3DIR=0;P3SEL=0;P3OUT=0X00;P4DIR=0;P4SEL=0;P4OUT=0X00;P5DIR=0;P5SEL=0;P5OUT=0X00;P6DIR=0;P6SEL=0;P6OUT=0X00;}//*****************高频时钟初始化************************** void Init_Clock(void){//UTCTL1 = SSEL0;// BCSCTL1=0X00;//BCSCTL2=0X00;unsigned int iq0;BCSCTL1&=~XT2OFF; //打开XT2振荡器do{IFG1 &= ~OFIFG; // 清除振荡器失效标志for (iq0 = 0xFF; iq0 > 0; iq0--); // 延时,等待XT2起振}while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振BCSCTL2=SELM_2+SELS; //选择MCLK、SMCLK为XT2, BCSCTL2|=DIVM_2; //MCLK 4分频MCLK=2MHZ BCSCTL2|=DIVS_2; //SMCLK 4分频SMCLK=2MHZ }//***************延时子程序****************************** void delay (uint us){while(us--);}void delayl (uint ms){uint i,j;for(i=0;i<ms;i++)for(j=0;j<1000;j++);}//*****************状态检查********************************* void StateCheck(void){ uchar cradd1;P3OUT&=~RS;P3OUT|=RW; //RS=0,R/W=1,以便读液晶状态P4DIR=0x00; //P4口为输入口do{P2OUT|=E; //E=1cradd1=P4IN;P2OUT&=~E; //E=0}while((cradd1&0x80)!=0);}//***************写指令代码子程序(左)******************* void WriteCommand_L (uchar com1){ P3OUT&=~CS1; //cs1=0P3OUT|=CS2; //cs2=1 选择左半屏StateCheck(); //检查是否忙P3OUT&=~RW; //rw=0P4DIR=0xff; //P4口为输出口P4OUT=com1;P2OUT|=E; //E=1P2OUT&=~E; //E=0}//*****************写指令代码子程序(右)******************* void WriteCommand_R (uchar com2){ P3OUT|=CS1; //cs1=1P3OUT&=~CS2; //cs2=0StateCheck(); //检查是否忙P3OUT&=~RW; //rw=0P4DIR=0xff; //P4口为输出口P4OUT=com2;P2OUT|=E; //E=1P2OUT&=~E; //E=0}//****************写显示数据子程序(左)********************** void WriteData_L (uchar dat1){P3OUT&=~CS1; //cs1=0P3OUT|=CS2; //cs2=1StateCheck(); //检查是否忙P3OUT|=RS; //rs=1P3OUT&=~RW; //rw=0P4DIR=0xff; //P4口为输出口P4OUT=dat1;P2OUT|=E; //E=1P2OUT&=~E; //E=0}//****************写显示数据子程序(右)********************** void WriteData_R(uchar dat2){P3OUT|=CS1; //cs1=1P3OUT&=~CS2; //cs2=0StateCheck(); //检查是否忙P3OUT|=RS; //rs=1P3OUT&=~RW; //rw=0P4DIR=0xff; //P4口为输出口P4OUT=dat2;P2OUT|=E; //E=1P2OUT&=~E; //E=0}//******************清屏************************void ClearScreen(void){ uchar i,j;for(i=0;i<8;i++){ WriteCommand_L(i|0xb8); //设置页地址WriteCommand_R(i|0xb8);WriteCommand_L(0x40); //设置列地址WriteCommand_R(0x40);for(j=0;j<64;j++) //写0x00{ WriteData_L(0x00);WriteData_R(0x00);}}}//******************满屏************************void AllScreen(void){ uchar i,j;for(i=0;i<8;i++){ WriteCommand_L(i|0xb8); //设置页地址WriteCommand_R(i|0xb8);WriteCommand_L(0x40); //设置列地址WriteCommand_R(0x40);for(j=0;j<64;j++) //写0xff{ WriteData_L(0xff);WriteData_R(0xff);}}}//****************LCD初始化****************************** void Init_LCD (void){P2DIR|=BIT1; //P2.7为输出口P2OUT&=~RST; //RST=0,LCD复位delayl(50); //延时P2OUT|=RST; //rst=1delayl(50);P3DIR|=BIT3; //P3.3为输出口P3OUT&=~CS1; //CS1=0P3DIR|=BIT2; //P3.2为输出口P3OUT&=~CS2; //CS2=0P3DIR|=BIT1; //P3.1为输出口P3OUT&=~RS; //RS=0P3DIR|=BIT0; //P3.0为输出口P3OUT&=~RW; //RW=0P2DIR|=BIT7; //P2.7为输出口P2OUT&=~E; //E=0WriteCommand_L(0xc0);WriteCommand_R(0xc0); //显示开始行WriteCommand_L(0x3f);WriteCommand_R(0x3f); //开显示ClearScreen();}//***********************写汉字*********************************void WriteWord (uchar colum,uchar page, const uchar *code)//page2:页 colum2:列 code 2:字代码{uchar i,j,colum0;uchar flag;for(j=0;j<2;j++){ WriteCommand_L(page|0xb8); //页WriteCommand_R(page|0xb8);colum0=colum;if(colum0>63) //右屏{ colum0=colum0-64;WriteCommand_R(colum0|0x40);flag=1;}else //左屏{WriteCommand_L(colum0|0x40);flag=0;}//*********************for(i=0;i<16;i++){if(flag==0){WriteData_L(*code);}else{WriteData_R(*code);}code++;if(colum0==64) //列=64{colum0=0;if(flag==0){flag=1;WriteCommand_R(colum0|0x40);}else{break;}}// colum++;}page++;}}//*******************画线*********************************void DrawLine(void){uchar i,j=0;for(i=0;i<8;i++){WriteWord(j,4,code100);j+=16;}}调试日记:8月19日;出现问题:液晶无法正常显示。
msp430的lcd12864显示画圆程序
基于msp430g2553的Lcd12864的显示画圆程序注:只用将msp430g2553.h改为其他msp430系列即可使用包含12864.h和main.c两个文件"12864.h"//******************************************************************* // 12864 画图、打点//typedef unsigned char uchar;typedef unsigned int uint;#define LCD_DataIn P1DIR=0x00 //数据口方向设置为输入#define LCD_DataOut P1DIR=0xff //数据口方向设置为输出#define LCD2MCU_Data P1IN#define MCU2LCD_Data P1OUT#define LCD_CMDOut P2DIR|=0x07 //P3口的低三位设置为输出#define LCD_RS_H P2OUT|=BIT0 //P2.0高#define LCD_RS_L P2OUT&=~BIT0 //P2.0低#define LCD_RW_H P2OUT|=BIT1 //P2.1高#define LCD_RW_L P2OUT&=~BIT1 //P2.1低#define LCD_EN_H P2OUT|=BIT2 //2.2高#define LCD_EN_L P2OUT&=~BIT2 //P2.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;Delay_1ms();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;Delay_1ms();LCD_EN_L;}/*******************************************// 读数据********************************************/uchar read_data(){uint readvalue;LCD_DataOut;MCU2LCD_Data |=0xff;LCD_RS_H;LCD_RW_H;LCD_DataIn;LCD_EN_L;LCD_EN_H;readvalue=LCD2MCU_Data;Delay_1ms();LCD_EN_L;return readvalue;}//************************************************************ //*********************************************************** //********************************************************/****************定位函数*****x(1~8)y(1~4)****************/ void LCD_SetXY(uchar X, uchar Y){switch(Y) {case 1: Write_Cmd(0x7F + X);break;case 2: Write_Cmd(0x8F + X);break;case 3: Write_Cmd(0x87 + X);break;case 4: Write_Cmd(0x97 + X);break;default:break;}}//************************************************************/****************在指定的位置显示某个字符****************/void disp_char(uchar X, uchar Y, uchar wdata){LCD_SetXY(X, Y);Write_Data(wdata);}/******************************************************************** 函数功能:在指定的位置显示字符串******************************************************************/ void disp_str(uchar X, uchar Y, uchar *Str){uchar temp;LCD_SetXY(X, Y);temp = *Str;while(temp != 0){Write_Data(temp);temp = *(++Str);}}//********************************************************//打点函数//参数:color=1,该点填充1;color=0,该点填充白色0;//********************************************************void GUI_Point(unsigned char x,unsigned char y,unsigned char color){unsigned char x_Dyte,x_byte; //定义列地址的字节位,及在字节中的哪1 位unsigned char y_Dyte,y_byte; //定义为上下两个屏(取值为0,1),行地址(取值为0~31)unsigned char GDRAM_hbit,GDRAM_lbit;Write_Cmd(0x36); //扩展指令命令/***X,Y 坐标互换,即普通的X,Y 坐标***/x_Dyte=x/16; //计算在16 个字节中的哪一个x_byte=x&0x0f; //计算在该字节中的哪一位y_Dyte=y/32; //0 为上半屏,1 为下半屏y_byte=y&0x1f; //计算在0~31 当中的哪一行Write_Cmd(0x80+y_byte); //设定行地址(y 坐标),即是垂直地址Write_Cmd(0x80+x_Dyte+8*y_Dyte); //设定列地址(x 坐标),并通过8*y_Dyte 选定上下屏,即是水平地址read_data(); //预读取数据GDRAM_hbit=read_data(); //读取当前显示高8 位数据GDRAM_lbit=read_data(); //读取当前显示低8 位数据Delay_Nms(1);Write_Cmd(0x80+y_byte); //设定行地址(y 坐标)Write_Cmd(0x80+x_Dyte+8*y_Dyte); //设定列地址(x 坐标),并通过8*y_Dyte 选定上下屏Delay_Nms(1);if(x_byte<8) //判断其在高8 位,还是在低8 位{if(color==1){Write_Data(GDRAM_hbit|(0x01<<(7-x_byte))); //置位GDRAM 区高8 位数据中相应的点}elseWrite_Data(GDRAM_hbit&(~(0x01<<(7-x_byte)))); //清除GDRAM 区高8 位数据中相应的点Write_Data(GDRAM_lbit); //显示GDRAM 区低8 位数据}else{Write_Data(GDRAM_hbit); //写高8位数据if(color==1)Write_Data(GDRAM_lbit|(0x01<<(15-x_byte))); //置位GDRAM 区高8 位数据中相应的点elseWrite_Data(GDRAM_lbit&(~(0x01<<(15-x_byte))));//清除GDRAM区高8位数据中相应的点}Write_Cmd(0x30); //恢复到基本指令集}//********************************************************//填充GDRAM 数据://参数:dat 为填充的数据//********************************************************void GUI_Fill_GDRAM(unsigned char dat){uchar i,j,k;uchar bGDRAMAddrX = 0x80; //GDRAM 水平地址uchar bGDRAMAddrY = 0x80; //GDRAM 垂直地址for(i=0;i<2;i++){for(j=0;j<32;j++){for(k=0;k<8;k++){Write_Cmd(0x34); //设置为8 位MPU 接口,扩充指令集,绘图模式关Write_Cmd(bGDRAMAddrY+j); //垂直地址YWrite_Cmd(bGDRAMAddrX+k); //水平地址XWrite_Data(dat);Write_Data(dat);}}bGDRAMAddrX = 0x88;}Write_Cmd(0x36); //打开绘图模式Write_Cmd(0x30); //恢复基本指令集,关闭绘图模式}//********************************************************///*********************************************************//******************画水平线*********************/void LCD_Draw_Line_x( uchar X0, uchar X1, uchar Y, uchar Color ){uchar Temp ;if( X0 > X1 ){Temp = X1 ;X1 = X0 ;X0 = Temp ;}for( ; X0 <= X1 ; X0++ )GUI_Point( X0, Y, Color );}//*************画垂直线第x列从第y0行画到第y1行颜色color **************************/void LCD_Draw_Line_Y( uchar X, uchar Y0, uchar Y1, uchar Color ){uchar Temp ;if( Y0 > Y1 ){Temp = Y1 ;Y1 = Y0 ;Y0 = Temp ;}for(; Y0 <= Y1 ; Y0++)GUI_Point( X, Y0, Color);}//**************画斜线(x,y)到(end x,end y)***********************/ void LCD_Draw_Line( uchar StartX, uchar StartY, uchar EndX, uchar EndY, uchar Color ){int distance; /*根据屏幕大小改变变量类型(如改为int型)*/int delta_x, delta_y ;int incx, incy ;do{delta_x = EndX - StartX ;delta_y = EndY - StartY ;if( delta_x > 0 ){incx = 1;}else if( delta_x == 0 ){incx = 0;}else{incx = -1 ;}if( delta_y > 0 ){incy = 1 ;}else if(delta_y == 0 ){incy = 0 ;}else{incy = -1 ;}delta_x = incx * delta_x ;delta_y = incy * delta_y ;if( delta_x > delta_y ){distance = delta_x ;StartX+=incx;StartY+=incy;}else{distance = delta_y;StartX+=incx;StartY+=incy;}GUI_Point( StartX, StartY, Color );}while(distance!=0);}/******************************************* // sin函数********************************************/ void fsin2(){float x,y;uchar x1,y1;for(x=0;x<(4*3.14159);x+=0.1){y=1*sin(3*x);x1=10*x;y1=31-(10*y+0.5); //对y值进行四舍五入 GUI_Point(x1,y1,1);}}/*******************************************函数名称: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_Nms(10);Write_Cmd(0x06); //游标右移Delay_1ms();Write_Cmd(0x80); //设定显示的起始地址}#include <msp430g2553.h>#include <math.h>#include <stdio.h>#include "12864.h"/****************************************// 画圆*****************************************/void GUI_Circle(uchar x0,uchar y0,uchar r,uchar color){char a,b;char di;if(r>31 ||r==0) return; //参数过滤,次液晶显示的最大圆半径为31 a=0;b=r;di=3-2*r; //判断下个点位置的标志while(a<=b){GUI_Point(x0-b,y0-a,color); //3GUI_Point(x0+b,y0-a,color); //0GUI_Point(x0-a,y0+b,color); //1GUI_Point(x0-b,y0-a,color); //7GUI_Point(x0-a,y0-b,color); //2GUI_Point(x0+b,y0+a,color); //4GUI_Point(x0+a,y0-b,color); //5GUI_Point(x0+a,y0+b,color); //6GUI_Point(x0-b,y0+a,color);a++;/***使用Bresenham 算法画圆**/if(di<0)di +=4*a+6;elsedi +=10+4*(a-b);b--;}GUI_Point(x0+a,y0+b,color);}}/****************************************// 主函数*****************************************/void main( void ){uint i,j;uchar op[]={"It's the LCD! "};WDTCTL = WDTPW + WDTHOLD; //关狗Ini_Lcd(); //初始化液晶// Write_Cmd(0x80); //写第一行的显示地址// for(i = 0; i < 10; i++)// Write_Data(0x30 + i); //显示0x30~0x3f对应的字符Write_Cmd(0x90); //写第二行的显示地址for(i = 0; i < 16; i++)Write_Data(0x60 + i); //显示0x60~0x6f对应的字符// Write_Cmd(0x88); //写第三行的显示地址// for(i = 0; i < 16; i++)// Write_Data(tishi[i]); //Write_Cmd(0x98); //写第四行的显示地址for(i = 0; i < 16; i++)Write_Data(op[i]); //for(i = 1000; i > 0; i--) //延时一会{for(j =200; j > 0; j--)_NOP();}Write_Cmd(0x01); //clearDelay_Nms(10);GUI_Fill_GDRAM(0x00);Delay_Nms(10);fsin2(); //画sin函数for(i = 1000; i > 0; i--) //延时一会{for(j =400; j > 0; j--)_NOP();}Write_Cmd(0x01); //clearDelay_Nms(10);GUI_Fill_GDRAM(0x00);Delay_Nms(5);GUI_Circle(33,31,20,1); //画圆LPM0;}。
msp430 ADC多通道采集以及12864液晶显示以及串口发送
//ADC.H#ifndef __ADC_H#define __ADC_H#include <msp430x14x.h>#define uchar unsigned char#define uint unsigned intextern void Trans_val(uchar x,uchar y,uint Hex_Val);extern void ADC_Init();#endif//ADC.C#include <msp430x14x.h>#include "USART0.h"#include"ADC.h"#include "lcd12864.h"#define Num_of_Results 128static uint results0[Num_of_Results]; //保存ADC转换结果的数组static uint results1[Num_of_Results]; //保存ADC转换结果的数组static uint results2[Num_of_Results]; //保存ADC转换结果的数组static uint results3[Num_of_Results]; //保存ADC转换结果的数组//ADC初始化void ADC_Init(){P6SEL = 0x0F; // Enable A/D channel inputsADC12CTL0 = ADC12ON+MSC+SHT0_2; // Turn on ADC12, set sampling time ADC12CTL1 = SHP+CONSEQ_1; // Use sampling timer, single sequence ADC12MCTL0 = INCH_0; // ref+=A Vcc, channel = A0ADC12MCTL1 = INCH_1; // ref+=A Vcc, channel = A1ADC12MCTL2 = INCH_2; // ref+=A Vcc, channel = A2ADC12MCTL3 = INCH_3+EOS; // ref+=A Vcc, channel = A3, end seq. ADC12IE = 0x08; // Enable ADC12IFG.3ADC12CTL0 |= ENC; // Enable conversions}/*******************************************函数名称:Trans_val功能:将16进制ADC转换数据变换成三位10进制真实的模拟电压数据,并在液晶上显示参数:Hex_V al--16进制数据n--变换时的分母等于2的n次方返回值:无********************************************/void Trans_val(uchar x,uchar y,uint Hex_Val){unsigned long caltmp;uint Curr_Volt;caltmp = Hex_Val;caltmp = (caltmp << 5) + Hex_Val; //caltmp = Hex_V al * 33 caltmp = (caltmp << 3) + (caltmp << 1); //caltmp = caltmp * 10Curr_Volt = caltmp >> 12; //Curr_V olt = caltmp / 2^n Display_Value(x,y,Curr_V olt);}/*******************************************函数名称:ADC12ISR功能:ADC中断服务函数,在这里用多次平均的计算P6.0口的模拟电压数值参数:无返回值:无********************************************/#pragma vector=ADC_VECTOR__interrupt void ADC12ISR (void){static uint index = 0;results0[index++] = ADC12MEM0; // Move resultsresults1[index++] = ADC12MEM1; // Move resultsresults2[index++] = ADC12MEM2; // Move resultsresults3[index++] = ADC12MEM3; // Move resultsif(index == Num_of_Results){uchar i;unsigned long sum0=0,sum1=0,sum2=0,sum3=0;index = 0;for(i = 0; i < Num_of_Results; i++){sum0 += results0[i];sum1 += results1[i];sum2 += results2[i];sum3 += results3[i];}sum0 >>= 5; //除以32sum1 >>= 5; //除以32sum2 >>= 5; //除以32sum3 >>= 5; //除以32Display_Num(3,1,sum0);Display_Num(3,2,sum1);Display_Num(3,3,sum2);Display_Num(3,4,sum3);Trans_val(5,1,sum0);Trans_val(5,2,sum1);Trans_val(5,3,sum2);Trans_val(5,4,sum3);}_BIC_SR_IRQ(LPM0_bits); // Clear LPM0, SET BREAKPOINT HERE}//USART.C#include "USART0.h"//以下是串口0的初始化设置void Usart0_Init(){P3SEL |= 0x30; // P3.4,5选择为UART收发端口ME1 |= UTXE0 + URXE0; // 使能USART0收发UCTL0 |= CHAR; // 8-bit characterUTCTL0 |= SSEL0; // UCLK = ACLKUBR00 = 0x0D; // 32k/2400 - 13.65UBR10 = 0x00; //UMCTL0 = 0x6B; // ModulationUCTL0 &= ~SWRST; // 初始化UART0状态机IE1 |= URXIE0; // 使能接收中断}//此函数用来发送一个char型void SentData(uchar num){while (!(IFG1 & UTXIFG0));TXBUF0 = num;}//此函数用来把1~4位十进制数据转化为ASCII编码的形式发送给上位机void Sent_Num(uint num){uchar ge,shi,bai,qian;qian = num/1000;bai = num/100 %10;shi = num/10%10;ge = num%10;SentData(qian+0x30);SentData(bai+0x30);SentData(shi+0x30);SentData(ge+0x30);// SentData('\n');}/*******************************************函数名称:PutSting功能:向PC机发送字符串参数:无返回值:无********************************************/void PutString(uchar *ptr){while(*ptr != '\0'){while (!(IFG1 & UTXIFG0)); // TX缓存空闲?TXBUF0 = *ptr++; // 发送数据}while (!(IFG1 & UTXIFG0));TXBUF0 = '\n';}/*******************************************函数名称:Delays功能:延时一会参数:无返回值:无********************************************/void Delays(void){uchar i=20;uint j;while(i--){j=2000;while(j--);}}//串口中断响应函数#pragma vector=UART0RX_VECTOR__interrupt void usart0_rx (void){if(49==RXBUF0){_BIC_SR_IRQ(LPM0_bits); // Clear LPM0, SET BREAKPOINT HERE}if(50==RXBUF0){ADC12IE = 0x00; // 关闭ADC}}//USART.H#ifndef __USART0_H#define __USART0_H#include <msp430x14x.h>#define uchar unsigned char#define uint unsigned intextern void Usart0_Init();extern void SentData(uchar num);extern void PutString(uchar *ptr);extern void Delays(void);extern void Sent_Num(uint num);#endif//LCD12864.H#ifndef _LCD12864_H#define _LCD12864_H#include <msp430x14x.h>#define CPU_F ((double)8000000)#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))#define uchar unsigned char#define uint unsigned int#define ulong unsigned long/*12864应用指令*/#define CLEAR_SCREEN 0x01 //清屏指令:清屏且AC值为00H#define AC_INIT 0x02 //将AC设置为00H。
LCD模块SMG12864与MSP430的接口及应用
Data I/ O
20 NC
悬空
170
3. 3 指令说明 (1) 初始化设置
表 2 显示开/ 关设置 指令码 3EH
3FH
功能 关显示 开显示
(2) 显示初始行设置
表 3 初始化指令说明
指令码
功能
C0 H
设置显示初始行
(3) 数据控制
控制器内部设有一个数据地址页指针和一个数据地
址列 指 针 , 用 户 可 通 过 他 们 来 访 问 内 部 的 全 部
表 5 状态表
STA7 STA6 STA5 STA4 STA3 STA2 STA1 STA0
D7
D6
D5
D4
D3
D2
D1
D0
STA0 - 4 STA5 STA6 STA7
未用 液晶显示状态
未用 读写操作使能
1 :关闭 0 :显示 1 :禁止 0 :允许
4 硬件电路设计
显示终端的主要功能是从人工腿控制器接收信息 ,我 们在设计时采用了两种通讯方式 ,即无线红外通信和有线 方式 ( RS 232) ,如图 3 所示 。利用 MSP430 F149 的两个串
模块内自带 2 个液晶显示驱动芯片 ,分别控制显示屏 的左区和右区 。每个驱动芯片带有 64 ×64 位 ( 512 B) 的 RAM 缓冲区 (对应关系如图 2 所示) ,其中存储的数据即 为被显示内容的点阵信息 。通过选择对应的 RAM 页地 址和列地址 , 微控制器可以访问全部 RAM 字节 。显示 RAM 的每一位对应显示屏上的一个点 。显示的实现 ,就 是显示 RAM 内容中相应位为 1 ,该点阵亮 ,相应位为 0 ,该 点阵无显示 。对存储器的读取是从头至尾的 ,但在屏幕上 显示的位置是可以设置的 ,通过对显示起始行的设定来设 定显示位置 。
MSP430驱动12864液晶程序
/*******************************************************************************名称:12864液晶操作程序功能:本c文件封装了对12864液晶的一些简单的基本读写操作.封装函数:void Lcd_WriteCmd(unsigned char a); //写指令void Lcd_WriteData(unsigned char a); //写数据intLcd_ReadCmd(); //读指令intLcd_ReadData(); //读数据void Lcd_Init(); //初始化液晶void Lcd_XY(unsigned char a,unsigned char b); //设定光标位置void Clear_GDRAM(void); //清除液晶GDRAM中的随机数据void Draw_PM(constuchar *ptr); //在整个液晶屏幕上画图void Draw_TX(ucharYaddr,ucharXaddr,constuchar * dp); //显示一个16*16大小的图形作者:胡静涛最后修改时间:2011年7月25号备注:该程序应在1M的系统时钟下运行,读忙信号函数已经被封装到除读指令函数以外的函数中.典型应用:Lcd_XY( 1 , 1 );i = 0;while( num1[i] != '\0' ){Lcd_WriteData( num1[i] );i++;}以上函数均进行测试可以正常使用*******************************************************************************/#include<msp430x26x.h>#include"12864LCD.h"//******************************************************************************//12864液晶读指令//典型应用读忙标志:while(Lcd_ReadCmd() & 0x80);//******************************************************************************int Lcd_ReadCmd(){int temp;unsignedchar CLKCMD;CLKCMD = BCSCTL2; //先将时钟寄存器的值读出来BCSCTL2 = SELM_2 + DIVM_3 + (CLKCMD & 0x0e); //重新设定主时钟(不改变从时钟)LCD12864_CMDDIR;LCD12864_DATADIR = 0X00;LCD12864_LCDRS_0;LCD12864_LCDWR_1;LCD12864_LCDEN_0;_NOP();LCD12864_LCDEN_1;_NOP();_NOP();temp = LCD12864_DATAIN;LCD12864_LCDEN_0;BCSCTL2 = CLKCMD; //还原原来的时钟(放在函数最后) return temp;}//****************************************************************************** //12864液晶读数据//****************************************************************************** int Lcd_ReadData(){int temp;unsignedchar CLKCMD;CLKCMD = BCSCTL2; //先将时钟寄存器的值读出来BCSCTL2 = SELM_2 + DIVM_3 + (CLKCMD & 0x0e); //重新设定主时钟(不改变从时钟)while(Lcd_ReadCmd() & 0x80); //读忙信号LCD12864_DATADIR = 0X00;LCD12864_CMDDIR;LCD12864_LCDRS_1;LCD12864_LCDWR_1;LCD12864_LCDEN_0;_NOP();LCD12864_LCDEN_1;_NOP();_NOP();temp = LCD12864_DATAIN;LCD12864_LCDEN_0;BCSCTL2 = CLKCMD; //还原原来的时钟(放在函数最后) return temp;}//****************************************************************************** //12864液晶写指令//****************************************************************************** void Lcd_WriteCmd(uchar a){unsignedchar CLKCMD;CLKCMD = BCSCTL2; //先将时钟寄存器的值读出来BCSCTL2 = SELM_2 + DIVM_3 + (CLKCMD & 0x0e); //重新设定主时钟(不改变从时钟)while(Lcd_ReadCmd() & 0x80); //读忙信号LCD12864_DATADIR = 0XFF;LCD12864_CMDDIR;LCD12864_LCDRS_0;LCD12864_LCDWR_0;LCD12864_LCDEN_0;_NOP();LCD12864_DATA = a;_NOP();LCD12864_LCDEN_1;_NOP();_NOP();LCD12864_LCDEN_0;BCSCTL2 = CLKCMD; //还原原来的时钟(放在函数最后) }//****************************************************************************** //12864液晶写数据//****************************************************************************** void Lcd_WriteData(uchar a){unsignedchar CLKCMD;CLKCMD = BCSCTL2; //先将时钟寄存器的值读出来BCSCTL2 = SELM_2 + DIVM_3 + (CLKCMD & 0x0e); //重新设定主时钟(不改变从时钟)while(Lcd_ReadCmd() & 0x80); //读忙信号LCD12864_DATADIR = 0XFF;LCD12864_CMDDIR;LCD12864_LCDRS_1;LCD12864_LCDWR_0;LCD12864_LCDEN_0;_NOP();LCD12864_DATA = a;_NOP();LCD12864_LCDEN_1;_NOP();_NOP();LCD12864_LCDEN_0;BCSCTL2 = CLKCMD; //还原原来的时钟(放在函数最后) }//****************************************************************************** //12864液晶初始化//****************************************************************************** void Lcd_Init(){Lcd_WriteCmd(0x30);Lcd_WriteCmd(0x0c);Lcd_WriteCmd(0x01);Lcd_WriteCmd(0x80);}//****************************************************************************** //12864液晶光标地址//****************************************************************************** void Lcd_XY(unsignedchar a,unsignedchar b){switch (a){case 1:a = 0x80;break;case 2:a = 0x90;break;case 3:a = 0x88;break;case 4:a = 0x98;break;}Lcd_WriteCmd(a + b - 1);}//****************************************************************************** //清除液晶GDRAM中的随机数据//****************************************************************************** void Clear_GDRAM(void){uchari,j,k;Lcd_WriteCmd(0x34); //打开扩展指令集i = 0x80;for(j = 0;j < 32;j++){Lcd_WriteCmd(i++);Lcd_WriteCmd(0x80);for(k = 0;k < 16;k++){Lcd_WriteData(0x00);}}i = 0x80;for(j = 0;j < 32;j++){Lcd_WriteCmd(i++);Lcd_WriteCmd(0x88);for(k = 0;k < 16;k++){Lcd_WriteData(0x00);}}Lcd_WriteCmd(0x30); //回到基本指令集}//****************************************************************************** //在整个液晶屏幕上画图//****************************************************************************** void Draw_PM(const uchar *ptr){uchari,j,k;Lcd_WriteCmd(0x34); //打开扩展指令集i = 0x80;for(j = 0;j < 32;j++){Lcd_WriteCmd(i++);Lcd_WriteCmd(0x80);for(k = 0;k < 16;k++){Lcd_WriteData(*ptr++);}}i = 0x80;for(j = 0;j < 32;j++){Lcd_WriteCmd(i++);Lcd_WriteCmd(0x88);for(k = 0;k < 16;k++){Lcd_WriteData(*ptr++);}}Lcd_WriteCmd(0x36); //打开绘图显示Lcd_WriteCmd(0x30); //回到基本指令集}//****************************************************************************** //功能:显示一个16*16大小的图形//参数:Yaddr--Y地址// Xaddr--X地址// dp--指向图形数据存放地址的指针//****************************************************************************** void Draw_TX(ucharYaddr,ucharXaddr,const uchar * dp){uchar j;uchar k=0;Yaddr = Yaddr + 0x80;Xaddr = Xaddr + 0x80;Lcd_WriteCmd(0x01); //清屏,只能清除DDRAMLcd_WriteCmd(0x34); //使用扩展指令集,关闭绘图显示for(j=0;j<16;j++){Lcd_WriteCmd(Yaddr++); //Y地址Lcd_WriteCmd(Xaddr); //X地址Lcd_WriteData(dp[k++]);Lcd_WriteData(dp[k++]);}Lcd_WriteCmd(0x36); //打开绘图显示Lcd_WriteCmd(0x30); //回到基本指令集模式}****************************************以上是C文件*************************************** ************************************我是分隔符************************************ ************************************以下是H文件********************************** #ifndef 12864LCD_H#define 12864LCD_H#define uchar unsignedchar#define uint unsignedint#define _12864LCD_DATADIR P4DIR //数据口方向控制#define _12864LCD_DATA P4OUT //数据输出端口#define _12864LCD_DATAIN P4IN //数据输入端口#define _12864LCDDEN BIT2 //LCDEN位#define _12864LCDWR BIT1 //LCDWR位#define _12864LCDRS BIT0 //LCDRS位#define _12864LCD_CMD P3OUT //控制引脚端口#define _12864LCD_CMDDIR P3DIR //控制引脚方向/****************固定写法****************/#define LCD12864_DATADIR _12864LCD_DATADIR#define LCD12864_DATA _12864LCD_DATA#define LCD12864_DATAIN _12864LCD_DATAIN#define LCD12864_LCDEN_1 _12864LCD_CMD |= _12864LCDEN#define LCD12864_LCDEN_0 _12864LCD_CMD &= ~_12864LCDEN#define LCD12864_LCDWR_1 _12864LCD_CMD |= _12864LCDWR#define LCD12864_LCDWR_0 _12864LCD_CMD &= ~_12864LCDWR#define LCD12864_LCDRS_1 _12864LCD_CMD |= _12864LCDRS#define LCD12864_LCDRS_0 _12864LCD_CMD &= ~_12864LCDRS#define LCD12864_CMDDIR _12864LCD_CMDDIR |= _12864LCDRS + _12864LCDWR + _12864LCDENvoid Lcd_WriteCmd(unsignedchar a);void Lcd_WriteData(unsignedchar a);int Lcd_ReadCmd();int Lcd_ReadData();void Lcd_Init();void Lcd_XY(unsignedchar a,unsignedchar b);void Clear_GDRAM(void);void Draw_PM(constunsignedchar *ptr);void Draw_TX(unsignedchar Yaddr,unsignedchar Xaddr,constunsignedchar * dp);#endif。
MSP430 ADC12采集片内温度液晶12864串行显示
#include "msp430x44x.h"#include"12864c.h"static float ADCresult;static float DegC;char qian,ge,shi,bai;uchar s1[]={"当前片内温度显示"};uchar s2[]={"温度:°C"};void change(float a) //处理DegC{qian=(int)a/1000;//千bai=(int)a%1000/100;//百shi=(int)a%100/10; //十ge=(int)a%10;//个s2[6]=0x30+qian;s2[7]=0x30+bai;s2[8]='.';s2[9]=0x30+shi;s2[10]=0x30+ge;}void main(void){unsigned int i;WDTCTL = WDTPW+WDTHOLD; // 停止看门狗定时器P3DIR |= 0XFF; //P3口输出P6SEL |= 0X01;ADC12CTL0 = ADC12ON+REFON+REF2_5V+SHT0_6; // 设置ADC12, 参考电压,采样时间ADC12CTL1 = SHP; // 用采样定时器ADC12MCTL0 = INCH_10+SREF_1; // 选择通道A10, Vref+ADC12IE = 0x01; // 使能ADC12IFG.0init_lcd();_EINT();for (i=0; i<0x3600; i++) // 延时等待参考稳定{}ADC12CTL0 |= ENC; // 使能转换_EINT(); // 使能中断while(1){ADC12CTL0 |= ADC12SC; // 开始转换_BIS_SR(LPM0_bits); // 进入LPM0DegC= (((ADCresult-1615)*704)/4095);DegC = (DegC*100.0);_NOP();}}#pragma vector=ADC_VECTOR__interrupt void ADC12ISR (void){ADCresult = ADC12MEM0; // 读取结果_BIC_SR_IRQ(LPM0_bits); // 清LPM0change(DegC);wr_string(0,0,s1);wr_string(0,1,s2);}/******************12864c.h****************/#ifndef __12864C_H__#define __12864C_H__#define uint unsigned int#define uchar unsigned char#define LCD_SID1 P3OUT|=BIT7#define LCD_SID0 P3OUT&=~BIT7 //WR#define LCD_SCLK1 P3OUT|=BIT6#define LCD_SCLK0 P3OUT&=~BIT6 //EN#define x1 0x80#define x2 0x88#define y 0x80#define comm 0#define dat 1void wr_lcd(uchar dat_comm,uchar content);void delay1(uint us);void delay(uint ms);void init_lcd(void);void clrram(); //清屏void clr_lcd(uchar x,uchar y0,uchar length); //清除lcd任意位置字符void lcd_xy(uchar x,uchar y0);void wr_data(uchar x,uchar y0,uchar data );void wr_string(uchar x,uchar y0,uchar *p);#endifvoid delay1(uint us){while(us--);}void delay(uint ms){uint i,j;for(i=0;i<ms;i++)for(j=0;j<110;j++);}void init_lcd(void){wr_lcd(comm,0x30);//8-BIT控制接口,基本指令集动作wr_lcd(comm,0x01);//清除显示delay(1);wr_lcd(comm,0x06);//光标右移,AC自动加一,整体显示不移动wr_lcd(comm,0x0c);//整体显示ON,光标显示OFF,光标位置不反白闪烁}void clrram(){wr_lcd(comm,0x30);//8-BIT控制接口,基本指令集动作wr_lcd(comm,0x01);//清除显示delay1(180);}//-----------清除lcd任意位置字符-------*///--------position为任一位置的起始地址--*///--length为长度,取值为1-64---/若只清一行最大为16//void clr_lcd(uchar x,uchar y0,uchar length){uint i;uchar pos;switch(y0){case 0: pos=0x80+x;break;case 1: pos=0x90+x;break;case 2: pos=0x88+x;break;case 3: pos=0x98+x;break;default: break;}wr_lcd(comm,pos);for(i=0;i<length;i++){wr_lcd (dat,0x20);//填充空格}}//********写命令或数据**********// void wr_lcd(uchar dat_comm,uchar content) {uchar a,i,j;delay1(50);a=content;LCD_SCLK0;LCD_SID1;for(i=0;i<5;i++){LCD_SCLK1;LCD_SCLK0;}LCD_SID0;LCD_SCLK1;LCD_SCLK0;if(dat_comm)LCD_SID1;elseLCD_SID0;LCD_SCLK1;LCD_SCLK0;LCD_SID0;LCD_SCLK1;LCD_SCLK0;for(j=0;j<2;j++){for(i=0;i<4;i++){if(a&0x80)LCD_SID1;elseLCD_SID0;a=a<<1;LCD_SCLK1;LCD_SCLK0;}LCD_SID0;for(i=0;i<4;i++){LCD_SCLK1;LCD_SCLK0;}}}////*******写地址**********//void lcd_xy(uchar x,uchar y0){uchar pos=0;switch(y0){case 0: pos=0x80+x;break;case 1: pos=0x90+x;break;case 2: pos=0x88+x;break;case 3: pos=0x98+x;break;default:break;}wr_lcd(comm,pos);}//*******显示单个字符**********// void wr_data(uchar x,uchar y0,uchar data ) {uchar pos=0;switch(y0){case 0: pos=0x80+x;break;case 1: pos=0x90+x;break;case 2: pos=0x88+x;break;case 3: pos=0x98+x;break;default:break;}wr_lcd(comm,pos);wr_lcd(dat,data);}//*********写字符串********//////**X取值0-3,Y取值0-7void wr_string(uchar x,uchar y0,uchar *p) {uchar pos=0;uchar cnt=0;switch(y0){case 0: pos=0x80+x;break;case 1: pos=0x90+x;break;case 2: pos=0x88+x;break;case 3: pos=0x98+x;break;default: break;}wr_lcd(comm,pos);while(*(p+cnt)!='\0'){wr_lcd(dat,*(p+cnt));cnt++;}}。
msp430语音存储回放系统带按键控制12864液晶显示
{
TACCR0 += 250; // 250 * 1/2 = 125us 8kHz
if(State == 1)
{
g_arBuffer1[g_cBufferx++]= ADC_8bit();
WDTCTL = WDTPW + WDTHOLD;
int i;
Clk_Set();
IO_Set();
Flash_Reset();
ADC_Init();
DAC_Init();
_EINT();
g_pFlashPointer = (char *)(0x2400);
TimerFlg = 0;
}
else if(State == 3)
{
//DAC12_0DAT = 0x0000;
}
}
#include <msp430x16x.h>
#define uchar unsigned char
#define uint unsigned int
break;
default:
break;
}
}
else if( P1IFG & Play )//播放
{
State = 3;
P6OUT = BIT3;
}
P1IFG = 0x00;
}
#pragma vector=TIMERA0_VECTOR
#define Delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
MSP430正弦波峰峰值检测 12864显示
}
/***********************************************************
*名 称:LCD_pos()
*功 能:设置液晶的显示位置
*入口参数:x:第几行,1~4对应第1行~第4行
* y:第几列,0~15对应第1列~第16列
write_dat(zifu[dis%10]);
write_dat('V');
maxr=0;
i_data<<=1;
}
i_data=cmd;
i_data&=0xf0;
for(i=0;i<8;i++)
{
SID_0;
if(i_data&0x80)
}
i_data=cmd;
i_data<<=4;
for(i=0;i<8;i++)
{
SID_0;
if(i_data&0x80)
SID_1 ;
write_dat(zifu[dis/10000]);
write_dat('.');
write_dat(zifu[dis/1000%10]);
write_dat(zifu[dis/100%10]);
write_dat(zifu[dis/10%10]);
i_data=0xfa;
SCLK_0;
for(i=0;i<8;i++)
{
SID_0;
if(i_data&0x80)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MSP430程序库<三>12864液晶程序库
液晶是单片机系统最常用的显示设备之一,这个程序库是在MSP430F169、MSP1430F1 49单片机上测试通过的,可以放心使用;液晶选用的是金鹏的:OCMJ4X8C型号的128 64液晶;控制液晶用的是并行方式,三个控制口是P3.0、P3.1、P3.2三个IO口,数据用的是P5数据IO口。
硬件介绍:
430的数字IO口:
MSP430F149、MSP430F169均有P1-P6 每个8位共48个IO口;有大量的IO口可供使用,所以对液晶控制可以选用8位平行数据方式;430的每个IO口都是双向IO 口,通过寄存器控制其数据传输方向,很方便实用;有关msp430单片机的IO口介绍可以参考德州仪器提供的用户指南和数据手册等资料。
液晶OCMJ4X8C:
此模块可以显示字母、数字符号、中文字型及图形,具有绘图及文字画面混合显示功能。
提供三种控制接口,分别是8位微处理器接口,4位微处理器接口及串行接口(OCMJ4 X16A/B无串行接口)。
所有的功能,包含显示RAM,字型产生器,都包含在一个芯片里面,只要一个最小的微处理系统,就可以方便操作模块。
这款液晶内置2M-位中文字型ROM (CGROM) 总共提供8192个中文字型(16x16点阵),16K位半宽字型ROM(HCGROM) 总共提供126 个符号字型(16x8点阵),64x 16位字型产生RAM(CGRAM),另外绘图显示画面提供一个64x256点的绘图区域(G DRAM),可以和文字画面混和显示。
OCMJ4X8C的引脚说明:
引脚连接方式:PSB、RST接高电平(3.3v);RS接P3.0;R/W接P3.1;E接P3. 2;DB0-DB7接P5口,电源接3.3v(包括背光)GND接地(包括背光)。
汉字图形显示步骤:
1、显示资料RAM(DDRAM)
显示数据RAM 提供64x2 个字节的空间,最多可以控制4 行16 字(64 个字)的中文字型显示,当输入显示资料RAM时,可以分别显示CGROM,HCGROM 与CGRA M 的字型;本系列模块可以显示三种字型,分别是半宽的HCGROM 字型、CGRAM 字型及中文CGROM 字型,三种字型的选择,由在DDRAM 中写入的编码选择,在00 00H~0006H 的定字型,02H~7FH 的编码中将选择半编码中将选择CGRAM 的自宽英数字的字型,至于A1 以上的编码将自动的结合下一个字节,组成两个字节的编码达成中文字型的编码。
BIG5(A140~D75F)GB(A1A0~F7FF),详细各种字型编码如下:
1). 显示半宽字型:将8 位资料写入DDRAM 中,范围为02H~7FH 的编码。
2). 显示CGRAM 字型:将16 位资料写入DDRAM 中,总共有0000H,0002H,0004H,0006H 四种编码。
3). 显示中文字形:将16 位资料写入DDRAM 中,范围为A140H~D75FH 的编码(BIG5) ,A1A0H~F7FFH 的编码(GB)。
将16 位资料写入DDRAM 方式为透过连写入两个字节的资料来完成,先写入高字节(D15~D8)再写入低字节(D7~D0)。
2、绘图RAM(GDRAM)
绘图显示RAM 提供64x32 个字节的记忆空间(由扩充指令设定绘图RAM 地址),最多可以控制256x64点的二维绘图缓冲空间,在更改绘图RAM 时,由扩充指令设定GDR AM 地址先设垂直地址再设水平地址(连续写入两个字节的数据来完成垂直与水平的坐
标地址),再写入两个8 位的资料到绘图RAM,而地址计数器(AC)会自动加一,整个写入绘图RAM 的步骤如下:
1). 先将垂直的字节坐标(Y)写入绘图RAM 地址。
2). 再将水平的字节坐标(X)写入绘图RAM 地址。
3). 将D15~D8 写入到RAM 中(写入第一个Bytes)。
4). 将D7~D0 写入到RAM 中(写入第二个Bytes)。
液晶屏显示地址:
有关液晶其他的或详细的介绍,请参考12864液晶的资料。
∙程序实现:
∙判忙:等待液晶模块空闲。
液晶模块要求:当模块在接受指令前,微处理顺必须先确认模块内部处于非忙碌
状态,即读取BF 标志时BF需为0,方可接受新的指令;如果在送出一个令前
并不检查BF标志,那幺在前一个指令和这个指令中间必须延迟一段较长的时间,
即是等待前一个指令确实执行完成;在这里,我选用等待忙标志结束。
程序如下:
这样,每次向液晶写命令或数据时,只需先调用此函数即可,该函数将会阻塞,直到忙标志变回0(内部空闲,可以接受命令)。
∙写入数据:向模块内部RAM写入数据。
写入数据到DDRAM即可显示到液晶,写入函数:
同样,调用这个函数也可以向其他RAM写入数据,完成相应操作。
∙写入命令:向模块写入命令。
写入命令可以通过液晶的指令集,控制液晶完成相应的功能。
程序如下:
如果cmd是0x80-0x9F,则是向液晶写入地址;地址表参见前面硬件介绍部分。
∙写入字符串:写入字符串,以显示。
写入字符串即是多次调用写入数据,把字符串写入液晶以供显示。
程序如下:
这是向某个地址写入字符串,液晶显示到相应位置。
这个函数有个要求,就是字
符串是中文字符串;如果不是,每一处的英文必须两个相连,否则将显示乱码,
如果只有一个英文字符,可以加入空格;如:LcdWriteString(0x90,"1 ab
cd你好啊"); 1+空格+abcd+汉字中1只有一个字符,加空格,ab,cd两个,
直接显示到一个汉字的位置。
∙液晶初始化:液晶必须初始化之后才能正常使用。
初始化就是一系列命令,完成液晶状态的初始工作,以使液晶可供正常使用。
程
序如下:
在运行过这个函数之后,液晶方能正常的显示;在调用液晶显示函数前,必须先
调用这个函数。
∙程序实现就先到这儿,还可以加入显示图片等功能;要收拾东西回去了,其他功能暂不实现了,以后需要的时候再加入。
∙使用示例:
这个程序的使用方式和串口程序库的使用方式一样,把C文件加入工程;H文件包含进要调用的程序源文件中即可。
这个函数运行后,将在第二行显示1 abcd你好啊字符串,如果把1后面的空格去掉,中文部分将是乱码。
ClkInit(); 这个函数和前面一个里面调用的一样,把主系统时钟设为8MHz,SMCLK设为1MHz。
有关详细内容参见程序库,mian.c。
到此,液晶的驱动基本完成,其他功能之后再添加了。
如果有不好或不对的地方,欢迎大家提出,谢谢啦。