12864控制forMSP430

来源:互联网 发布:淘宝拉夏贝尔折扣店 编辑:程序博客网 时间:2024/05/27 06:53
/*****************************************************************//文件名:12864.c//描述:该文件定义与12864有关的各种接口、函数,适用于MSP430F149//编写人:小邪@清水//版本号:2.01*****************************************************************/#include <msp430x14x.h>#include "12864.h"#define uchar unsigned char #define uint unsigned int #define BIT(x)(1 << (x))unsigned char NUM[] = {"0123456789."};uchar Address[4][8] = {{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}};/*****************************************************************//关于12864的一些宏定义//注意:各项数据都要根据实际使用IO口更改*****************************************************************/#define CS      0//CS  = P3.0#define SID     1//SID = P3.1  #define CLK     2//CLK = P3.2#define PORT    P3OUT  #define DIR     P3DIR/*************************************************************************//名称: delay_Nus//参数: 延时的时间n//返回值: 无//功能: 延时 n Ns的时间*************************************************************************/void delay_Nus(uint n){uchar i;for(i = n;i > 0;i--)        _NOP();}/*************************************************************************//名称: delay_1ms//参数: 无//返回值: 无//功能: 延时 1 ms的时间*************************************************************************/ void delay_1ms(void){uchar i;for(i = 150;i > 0;i--)  _NOP();} /*************************************************************************//名称: delay_Nms//参数: 延时的时间n//返回值: 无//功能: 延时 1 ms的时间*************************************************************************/void delay_Nms(uint n){    uint i = 0;        for(i = n;i > 0;i--)        delay_1ms();}/*************************************************************************//名称: LcdInit//参数: 无//返回值: 无//功能: 初始化12864*************************************************************************/void LcdInit(void){DIR |= BIT(CLK) + BIT(SID) + BIT(CS);//相应的位端口设置为输出delay_Nms(100);//延时等待液晶完成复位Send(0,0x30);//功能设置:一次送8位数据,基本指令集delay_Nus(72);Send(0,0x02);//DDRAM地址归位delay_Nus(72);Send(0,0x0c);//显示设定:开显示,不显示光标,不做当前显示位反白闪动delay_Nus(72);Send(0,0x01);//清屏,将DDRAM的位址计数器调整为“00H”delay_Nus(72);Send(0,0x06);//功能设置,点设定:显示字符/光标从左到右移位,DDRAM地址加1delay_Nus(72);}  /*************************************************************************//名称: Send//参数: 数据类型type:0--控制命令,1--显示数据,transdata--发送的数据//返回值: 无//功能: 向12864发送一个字节的数据,可用于控制可用于显示*************************************************************************/void Send(uchar type,uchar transdata){uchar firstbyte = 0xf8;uchar temp;uchar i,j = 3;if(type) firstbyte |= 0x02;PORT |=  BIT(CS); PORT &= ~BIT(CLK);while(j > 0){if(j == 3) temp = firstbyte;else if(j == 2) temp = transdata&0xf0;else  temp = (transdata << 4) & 0xf0;for(i = 8;i > 0;i--){if(temp & 0x80)PORT |=  BIT(SID); elsePORT &= ~BIT(SID);PORT |= BIT(CLK);temp <<= 1;PORT &= ~BIT(CLK);}//三个字节之间一定要有足够的延时,否则易出现时序问题if(j == 3) delay_Nus(600); else       delay_Nus(200);j--;} PORT &= ~BIT(SID);       PORT &= ~BIT(CS);}/*************************************************************************//名称: Clear_GDRAM//参数: 数据类型type:0--控制命令,1--显示数据,transdata--发送的数据//返回值: 无//功能: 向12864发送一个字节的数据,可用于控制可用于显示*************************************************************************/void Clear_GDRAM(void){    uchar i,j,k;    Send(0,0x34);//打开扩展指令集i = 0x80;            for(j = 0;j < 32;j++){  Send(0,i++);      Send(0,0x80);    for(k = 0;k < 16;k++)  {      Send(1,0x00);   }}i = 0x80; for(j = 0;j < 32;j++){     Send(0,i++);     Send(0,0x88);      for(k = 0;k < 16;k++)  {       Send(1,0x00);    } }   Send(0,0x30);//回到基本指令集}/*************************************************************************//名称: WriteStr//参数: 显示的地址addr,待显示数据的指针,显示长度//返回值: 无//功能: 在12864指定位置上显示字符串,包括汉字  可以显示ASCII码表上字符,但长度应该减半*************************************************************************/void WriteStr(uchar addr,const uchar * pt,uchar num){    uchar i;Send(0,addr);             for(i = 0;i < (num*2);i++)    Send(1,*(pt++)); } /*************************************************************************//名称: DrawPic//参数: 待显示图片的指针//返回值: 无//功能: 在整个屏幕上画一个图片*************************************************************************/void DrawPic(const uchar *ptr){    uchar i,j,k;    Send(0,0x34);//打开扩展指令集i = 0x80;            for(j = 0;j < 32;j++){  Send(0,i++);      Send(0,0x80);    for(k = 0;k < 16;k++)  {      Send(1,*ptr++);   }}i = 0x80; for(j = 0;j < 32;j++){     Send(0,i++);     Send(0,0x88);      for(k = 0;k < 16;k++)  {       Send(1,*ptr++);    } }    Send(0,0x36);//打开绘图显示Send(0,0x30);//回到基本指令集}/*************************************************************************//名称: Draw1Pic//参数: Yaddr--Y地址,Xaddr--X地址//返回值: 无//功能: 在液晶上描绘一个16*16的图形*************************************************************************/void Draw1Pic(uchar Yaddr,uchar Xaddr,const uchar * dp) {    uchar j;    uchar k = 0;Send(0,0x34);//使用扩展指令集,关闭绘图显示    for(j = 0;j < 16;j++)    {        Send(0,Yaddr++);//Y地址          Send(0,Xaddr);//X地址        Send(1,dp[k++]);//送两个字节的显示数据         Send(1,dp[k++]);        }Send(0,0x36);//打开绘图显示Send(0,0x30);//回到基本指令集模式}/*************************************************************************//名称: LocateXY//参数: 待写入地址,横坐标X,纵坐标Y(从0开始)//返回值: 无//功能: 12864指针指向指定位置*************************************************************************/void LocateXY(uchar X,uchar Y){Send(0,Address[Y][X]);}/*************************************************************************//名称: WriteNum//参数: 待写入数字Num,横坐标X,纵坐标Y(从0开始)//返回值: 无//功能: 在指定位置显示一个数字(不超过5位且小于65536)*************************************************************************/void WriteNum(uint n,uchar x,uchar y){uchar five,four,three,two,one;LocateXY(x,y);if((n >= 10000)&&(n <= 65535)){five = n / 10000;four = (n % 10000) / 1000;three = ((n - five * 10000) % 1000) / 100;two = ((n - five * 10000) % 1000 - three * 100 ) / 10;one = ((n - five * 10000) % 1000 - three * 100 ) % 10;Send(1,NUM[five]);Send(1,NUM[four]);Send(1,NUM[three]);Send(1,NUM[two]);Send(1,NUM[one]);}if((n >= 1000)&&(n <= 9999)){four = n / 1000;three = (n % 1000) / 100;two = (n % 1000 - three * 100 ) / 10;one = (n % 1000 - three * 100 ) % 10;Send(1,NUM[four]);Send(1,NUM[three]);Send(1,NUM[two]);Send(1,NUM[one]);}if((n >= 100)&&(n <= 999)){three = n / 100;two = (n - three * 100 ) / 10;one = (n - three * 100 ) % 10;Send(1,NUM[three]);Send(1,NUM[two]);Send(1,NUM[one]);}if((n >= 10)&&(n <= 99)){two = n / 10;one = n % 10;Send(1,NUM[two]);Send(1,NUM[one]);}if((n >= 0)&&(n <= 9))Send(1,NUM[n]);}/*************************************************************************//名称:WriteFloat//参数:待写入浮点数,unsigned char x,unsigned char y//返回值:无//功能:在给定位置显示一个浮点数(整数部分和小数部分都不超过两位)*************************************************************************/void WriteFloat(float n,uchar x,uchar y){uint Integer,Decimal;//Integer用于存放整数部分,Decimal用于存放小数部分Integer = (uint)(n/1);Decimal = (uint)(n * 100 - Integer * 100);        if(Integer<10)        {          LocateXY(x,y);          Send(1,' ');          WriteNum(Integer,x+1,y);        }        if(Integer>=10)WriteNum(Integer,x,y);Send(1,NUM[10]);WriteNum(Decimal,x+2,y);}/*************************************************************************//名称:WriteArrary//参数:待写入数组,数组长度,unsigned char x,unsigned char y//返回值:无//功能:在给定位置显示一个数组*************************************************************************/void WriteArrary(uint *a,uint n,uchar x,uchar y){  uchar i;  LocateXY(x,y);  for(i = 0;i < n;i ++)  {    a[i] = a[i] + '0';    Send(1,a[i]);  }}