ATmega128的LCD12864绘图画点画线画矩形等.docx
- 文档编号:8774596
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:23
- 大小:175.55KB
ATmega128的LCD12864绘图画点画线画矩形等.docx
《ATmega128的LCD12864绘图画点画线画矩形等.docx》由会员分享,可在线阅读,更多相关《ATmega128的LCD12864绘图画点画线画矩形等.docx(23页珍藏版)》请在冰豆网上搜索。
ATmega128的LCD12864绘图画点画线画矩形等
基于ATmega128的LCD12864画图(画点,画线,画矩形等)
先上图:
程序:
文件结构:
----------------_main.c---------------
/*
*基于ATmega128的LCD12864画图显示实验
*16MHz
*编译器:
ICCAVR
*已测试通过
*byQinZhengye
*2011-08-07
*/
/*
*硬件接口:
LCD_DATA->PE
*RS->PB0
*RW->PB1
*EN->PB2
*/
#include"my_include.h"
#include"LCD12864_graphics.h"
voidmain()
{
Port_init();//端口初始化
LCD12864_init();
_delay_ms(5);//要等待液晶初始化完毕
LCD12864_string(0,0,"液晶");//写入容
LCD12864_string(1,0,"被屏蔽的");//
LCD12864_string(0,6,"画点");
LCD12864_clear();//图形模式的清屏
LCD12864_dot(36,0,8,1);//在(36,8)处画点(0无用,看定义函数前的说明)
LCD12864_line(90,8,39,8,1);//箭头的形状
LCD12864_dot(40,0,7,1);
LCD12864_dot(40,0,9,1);
LCD12864_dot(41,0,6,1);
LCD12864_dot(41,0,10,1);
LCD12864_line(30,60,116,20,1);
LCD12864_bar(90,45,110,60,1);
LCD12864_rectangle(9,34,40,62,1);
}
------------LCD12864_basic.h-------------
/*
*LCD12864驱动程序----basic
*此头文件有LCD12864的基本的写指令数据
*forATmega128
*16MHz
*编译器:
ICCAVR
*已测试通过
*byQinZhengye
*/
/*宏定义要用到的函数(没用到可以注释掉,以减小目标程序的大小)
*/
//#define__KEY_scanf
#define__LCD12864_string
/*
*definefunctions
*/
voidLCD12864_init(void);
voidLCD12864_cmd(unsignedcharcmd);
voidLCD12864_dat(unsignedchardat);
voidLCD12864_string(unsignedcharY,unsignedcharX,unsignedchar*table);
voidcheck_busy(void);
unsignedcharKEY_scanf(void);
/*
*定义硬件接口(只接8数据+3控制+2电源根线)
*RS0-command;1-data
*RW0-write;1-read
*EN1-input;1->0action
*/
#defineLCD_INPINE
#defineLCD_DDRDDRE
#defineLCD_OUTPORTE
#defineKEY_INPIND
#defineKEY_OUTPORTD
#defineKEY_DDRDDRD
#defineBUSY((LCD_IN&0x80)!
=0)
#defineRS_COMD(PORTB&=~(0x01<<0))
#defineRS_DATA(PORTB|=(0x01<<0))
#defineRW_WRITE(PORTB&=~(0x01<<1))
#defineRW_READ(PORTB|=(0x01<<1))
#defineEN_SET(PORTB|=(0x01<<2))
#defineEN_CLR(PORTB&=~(0x01<<2))
/*键盘扫描
*电路无需电阻,高效行列版
*
*键盘布局:
*
*D3D2D1D0
*||||
*D4--0123
*D5--4567
*D6--89AB
*D7--CDEF
*
*说明:
键盘没有按下则返回0,按下返回对应键值
*/
#ifdef__KEY_scanf
unsignedcharKEY_scanf(void)
{
uchartemp;
KEY_DDR=0x0F;
KEY_OUT=0xF0;
_delay_ms(4);
if((temp=KEY_IN)!
=0xF0)
{
KEY_DDR=0xF0;
KEY_OUT=0x0F;
_delay_ms
(1);
temp=temp|KEY_IN;
switch(temp)
{
case0xE7:
return'0';
case0xEB:
return'1';
case0xED:
return'2';
case0xEE:
return'3';//第一行
case0xD7:
return'4';
case0xDB:
return'5';
case0xDD:
return'6';
case0xDE:
return'7';//第二行
case0xB7:
return'8';
case0xBB:
return'9';
case0xBD:
return'A';
case0xBE:
return'B';//第三行
case0x77:
return'C';
case0x7B:
return'D';
case0x7D:
return'E';
case0x7E:
return'F';//第四行
}
}
return0;
}
#endif
/*LCD12864初始化*/
voidLCD12864_init(void)
{
LCD12864_cmd(0x30);//基本指令,字符模式
LCD12864_cmd(0x06);
LCD12864_cmd(0x0C);//
LCD12864_cmd(0x01);//清屏
LCD12864_cmd(0x80);
}
/*写8位的命令*/
voidLCD12864_cmd(unsignedcharcmd)
{
check_busy();
RW_WRITE;
LCD_OUT=cmd;
_delay_us
(1);//出现乱码请加长延时时间
EN_CLR;
}
/*写8位的数据*/
voidLCD12864_dat(unsignedchardat)
{
check_busy();
RS_DATA;
RW_WRITE;
LCD_OUT=dat;
_delay_us
(1);//出现乱码请加长延时时间
EN_CLR;
}
/*
*写字符串
*Y取值(0~3)
*X取值(0~7)
*table:
要显示的字符串的指针
*/
#ifdef__LCD12864_string
voidLCD12864_string(unsignedcharY,unsignedcharX,unsignedchar*table)
{
unsignedchari;
switch(Y)
{
case0:
LCD12864_cmd(0x80+X);break;
case1:
LCD12864_cmd(0x90+X);break;
case2:
LCD12864_cmd(0x88+X);break;
case3:
LCD12864_cmd(0x98+X);break;
default:
return;
}
for(i=0;table[i]!
='\0';i++)
LCD12864_dat(table[i]);
}
#endif
/*检查忙*/
voidcheck_busy(void)
{
ucharn=200;//控制时间,时间过长强制退出
LCD_OUT=0xFF;
RS_COMD;
RW_READ;
EN_SET;
//_delay_us(10);
while(BUSY==1&&--n>0);
}
-----------LCD12864_graphics.h-------------
/*
*LCD12864驱动程序----graphics
*此头文件有LCD12864的图形模式下的
*清屏,画320*240的图画,
*读指定位置的容,画点,画线,画矩形框,
*填充矩形
*forATmega128
*16MHz
*编译器:
ICCAVR
*已测试通过
*byQinZhengye
*/
/*注意:
本人用ICCAVR作编译器,发现下面的"LCD12864_dot"函数的参数有问题
*定义成"LCD12864_dot(unsignedcharX,unsignedcharY,unsignedcharcolor)"
*当第一个实参"X"是浮点数时,发现传给第二个参数"Y"的值会跟传给"X"的数值一样
*所以下面在两者之间插入一个参数,调用时多写一个数就没事了.如果你知道解决办法麻烦QQ通知一声:
)
*/
/*
*宏定义要用到的函数(没用到可以注释掉,以减小目标程序的大小)
*函数具体容看下面
*/
#define__LCD12864_clear
#define__LCD12864_next
#define__LCD12864_read_8
#define__LCD12864_read_16
#define__LCD12864_dot
#define__LCD12864_line
#define__LCD12864_bar
#define__LCD12864_rectangle
#define__LCD12864_whole_line
//#define__LCD12864_BMP
/*
*声明函数
*/
voidLCD12864_clear(void);
voidLCD12864_next(void);
voidLCD12864_dot(unsignedcharX,unsignedcharDB_X,unsignedcharY,unsignedcharcolor);
voidLCD12864_line(unsignedcharX0,unsignedcharY0,unsignedcharX1,unsignedcharY1,unsignedcharcolor);
voidLCD12864_bar(unsignedcharleft,unsignedcharup,unsignedcharright,unsignedchardown,unsignedcharcolor);
voidLCD12864_rectangle(unsignedcharleft,unsignedcharup,unsignedcharright,unsignedchardown,unsignedcharcolor);
voidLCD12864_whole_line(unsignedcharY,unsignedcharcolor);
voidLCD12864_BMP(unsignedchar*table);
unsignedcharLCD12864_read_8(void);
unsignedintLCD12864_read_16(void);
/*包含基本的函数*/
#include"LCD12864_basic.h"
/*图形模式的清屏*/
#ifdef__LCD12864_clear
voidLCD12864_clear(void)
{
unsignedchari,j;
LCD12864_cmd(0x34);//关图形模式的显示
for(i=0;i<32;i++)
{
LCD12864_cmd(0x80+i);
LCD12864_cmd(0x80);
for(j=0;j<32;j++)
LCD12864_dat(0x00);
}
LCD12864_cmd(0x36);//开图形模式的显示
}
#endif
/*编辑位置移到下一个8位
*可以移到低8位单独编辑容
*/
#ifdef__LCD12864_next
voidLCD12864_next(void)
{
ucharn=100;
RS_COMD;
RW_READ;
EN_SET;
while(BUSY==1&&--n>0);
RS_DATA;
EN_CLR;
}
#endif
/*从LCD12864读数据
*注意:
LCD12864的读操作,第一次读到的是地址
*第二次读到的才是该地址对应的数据
*/
#ifdef__LCD12864_read_8
unsignedcharLCD12864_read(void)
{
unsignedchartemp;
check_busy();
LCD_OUT=0xFF;
RS_DATA;
RW_READ;
EN_SET;
LCD_DDR=0x00;
_delay_us
(1);
temp=LCD_IN;
EN_CLR;
LCD_DDR=0xFF;
return(temp);
}
/*读LCD12864的一个字节*/
unsignedcharLCD12864_read_8(void)
{
LCD12864_read();//注意:
读两次才读到数据
returnLCD12864_read();
}
#endif
/*读LCD12864的16位数据*/
#ifdef__LCD12864_read_16
unsignedintLCD12864_read_16(void)
{
unsignedint_16_data;
unsignedcharL_dat;
_16_data=LCD12864_read_8();
L_dat=LCD12864_read();
return(_16_data<<8)|L_dat;
}
#endif
/*
*向LCD12864在(X,Y)出写一个点
*
*0<=X<=127
*0<=Y<=63
*color:
0->擦点,非0->画点
*(传来的DB_X没用看文件前面的注意)
*/
#ifdef__LCD12864_dot
voidLCD12864_dot(unsignedcharX,unsignedcharDB_X,unsignedcharY,unsignedcharcolor)
{
unsignedchartemp,temp2=0;
if((0x01&(X>>3))!
=0)
temp2=1;
DB_X=X>>4;
X=X&0x07;//X=X%8;
if(Y>=32)
{
DB_X+=8;
Y-=32;
}
LCD12864_cmd(0x80+Y);
LCD12864_cmd(0x80+DB_X);
if(temp2)
LCD12864_next();
temp=LCD12864_read_8();
if(color!
=0)
temp|=(0x80>>X);
else
temp&=~(0x80>>X);
LCD12864_cmd(0x80+Y);
LCD12864_cmd(0x80+DB_X);
if(temp2)
LCD12864_next();
LCD12864_dat(temp);
}
#endif
/*
*向LCD12864画一条线
*起点(X0,Y0),终点(X1,Y1)
*0<=X<=127
*0<=Y<=63
*/
#ifdef__LCD12864_line
voidLCD12864_line(unsignedcharX0,unsignedcharY0,
unsignedcharX1,unsignedcharY1,ucharcolor)
{
LCD12864_cmd(0x34);//关闭显示
if(X0==X1)//K=1
{
if(Y0>Y1)
{
X1=Y0;
Y0=Y1;
Y1=X1;
}
while(Y0<=Y1)
LCD12864_dot(X0,0,Y0++,color);
LCD12864_cmd(0x36);//打开显示
return;
}
if(Y0==Y1)//K=0
{
if(X0>X1)
{
Y1=X0;
X0=X1;
X1=Y1;
}
while(X0<=X1)
LCD12864_dot(X0++,0,Y0,color);
LCD12864_cmd(0x36);//打开显示
return;
}
else//K!
=0&&K!
=1
{
float_K;
chartemp1=(X1 (X0-X1): (X1-X0); chartemp2=(Y1 (Y0-Y1): (Y1-Y0); if(temp1 { _K=(float)temp1/temp2; temp2=(Y0>Y1)? (-1): (1); if(X0>X1) _K=-_K; temp1=1; LCD12864_dot(X0,0,Y0,color); do { Y0+=temp2; LCD12864_dot(X0+_K*temp1,0,Y0,color); temp1++; }while(Y0! =Y1); } else//X { _K=(float)temp2/temp1; temp2=(X0>X1)? (-1): (1); if(Y0>Y1) _K=-_K; temp1=1; LCD12864_dot(X0,0,Y0,color); do { X0+=temp2; LCD12864_dot(X0,0,Y0+_K*temp1,color); temp1++; }while(X0! =X1); } } LCD12864_cmd(0x36);//打开显示 } #endif /* *向LCD12864画一个填充矩形 * *left: 左,X坐标 *up: 上,Y坐标 *right: 右,X坐标 *down: 下,Y坐标 * *0<=(left&right)<=127 *0<=(up&down)<=63 */ #ifdef__LCD12864_bar voidLCD12864_bar(unsignedcharleft,unsignedcharup, unsignedcharright,unsignedchardown,ucharcolor) { unsignedchartemp; LCD12864_cmd(0x34); if(left>right) { temp=left; left=right; right=temp; } if(up>down) { temp=up; up=down; down=temp; } for(;up<=down;up++) for(temp=left;temp<=right;temp++) LCD12864_dot(temp,0,up,color); LCD12864_cmd(0x36); } #endif /*
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ATmega128 LCD12864 绘图 画线 矩形