1、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 P1
2、IN#define MCU2LCD_Data P1OUT/*函数名称: 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-控制命令返回值 :无
3、*/ 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(uch
4、ar 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
5、;LCD_DataIn;LCD_EN_L;LCD_EN_H; readvalue=LCD2MCU_Data;Delay_1ms();LCD_EN_L;return readvalue;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;在指定的位置显示某个字符 *
6、/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(unsi
7、gned char x,unsigned char y,unsigned char color)unsigned char x_Dyte,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; / 计算在该
8、字节中的哪一位 y_Dyte=y/32; /0 为上半屏, 1 为下半屏 y_byte=y&0x1f; / 计算在 031 当中的哪一行 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);Wri
9、te_Cmd(0x80+y_byte); /设定行地址 (y 坐标 )Write_Cmd(0x80+x_Dyte+8*y_Dyte); /设定列地址 (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(G
10、DRAM_lbit); /显示 GDRAM 区低 8 位数据elseWrite_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
11、 char dat)uchar i,j,k;uchar bGDRAMAddrX = 0x80; /GDRAM水 平地址uchar bGDRAMAddrY = 0x80; /GDRAM垂 直地址 for(i=0;i2;i+) for(j=0;j32;j+) for(k=0;k 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 ; el
12、seincy = -1 ;delta_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.141
13、59);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(0x
14、01);/ 清除显示Delay_Nms(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
15、_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); /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)
16、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=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+
17、)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 =200; j 0; j-) _NOP();Write_Cmd(0x01); /clear Delay_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); /clear Delay_Nms(10);GUI_Fill_GDRAM(0x00); Delay_Nms(5);GUI_Circle(33,31,20,1); / 画圆LPM0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1