ATmega128的LCD12864绘图画点画线画矩形等Word下载.docx
- 文档编号:21910782
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:23
- 大小:175.55KB
ATmega128的LCD12864绘图画点画线画矩形等Word下载.docx
《ATmega128的LCD12864绘图画点画线画矩形等Word下载.docx》由会员分享,可在线阅读,更多相关《ATmega128的LCD12864绘图画点画线画矩形等Word下载.docx(23页珍藏版)》请在冰豆网上搜索。
//在(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
*/
/*宏定义要用到的函数(没用到可以注释掉,以减小目标程序的大小)
//#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<
#defineRW_WRITE(PORTB&
1))
#defineRW_READ(PORTB|=(0x01<
#defineEN_SET(PORTB|=(0x01<
2))
#defineEN_CLR(PORTB&
/*键盘扫描
*电路无需电阻,高效行列版
*
*键盘布局:
*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:
1'
case0xED:
2'
case0xEE:
3'
//第一行
case0xD7:
4'
case0xDB:
5'
case0xDD:
6'
case0xDE:
7'
//第二行
case0xB7:
8'
case0xBB:
9'
case0xBD:
A'
case0xBE:
B'
//第三行
case0x77:
C'
case0x7B:
D'
case0x7D:
E'
case0x7E:
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)
RS_DATA;
LCD_OUT=dat;
*写字符串
*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);
case2:
LCD12864_cmd(0x88+X);
case3:
LCD12864_cmd(0x98+X);
default:
return;
for(i=0;
table[i]!
='
\0'
i++)
LCD12864_dat(table[i]);
/*检查忙*/
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的图画,
*读指定位置的容,画点,画线,画矩形框,
*填充矩形
/*注意:
本人用ICCAVR作编译器,发现下面的"
LCD12864_dot"
函数的参数有问题
*定义成"
LCD12864_dot(unsignedcharX,unsignedcharY,unsignedcharcolor)"
*当第一个实参"
X"
是浮点数时,发现传给第二个参数"
Y"
的值会跟传给"
的数值一样
*所以下面在两者之间插入一个参数,调用时多写一个数就没事了.如果你知道解决办法麻烦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);
/*包含基本的函数*/
LCD12864_basic.h"
/*图形模式的清屏*/
#ifdef__LCD12864_clear
voidLCD12864_clear(void)
unsignedchari,j;
LCD12864_cmd(0x34);
//关图形模式的显示
i<
32;
LCD12864_cmd(0x80+i);
LCD12864_cmd(0x80);
for(j=0;
j<
j++)
LCD12864_dat(0x00);
LCD12864_cmd(0x36);
//开图形模式的显示
/*编辑位置移到下一个8位
*可以移到低8位单独编辑容
#ifdef__LCD12864_next
voidLCD12864_next(void)
ucharn=100;
/*从LCD12864读数据
*注意:
LCD12864的读操作,第一次读到的是地址
*第二次读到的才是该地址对应的数据
#ifdef__LCD12864_read_8
unsignedcharLCD12864_read(void)
unsignedchartemp;
LCD_DDR=0x00;
_delay_us
(1);
temp=LCD_IN;
LCD_DDR=0xFF;
return(temp);
/*读LCD12864的一个字节*/
unsignedcharLCD12864_read_8(void)
LCD12864_read();
//注意:
读两次才读到数据
returnLCD12864_read();
/*读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;
*向LCD12864在(X,Y)出写一个点
*0<
=X<
=127
=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!
temp|=(0x80>
X);
else
temp&
=~(0x80>
LCD12864_dat(temp);
*向LCD12864画一条线
*起点(X0,Y0),终点(X1,Y1)
#ifdef__LCD12864_line
voidLCD12864_line(unsignedcharX0,unsignedcharY0,
unsignedcharX1,unsignedcharY1,ucharcolor)
//关闭显示
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);
else//K!
=0&
K!
=1
float_K;
chartemp1=(X1<
X0)?
(X0-X1):
(X1-X0);
chartemp2=(Y1<
Y0)?
(Y0-Y1):
(Y1-Y0);
if(temp1<
temp2)//Y
_K=(float)temp1/temp2;
temp2=(Y0>
Y1)?
(-1):
(1);
if(X0>
_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)?
if(Y0>
Y1)
LCD12864_dot(X0,0,Y0,color);
X0+=temp2;
LCD12864_dot(X0,0,Y0+_K*temp1,color);
}while(X0!
=X1);
*向LCD12864画一个填充矩形
*left:
左,X坐标
*up:
上,Y坐标
*right:
右,X坐标
*down:
下,Y坐标
=(left&
right)<
=(up&
down)<
#ifdef__LCD12864_bar
voidLCD12864_bar(unsignedcharleft,unsignedcharup,
unsignedcharright,unsignedchardown,ucharcolor)
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);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ATmega128 LCD12864 绘图 画线 矩形
![提示](https://static.bdocx.com/images/bang_tan.gif)