msp430的lcd12864显示画圆程序.docx
《msp430的lcd12864显示画圆程序.docx》由会员分享,可在线阅读,更多相关《msp430的lcd12864显示画圆程序.docx(15页珍藏版)》请在冰点文库上搜索。
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
#defineLCD_CMDOutP2DIR|=0x07//P3口的低三位设置为输出
#defineLCD_RS_HP2OUT|=BIT0//P2.0高
#defineLCD_RS_LP2OUT&=~BIT0//P2.0低
#defineLCD_RW_HP2OUT|=BIT1//P2.1高
#defineLCD_RW_LP2OUT&=~BIT1//P2.1低
#defineLCD_EN_HP2OUT|=BIT2//2.2高
#defineLCD_EN_LP2OUT&=~BIT2//P2.2低
/*******************************************
函数名称:
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;
}
//************************************************************
//***********************************************************
//********************************************************
/****************定位函数*****x(1~8)y(1~4)****************/
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_x(ucharX0,ucharX1,ucharY,ucharColor)
{
ucharTemp;
if(X0>X1)
{
Temp=X1;
X1=X0;
X0=Temp;
}
for(;X0<=X1;X0++)
GUI_Point(X0,Y,Color);
}
//*************画垂直线第x列从第y0行画到第y1行颜色color**************************/
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;
if(r>31||r==0)return;//参数过滤,次液晶显示的最大圆半径为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
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);//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;
}