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 P1IN#define MCU
2、2LCD_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的时间参 数
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_DataI
4、n; 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_E
5、N_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=LCD2MC
6、U_Data; Delay_1ms(); LCD_EN_L; return 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_
7、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
8、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; /计算在该字节中的哪一位 y_Dyte=y/
9、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); Write_Cmd(0x80+y_byte); /设
10、定行地址(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 位数据中相应的点 else Write_Data(GDRAM_hbit&(0x01(7-x_byte); /清除GDRAM 区高8 位数据中相应的点 Write_Data(GDRAM_lbit); /显示GDRAM 区低8 位数据 e
11、lse Write_Data(GDRAM_hbit); /写高8位数据 if(color=1) Write_Data(GDRAM_lbit|(0x01(15-x_byte); /置位GDRAM 区高8 位数据中相应的点 else Write_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
12、= 0x80; /GDRAM 水平地址 uchar 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; else incx = -1 ; if( delta_y 0 ) incy = 1 ; else if(delta
13、_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
14、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
15、(0x0c); /整体显示打开,游标关闭 Delay_1ms(); Write_Cmd(0x01); /清除显示 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; if(r31 |r=0) return; /参数过滤,次液晶显示的最
16、大圆半径为31 a=0; b=r; di=3-2*r; /判断下个点位置的标志 while(a=b) GUI_Point(x0-b,y0-a,color); /3 GUI_Point(x0+b,y0-a,color); /0 GUI_Point(x0-a,y0+b,color); /1 GUI_Point(x0-b,y0-a,color); /7 GUI_Point(x0-a,y0-b,color); /2 GUI_Point(x0+b,y0+a,color); /4 GUI_Point(x0+a,y0-b,color); /5 GUI_Point(x0+a,y0+b,color); /6 G
17、UI_Point(x0-b,y0+a,color); a+;/*使用Bresenham 算法画圆*/ if(di0) di +=4*a+6; else di +=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(
18、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 =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-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2