msp430的lcd12864显示画圆程序_第1页
msp430的lcd12864显示画圆程序_第2页
msp430的lcd12864显示画圆程序_第3页
msp430的lcd12864显示画圆程序_第4页
msp430的lcd12864显示画圆程序_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于 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_Dat

2、a P1OUT#define LCD_CMDOutP2DIR|=0x07#define LCD_RS_HP2OUT|=BIT0#define LCD_RS_LP2OUT&=BIT0#define LCD_RW_HP2OUT|=BIT1#define LCD_RW_LP2OUT&=BIT1#define LCD_EN_HP2OUT|=BIT2#define LCD_EN_LP2OUT&=BIT2/P3 口的低三位设置为输出/P2.0 高/P2.0 低/P2.1 高/P2.1 低/2.2 高/P2.2 低/*函数名称: Delay_1ms功 能:延时约 1ms 的时间参 数:无 返回值 :无 *

3、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

4、 / 判忙 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();l

5、cdtemp = 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;retu

6、rn readvalue;定位函数x(18)y(14)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);Wr

7、ite_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_D

8、yte,x_byte; /定义列地址的字节位,及在字节中的哪 1 位unsigned char y_Dyte,y_byte; /定义为上下两个屏 (取值为 0, 1),行地址 (取值 为 031)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; / 计算在 031 当中的

9、哪一行 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

10、); /设定列地址 (x 坐标 ),并通过 8*y_Dyte 选定上下屏Delay_Nms(1);if(x_byte8) / 判断其在高 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 位数据elseWrite_Data(GDRAM_hbit); / 写高 8

11、位数据 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

12、bGDRAMAddrY = 0x80; /GDRAM垂 直地址 for(i=0;i2;i+) for(j=0;j32;j+) for(k=0;k X1 ) Temp = X1 ;X1 = X0 ;X0 = Temp ; for( ; X0 Y1 )Temp = Y1 ;Y1 = Y0 ;Y0 = Temp ;for(; Y0 0 )incx = 1;else if( delta_x = 0 )incx = 0; elseincx = -1 ;if( delta_y 0 )incy = 1 ;else if(delta_y = 0 )incy = 0 ; elseincy = -1 ;delta

13、_x = incx * delta_x ;delta_y = incy * delta_y ;if( delta_x delta_y )distance = delta_x ;StartX+=incx;StartY+=incy;elsedistance = 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

14、(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_Nm

15、s(10);Write_Cmd(0x06);/ 游标右移Delay_1ms();Write_Cmd(0x80);/ 设定显示的起始地址Main.c #include #include #include #include 12864.h/*/ 画圆*/void GUI_Circle(uchar x0,uchar y0,uchar r,uchar color)char a,b;char di;31if(r31 |r=0) return; / 参数过滤,次液晶显示的最大圆半径为 a=0;b=r;di=3-2*r; / 判断下个点位置的标志while(a=b)GUI_Point(x0-b,y0-a,c

16、olor); /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); /4/GUI_Point(x0+a,y0-b,color); /5GUI_Point(x0+a,y0+b,color); /6/ GUI_Point(x0-b,y0+a,color);a+;/* 使用 Bresenham 算法画圆 */if(di0)di +=4*a+6;elsedi

17、+=10+4*(a-b);b-;GUI_Point(x0+a,y0+b,color);/ 主函数void main( void )uint i,j;uchar op=Its the LCD! ;WDTCTL = WDTPW + WDTHOLD; / 关狗Ini_Lcd();/ 初始化液晶/Write_Cmd(0x80);/ 写第一行的显示地址/for(i = 0; i 10; i+)/Write_Data(0x30 + i);/ 显示 0x300x3f 对应的字符Write_Cmd(0x90);/ 写第二行的显示地址for(i = 0; i 16; i+)Write_Data(0x60 + i);/ 显示 0x600x6f 对应的字符/Write_Cmd(0x88);/ 写第三行的显示地址/for(i = 0; i 16; i+)/Write_Data(tishii);/Write_Cmd(0x98);/ 写第四行的显示地址for(i = 0; i 0; i-)/ 延时一会for(j

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论