atmega32用lcd12864画图全集程序.doc_第1页
atmega32用lcd12864画图全集程序.doc_第2页
atmega32用lcd12864画图全集程序.doc_第3页
atmega32用lcd12864画图全集程序.doc_第4页
atmega32用lcd12864画图全集程序.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

atmega32用lcd12864 画图全集程序 先上效果图好的看程序1主程序 #include#include #include #include lcd.h#include draw.h#define uchar unsigned char #define uint unsigned intuchar capv; /此处定义字符串char text_1= 电容电压测试 ;char text_2=时间: 1000 ms ;char text_3=电压门限:50 V;char text_4=ww容电压: . V;void inti_port(void)/端口初使化 DDRA=0xff;PORTA=0xff;DDRB=0xff;PORTB=0xff; /主函数 int main(void) inti_port();init_lcd();while(1) draw_image(); 2. lcd.h/*文件:lcd.h用途:显示*/#ifndef _lcd_H_#define _lcd_H_#define RS (14)#define RW (15)#define EN (16)#define uchar unsigned char #define uint unsigned int /* 函数名称 :chk_busy* 功能描述 :检测LCD忙信号E=1,RS=0,RW=1*/void chk_busy(void) DDRB=0X00;/PA口输入 PORTB=0XFF;/打开上拉 PORTA|=RW; /RW=1 PORTA &=RS; /RS=0 PORTA|=EN; /EN=1 while(PINB&0X80);/读入LCD状态,1=忙,一直等待LCD内部操作完成 DDRB=0XFF; PORTA&=EN; /EN=0 /写指令void WriteCommandLCM(uchar WCLCM) _delay_us(200);chk_busy();PORTA&=RS; /RS=0PORTA&=RW; /RW=0PORTA|=EN; /EN=1PORTB=WCLCM; /输出指令_delay_us(300);PORTA&=EN; /EN=0/写数据void WriteDataLCM(uchar WDLCM)_delay_us(200);chk_busy();PORTA|=RS; /RS=1 PORTA&=RW; /RW=0PORTA|=EN; /EN=1PORTB=WDLCM; /输出数据_delay_us(5);PORTA&=EN; /EN=0/读数据uchar readDataLCM() uchar read;chk_busy();DDRB=0X00;_delay_us(500);PORTA|=RS; /RS=1 PORTA|=RW; /RW=1PORTA|=EN; /EN=1_delay_us(1);read=PINB; /读数据PORTA&=EN; /EN=0DDRB=0Xff;return read;/LCM初始化void LCMInit(void) WriteCommandLCM(0x38); /显示模式设置,开始要求每次检测忙信号WriteCommandLCM(0x01); /显示清屏WriteCommandLCM(0x06); /显示光标移动设置WriteCommandLCM(0x0C); /显示开及光标设置/按指定位置显示一串字符/液晶显示:汉字为16*16,字母及数字为8*16,此次显示的文本/ 从第一行第一列开始,依次向左,如果想在不同的/ 位置显示,只需修改相应的行值即可。液晶显示/ 完毕后,转入语音文本发送。/DisplsyList(X,DData)函数:X为0x80在第一行显示;X为0x90在/第二行显示;X为0x88在第三行显示;X为0x98在/第四行显示;DData为显示数组。void DisplayList(uchar X,char *DData)unsigned char length;unsigned char i=0;char *p;p = DData;length = strlen(p);WriteCommandLCM(X);for(i=0;ilength;i+)WriteDataLCM(DDatai);i+;WriteDataLCM(DDatai);void Display(uchar X,char DData)WriteCommandLCM(X);WriteDataLCM(DData);void Displayread(uchar X,uchar lcdh,uchar lcdl) WriteCommandLCM(X); WriteDataLCM(lcdh); WriteDataLCM(lcdl);#endif3.draw.h/*文件:draw.h用途:画图*/#ifndef _draw_h_#define _draw_h_#include #include#include lcd.h#define uint unsigned int#define uchar unsigned char#define xz1 0x80/1000 0000 上屏地址#define xz2 0x88/1000 1000 下屏地址#define yy 0x80/1000 0000#define cd 0x01 /檫除点#define fd 0x02 /反相点#define hd 0x03 /画点void dimg(uchar);/定义传送数据代码为1unsigned char temp;int x;/定义传送数据代码为1void wr_lcd (uchar dat_comm,uchar content); /写控制字与数据void DrawPoint(uchar X,uchar Y,uchar Type); /画点void lat_disp(uchar data1,uchar data2); /画直线unsigned char ReadByte( void ); /读点void DrawRetic(uchar,uchar,uchar,uchar); /画矩形void DrawLine(uchar x1,uchar y1,uchar x2,uchar y2); /插植法话两点之间线void DrawCircle(uchar x0,uchar y0,uchar r);/x0,y0为圆心坐标,r为圆半径void DrawSineWave();/画波void chk_busy (void);void delay (uint us);void clrram(void);/* 函数名称 :init_lcd* 功能描述 :初始化LCD*/void init_lcd () WriteCommandLCM(0x30); /显示模式设置,开始要求每次检测忙信号 WriteCommandLCM(0x01); /显示清屏 WriteCommandLCM(0x06); /显示光标移动设置 WriteCommandLCM(0x0C); /显示开及光标设置void lat_disp(uchar data1,uchar data2) uchar i,j,x; if(data232) x=xz1; j=data2; else x=xz2; j=data2-32; for(i=0;i4 ; bitt = X & 0x0f ; if( Y 32 ) Row = Y ; else Row = Y - 32 ; Tier += 8 ; WriteCommandLCM(Row + 0x80); WriteCommandLCM(Tier + 0x80); readDataLCM() ; ReadOldH = readDataLCM() ; ReadOldL = readDataLCM() ; WriteCommandLCM(Row + 0x80); WriteCommandLCM(Tier + 0x80); if( bitt 8 ) switch( Color) case cd : ReadOldH &=( ( 0x01 ( 7 - bitt ) ; break ; case hd : ReadOldH |= ( 0x01 ( 7 - bitt ) ; break ; case fd : ReadOldH = ( 0x01 ( 7 - bitt ) ; break ; default : break ; else switch(Color) case cd : ReadOldL &= ( 0x01 ( 15 - bitt ) ; break ; case hd : ReadOldL |= ( 0x01 ( 15 - bitt ) ; break ; case fd : ReadOldL = ( 0x01 ( 15 - bitt ) ; break ; default : break ; WriteDataLCM(ReadOldH); WriteDataLCM(ReadOldL); WriteCommandLCM(0x36);/* 画正方形*/void DrawRetic(uchar z0,uchar y0,uchar z1,uchar y1) /画矩形,x0,y0为左上角坐标,x1,y1为右下角坐标 uchar i;for(i=0;i=z1-z0;i+) DrawPoint(z0+i,y0,hd); DrawPoint(z0+i,y1,hd); for(i=0;i=y1-y0;i+) DrawPoint(z0,y0+i,hd); DrawPoint(z1,y0+i,hd); /*插值法画任意两点之间直线的函数*/void DrawLine(uchar x1,uchar y1,uchar x2,uchar y2) /x1,y1起点坐标;x2,y2终点坐标; uchar x,y; uchar d_x,d_y; uchar err=0; uchar temp=0; if(y2x2) x=x1;x1=x2;x2=x; for ( x=x1;x=x1) temp=1;d_x=x2-x1; else d_x=x1-x2; x=x1; y=y1; DrawPoint(x,y,hd); if(temp&(d_y=d_x) while(x!=x2) if(errd_x) while(y!=y2) d_x=x2-x;d_y=y2-y; if(err0) x=x+1;y=y+1;err=err+d_y-d_x; else y=y+1;err=err-d_x; DrawPoint(x,y,hd); else if(!temp&(d_y=d_x) while(x!=x2) d_x=x-x2;d_y=y2-y; if(errd_x) while(y!=y2) d_x=x-x2;d_y=y2-y; if(err0)x=x-1;y=y+1;err=err+d_y-d_x; else y=y+1;err=err-d_x; DrawPoint(x,y,hd); /*/void DrawCircle(uchar x0,uchar y0,uchar r)/x0,y0为圆心坐标,r为圆半径uchar xn,yn,xi,yi;unsigned int j;xn=cos(0)*r+x0;yn=sin(0)*r+y0;for(j=0;j630;j+)xi=(cos(j*0.01)*r)+x0;yi=(sin(j*0.01)*r)+y0;DrawLine(xn,yn,xi,yi); /在一系列零散的点上,两点两点之间连线,从而得到一条曲线xn=xi;yn=yi; /*/画波*/void DrawSineWave()uchar xn=0;uchar yn=32;uchar i;uchar xi,yi; for(i=0;i127;i+) xi=i; yi=(sin(i*0.1)*32)+32;DrawLine(xn,yn,xi,yi); /在一系列零散的点上,两点两点之间连线,从而得到一条曲线xn=i;yn=yi;/*/* 函数名称 :clrram* 功能描述 :将DDRAM填满20H,并且设定DDRAM的地址计数器(AC)到00H*/void clrram(void) WriteCommandLCM(0x30); WriteCommandLCM(0x01);/* 函数名称 :画图* 功能描述 :分主函数*/void draw_image(void) uchar ai,bz; clrram(); _delay_ms(1); for(ai=0;ai64;ai+) lat_disp(0x00,ai); /清屏 lat_disp(0x00,20); /画直

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论