msp430的lcd12864显示画圆程序Word文档格式.docx
- 文档编号:8365590
- 上传时间:2023-05-11
- 格式:DOCX
- 页数:15
- 大小:18.10KB
msp430的lcd12864显示画圆程序Word文档格式.docx
《msp430的lcd12864显示画圆程序Word文档格式.docx》由会员分享,可在线阅读,更多相关《msp430的lcd12864显示画圆程序Word文档格式.docx(15页珍藏版)》请在冰点文库上搜索。
for(i=150;
i>
0;
i--)_NOP();
}
Delay_Nms
延时N个1ms的时间
n--延时长度
voidDelay_Nms(uintn)
uinti;
for(i=n;
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;
Delay_1ms();
LCD_EN_L;
Write_Data
向液晶中写显示数据
dat--显示数据
voidWrite_Data(uchardat)
_NOP();
lcdtemp=LCD2MCU_Data;
LCD_RS_H;
MCU2LCD_Data=dat;
//读数据
ucharread_data()
uintreadvalue;
MCU2LCD_Data|=0xff;
readvalue=LCD2MCU_Data;
returnreadvalue;
//************************************************************
//***********************************************************
//********************************************************
/****************定位函数*****x(1~8)y(1~4)****************/
voidLCD_SetXY(ucharX,ucharY)
switch(Y){
case1:
Write_Cmd(0x7F+X);
break;
case2:
Write_Cmd(0x8F+X);
case3:
Write_Cmd(0x87+X);
case4:
Write_Cmd(0x97+X);
default:
/****************在指定的位置显示某个字符****************/
voiddisp_char(ucharX,ucharY,ucharwdata)
LCD_SetXY(X,Y);
Write_Data(wdata);
/********************************************************************
函数功能:
在指定的位置显示字符串
******************************************************************/
voiddisp_str(ucharX,ucharY,uchar*Str)
uchartemp;
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);
//设定行地址(y坐标)
//设定列地址(x坐标),并通过8*y_Dyte选定上下屏
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位数据
Write_Data(GDRAM_hbit);
//写高8位数据
Write_Data(GDRAM_lbit|(0x01<
(15-x_byte)));
Write_Data(GDRAM_lbit&
(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);
bGDRAMAddrX=0x88;
//打开绘图模式
//恢复基本指令集,关闭绘图模式
/*********************************************************/
/******************画水平线*********************/
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)
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;
incx=-1;
if(delta_y>
incy=1;
elseif(delta_y==0)
incy=0;
incy=-1;
delta_x=incx*delta_x;
delta_y=incy*delta_y;
delta_y)
distance=delta_x;
StartX+=incx;
StartY+=incy;
distance=delta_y;
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(0x02);
//地址归位
Write_Cmd(0x0c);
//整体显示打开,游标关闭
Write_Cmd(0x01);
//清除显示
Delay_Nms(10);
Write_Cmd(0x06);
//游标右移
Write_Cmd(0x80);
//设定显示的起始地址
Main.c
#include<
msp430g2553.h>
math.h>
stdio.h>
#include"
/****************************************
//画圆
*****************************************/
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
//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;
di+=10+4*(a-b);
b--;
//主函数
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;
16;
Write_Data(0x60+i);
//显示0x60~0x6f对应的字符
//Write_Cmd(0x88);
//写第三行的显示地址
//Write_Data(tishi[i]);
//
Write_Cmd(0x98);
//写第四行的显示地址
Write_Data(op[i]);
for(i=1000;
i>
i--)//延时一会
for(j=200;
j>
j--)
//clear
GUI_Fill_GDRAM(0x00);
fsin2();
//画sin函数
for(j=400;
Delay_Nms(5);
GUI_Circle(33,31,20,1);
//画圆
LPM0;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- msp430 lcd12864 显示 程序