msp430的lcd12864显示画圆程序.docx

上传人:b****9 文档编号:26333770 上传时间:2023-06-17 格式:DOCX 页数:15 大小:82.43KB
下载 相关 举报
msp430的lcd12864显示画圆程序.docx_第1页
第1页 / 共15页
msp430的lcd12864显示画圆程序.docx_第2页
第2页 / 共15页
msp430的lcd12864显示画圆程序.docx_第3页
第3页 / 共15页
msp430的lcd12864显示画圆程序.docx_第4页
第4页 / 共15页
msp430的lcd12864显示画圆程序.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

msp430的lcd12864显示画圆程序.docx

《msp430的lcd12864显示画圆程序.docx》由会员分享,可在线阅读,更多相关《msp430的lcd12864显示画圆程序.docx(15页珍藏版)》请在冰豆网上搜索。

msp430的lcd12864显示画圆程序.docx

msp430的lcd12864显示画圆程序

基于msp430g2553的Lcd12864的显示画圆程序

注:

只用将msp430g2553.h改为其他msp430系列即可使用包含12864.h和main.c两个文件

"12864.h"//*******************************************************************//12864画图、打点

//

//数据口方向设置为输入

//数据口方向设置为输出

typedefunsignedcharuchar;typedefunsignedintuint;

#defineLCD_DataInP1DIR=0x00

#defineLCD_DataOutP1DIR=0xff

#defineLCD2MCU_DataP1IN

#defineMCU2LCD_DataP1OUT

/*******************************************

函数名称:

Delay_1ms

功能:

延时约1ms的时间

参数:

无返回值:

无********************************************voidDelay_1ms(void)

{

uchari;

for(i=150;i>0;i--)_NOP();

}/*******************************************函数名称:

Delay_Nms功能:

延时N个1ms的时间参数:

n--延时长度

返回值:

********************************************/voidDelay_Nms(uintn)

{

uinti;

for(i=n;i>0;i--)Delay_1ms();

}

/*******************************************函数名称:

Write_Cmd功能:

向液晶中写控制命令参数:

cmd--控制命令

返回值:

********************************************/voidWrite_Cmd(ucharcmd){

ucharlcdtemp=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--显示数据

返回值:

********************************************/voidWrite_Data(uchardat)

{

ucharlcdtemp=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;

}

/*******************************************

//读数据

********************************************

ucharread_data()

{

uintreadvalue;

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;

returnreadvalue;

}

voidLCD_SetXY(ucharX,ucharY){

switch(Y){

case1:

Write_Cmd(0x7F+X);break;

case2:

Write_Cmd(0x8F+X);break;

case3:

Write_Cmd(0x87+X);break;

case4:

Write_Cmd(0x97+X);break;default:

break;

}

}

在指定的位置显示某个字符****************/

voiddisp_char(ucharX,ucharY,ucharwdata){

LCD_SetXY(X,Y);

Write_Data(wdata);

}

/********************************************************************函数功能:

在指定的位置显示字符串******************************************************************/voiddisp_str(ucharX,ucharY,uchar*Str)

{

uchartemp;

LCD_SetXY(X,Y);

temp=*Str;

while(temp!

=0)

{

Write_Data(temp);

temp=*(++Str);

}

}

//********************************************************

//打点函数

//参数:

color=1,该点填充1;color=0,该点填充白色0;voidGUI_Point(unsignedcharx,unsignedchary,unsignedcharcolor)

{

unsignedcharx_Dyte,x_byte;//定义列地址的字节位,及在字节中的哪1位

unsignedchary_Dyte,y_byte;//定义为上下两个屏(取值为0,1),行地址(取值为0~31)

unsignedcharGDRAM_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;//计算在0~31当中的哪一行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);//设定列地址(x坐标),并通过8*y_Dyte选定上下屏

Delay_Nms

(1);

if(x_byte<8)//判断其在高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位数据

}

else

{

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为填充的数据//********************************************************voidGUI_Fill_GDRAM(unsignedchardat)

{

uchari,j,k;

ucharbGDRAMAddrX=0x80;//GDRAM水平地址

ucharbGDRAMAddrY=0x80;//GDRAM垂直地址for(i=0;i<2;i++)

{for(j=0;j<32;j++)

{for(k=0;k<8;k++)

{

Write_Cmd(0x34);//设置为8位MPU接口,扩充指令集,绘图模式关Write_Cmd(bGDRAMAddrY+j);/垂/直地址Y

Write_Cmd(bGDRAMAddrX+k);//水平地址X

Write_Data(dat);

Write_Data(dat);

}

}

bGDRAMAddrX=0x88;

}

Write_Cmd(0x36);//打开绘图模式

Write_Cmd(0x30);//恢复基本指令集,关闭绘图模式}

//

voidLCD_Draw_Line_Y(ucharX,ucharY0,ucharY1,ucharColor){

ucharTemp;

if(Y0>Y1)

{

Temp=Y1;

Y1=Y0;

Y0=Temp;

}

for(;Y0<=Y1;Y0++)

GUI_Point(X,Y0,Color);

}

//**************

画斜线(x,y)到(endx,endy)***********************/

voidLCD_Draw_Line(ucharStartX,ucharStartY,ucharEndX,ucharEndY,ucharColor)

{

intdistance;/*根据屏幕大小改变变量类型(如改为int型)*/intdelta_x,delta_y;

intincx,incy;

do{

delta_x=EndX-StartX;delta_y=EndY-StartY;if(delta_x>0)

{

incx=1;

}

elseif(delta_x==0)

{

incx=0;

}else

{

incx=-1;

}

if(delta_y>0)

{

incy=1;

}

elseif(delta_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函数

********************************************voidfsin2()

{

floatx,y;

ucharx1,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

功能:

初始化液晶模块

数:

返回值:

********************************************/

voidIni_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_Nms(10);

Write_Cmd(0x06);

//游标右移

Delay_1ms();

Write_Cmd(0x80);

//设定显示的起始地址

Main.c#include

#include

#include

#include"12864.h"

/****************************************

//画圆

*****************************************/

voidGUI_Circle(ucharx0,uchary0,ucharr,ucharcolor)

{

chara,b;

chardi;

31

if(r>31||r==0)return;//参数过滤,次液晶显示的最大圆半径为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/GUI_Point(x0-b,y0+a,color);

a++;

/***使用Bresenham算法画圆**/

if(di<0)

di+=4*a+6;

else

di+=10+4*(a-b);

b--;

}

GUI_Point(x0+a,y0+b,color);

}

}

//主函数

voidmain(void)

{

uinti,j;

ucharop[]={"It'stheLCD!

"};

WDTCTL=WDTPW+WDTHOLD;//关狗

Ini_Lcd();//初始化液晶

//

Write_Cmd(0x80);

//写第一行的显示地址

//

for(i=0;i<10;i++)

//

Write_Data(0x30+i)

;//显示0x30~0x3f对应的字符

Write_Cmd(0x90);

//写第二行的显示地址

for(i=0;i<16;i++)

Write_Data(0x60+i);

//显示0x60~0x6f对应的字符

//

Write_Cmd(0x88);

//写第三行的显示地址

//

for(i=0;i<16;i++)

//

Write_Data(tishi[i]);

//

Write_Cmd(0x98);

//写第四行的显示地址

for(i=0;i<16;i++)

Write_Data(op[i]);

//

for(i=1000;i>0;i--)//延时一会

{

for(j=200;j>0;j--)_NOP();

}

Write_Cmd(0x01);//clearDelay_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);//clearDelay_Nms(10);

GUI_Fill_GDRAM(0x00);Delay_Nms(5);

GUI_Circle(33,31,20,1);//画圆

LPM0;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 哲学历史

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1