12864控制forMSP430
2015-09-17 来源:eefocus
- /*****************************************************************
- //文件名 :12864.c
- //描述 :该文件定义与12864有关的各种接口、函数,适用于MSP430F149
- //编写人 :小邪@清水
- //版本号 :2.01
- *****************************************************************/
- #include
- #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地址加1
- delay_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);
- else PORT &= ~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]);
- }
- }
上一篇:MSP430学习笔记(1)看门狗
下一篇:1602控制forMSP430
相关文章