ATmega128的_LCD12864_绘图(画点_画线_画矩形等)_第1页
ATmega128的_LCD12864_绘图(画点_画线_画矩形等)_第2页
ATmega128的_LCD12864_绘图(画点_画线_画矩形等)_第3页
ATmega128的_LCD12864_绘图(画点_画线_画矩形等)_第4页
ATmega128的_LCD12864_绘图(画点_画线_画矩形等)_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

1、基于ATmega128的LCD12864画图(画点,画线,画矩形等)先上图:程序:文件结构:- _main.c -/* *基于 ATmega128 的 LCD12864 画图显示实验 *16MHz * 编译器: ICCAVR *已测试通过 * by Qin Zhengye* 2011-08-07 */* *硬件接口: LCD_DATA -> PE *RS -> PB0 *RW -> PB1 *EN -> PB2 */#include "my_include.h"#include "LCD12864_graphics.h"void

2、main()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_lin

3、e( 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 * 此头文

4、件有LCD12864的基本的写指令数据 * for ATmega128 * 16MHz * 编译器: ICCAVR * 已测试通过 * by Qin Zhengye*/* 宏定义要用到的函数( 没用到可以注释掉, 以减小目标程序的大小 ) */#define _KEY_scanf#define _LCD12864_string/* * define functions */void LCD12864_init( void );void LCD12864_cmd ( unsigned char cmd );void LCD12864_dat ( unsigned char dat );void

5、LCD12864_string( unsigned char Y, unsigned char X, unsigned char *table );void check_busy( void );unsigned char KEY_scanf( void );/* * 定义硬件接口( 只接 8数据 + 3控制 + 2电源 根线 ) * RS 0-command; 1-data * RW 0-write ; 1-read * EN 1-input ; 1->0 action */#define LCD_INPINE#define LCD_DDRDDRE#define LCD_OUTPORT

6、E#define KEY_INPIND#define KEY_OUTPORTD#define KEY_DDRDDRD#define BUSY(LCD_IN & 0x80) != 0)#define RS_COMD( PORTB &= (0x01 << 0) )#define RS_DATA( PORTB |= (0x01 << 0) )#define RW_WRITE( PORTB &= (0x01 << 1) )#define RW_READ( PORTB |= (0x01 << 1) )#define EN_SET(

7、PORTB |= (0x01 << 2) )#define EN_CLR( PORTB &= (0x01 << 2) )/*键盘扫描 *电路无需电阻,高效行列版 * *键盘布局: * * D3 D2 D1 D0 * | | | | * D4- 0 1 2 3 * D5- 4 5 6 7 * D6- 8 9 A B * D7- C D E F * *说明: 键盘没有按下则返回0, 按下返回对应键值 */#ifdef_KEY_scanfunsigned char KEY_scanf( void )uchar temp;KEY_DDR = 0x0F;KEY_OUT =

8、 0xF0;_delay_ms( 4 );if( (temp = KEY_IN) != 0xF0 )KEY_DDR = 0xF0;KEY_OUT = 0x0F;_delay_ms( 1 );temp = temp | KEY_IN;switch( temp )case 0xE7: return '0'case 0xEB: return '1'case 0xED: return '2'case 0xEE: return '3'/ 第一行case 0xD7: return '4'case 0xDB: return &#

9、39;5'case 0xDD: return '6'case 0xDE: return '7'/ 第二行case 0xB7: return '8'case 0xBB: return '9'case 0xBD: return 'A'case 0xBE: return 'B'/ 第三行case 0x77: return 'C'case 0x7B: return 'D'case 0x7D: return 'E'case 0x7E: return &#

10、39;F'/ 第四行return 0;#endif/*LCD12864初始化*/void LCD12864_init( void )LCD12864_cmd( 0x30 );/ 基本指令, 字符模式LCD12864_cmd( 0x06 );LCD12864_cmd( 0x0C );/ LCD12864_cmd( 0x01 );/ 清屏LCD12864_cmd( 0x80 );/*写8位的命令*/void LCD12864_cmd( unsigned char cmd )check_busy();RW_WRITE;LCD_OUT = cmd;_delay_us( 1 );/ 出现乱码请加

11、长延时时间EN_CLR;/*写8位的数据*/void LCD12864_dat( unsigned char dat )check_busy();RS_DATA;RW_WRITE;LCD_OUT = dat;_delay_us( 1 );/ 出现乱码请加长延时时间EN_CLR;/* *写字符串 *Y 取值 ( 0 3 ) *X 取值 ( 0 7 ) * table: 要显示的字符串的指针 */#ifdef_LCD12864_stringvoid LCD12864_string( unsigned char Y, unsigned char X, unsigned char *table )un

12、signed char i;switch( Y )case 0: LCD12864_cmd( 0x80 + X );break;case 1: LCD12864_cmd( 0x90 + X );break;case 2: LCD12864_cmd( 0x88 + X );break;case 3: LCD12864_cmd( 0x98 + X );break;default: return ;for( i = 0; tablei != '0' i+ )LCD12864_dat( tablei );#endif/*检查忙*/void check_busy( void )uchar

13、 n = 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 的图画, * 读指定位置的内容, 画点, 画线, 画矩形框, * 填充矩形 * for ATmega128 * 16MHz * 编译器: ICCAVR * 已测试通过 * by

14、 Qin Zhengye */*注意:本人用ICCAVR作编译器, 发现下面的 "LCD12864_dot" 函数的参数有问题 *定义成 "LCD12864_dot ( unsigned char X, unsigned char Y, unsigned char color )" *当第一个实参 "X" 是浮点数时, 发现传给第二个参数 "Y" 的值会跟传给 "X" 的数值一样 *所以下面在两者之间插入一个参数, 调用时多写一个数就没事了. 如果你知道解决办法麻烦QQ通知一声 :) */* *

15、 宏定义要用到的函数( 没用到可以注释掉, 以减小目标程序的大小 ) * 函数具体内容看下面 */#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/* *声明函数 */void LCD12864_c

16、lear( void );void LCD12864_next ( void );void LCD12864_dot ( unsigned char X, unsigned char DB_X, unsigned char Y, unsigned char color );void LCD12864_line( unsigned char X0, unsigned char Y0, unsigned char X1, unsigned char Y1, unsigned char color );void LCD12864_bar ( unsigned char left, unsigned

17、char up, unsigned char right, unsigned char down, unsigned char color );void LCD12864_rectangle ( unsigned char left, unsigned char up, unsigned char right, unsigned char down, unsigned char color );void LCD12864_whole_line( unsigned char Y, unsigned char color );void LCD12864_BMP( unsigned char *ta

18、ble );unsigned char LCD12864_read_8( void );unsigned int LCD12864_read_16( void );/*包含基本的函数*/#include "LCD12864_basic.h"/*图形模式的清屏*/#ifdef_LCD12864_clearvoid LCD12864_clear( void )unsigned char i,j;LCD12864_cmd( 0x34 );/ 关图形模式的显示for( i = 0; i < 32; i+ )LCD12864_cmd( 0x80 + i );LCD12864_c

19、md( 0x80 );for( j = 0; j < 32; j+ )LCD12864_dat( 0x00 );LCD12864_cmd( 0x36 );/ 开图形模式的显示#endif/*编辑位置移到下一个8位 *可以移到低8位单独编辑内容 */#ifdef_LCD12864_nextvoid LCD12864_next( void )uchar n = 100;RS_COMD;RW_READ;EN_SET;while( BUSY = 1 && -n > 0 );RS_DATA;EN_CLR;#endif/*从LCD12864读数据 *注意: LCD12864的读

20、操作, 第一次读到的是地址 * 第二次读到的才是该地址对应的数据 */#ifdef _LCD12864_read_8unsigned char LCD12864_read( void )unsigned char temp;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的一个字节*/unsigned char LCD12864_read_8( void )LC

21、D12864_read();/ 注意: 读两次才读到数据return LCD12864_read();#endif/*读LCD12864的16位数据*/#ifdef_LCD12864_read_16unsigned int LCD12864_read_16( void )unsigned int _16_data;unsigned char L_dat;_16_data = LCD12864_read_8();L_dat = LCD12864_read();return (_16_data << 8) | L_dat;#endif/* *向LCD12864在( X, Y )出写一个

22、点 * *0 <= X <= 127 *0 <= Y <= 63 *color: 0 -> 擦点, 非0 -> 画点 *( 传来的DB_X没用 看文件前面的注意 ) */#ifdef _LCD12864_dotvoid LCD12864_dot( unsigned char X, unsigned char DB_X, unsigned char Y, unsigned char color )unsigned char temp, temp2 = 0;if( (0x01 & (X >> 3) != 0 )temp2 = 1;DB_X =

23、 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 );elsetemp &= (0x80 >> X );LCD12864_cmd( 0x80 + Y );LCD12864_cmd( 0

24、x80 + DB_X );if( temp2 )LCD12864_next();LCD12864_dat( temp );#endif/* *向LCD12864画一条线 *起点( X0, Y0 ), 终点( X1, Y1 ) *0 <= X <= 127 *0 <= Y <= 63 */#ifdef_LCD12864_linevoid LCD12864_line(unsigned char X0, unsigned char Y0,unsigned char X1, unsigned char Y1, uchar color )LCD12864_cmd( 0x34 );

25、/ 关闭显示if( X0 = X1 )/ K = 1if( 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 = 0if( X0 > X1 )Y1 = X0;X0 = X1;X1 = Y1;while( X0 <= X1 )LCD12864_dot( X0+, 0, Y0, color );LCD12864_cmd( 0x36 );/ 打开显示return;

26、else/ K != 0 && K != 1float _K;char temp1 = ( X1 < X0 )?( X0 - X1 ):( X1 - X0 );char temp2 = ( Y1 < Y0 )?( Y0 - Y1 ):( Y1 - Y0 );if( temp1 < temp2 )/ Y_K = (float)temp1 / temp2;temp2 = ( Y0 > Y1 )?( -1 ):( 1 );if( X0 > X1 )_K = -_K;temp1 = 1;LCD12864_dot( X0, 0, Y0, color );do

27、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 );doX0 += temp2;LCD12864_dot( X0, 0, Y0 + _K * temp1, color );temp1+;while( X0 !=

28、X1 );LCD12864_cmd( 0x36 );/ 打开显示#endif/* *向LCD12864画一个填充矩形 * *left : 左, X 坐标 *up : 上, Y 坐标 * right: 右, X 坐标 * down : 下, Y 坐标 * *0 <= (left & right) <= 127 *0 <= (up & down) <= 63 */#ifdef_LCD12864_barvoid LCD12864_bar(unsigned char left, unsigned char up,unsigned char right, unsi

29、gned char down, uchar color )unsigned char temp;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( 0x3

30、6 );#endif/* *向LCD12864画一个矩形框 * *left : 左, X 坐标 *up : 上, Y 坐标 * right: 右, X 坐标 * down : 下, Y 坐标 * *0 <= (left & right) <= 127 *0 <= (up & down) <= 63 */#ifdef_LCD12864_rectanglevoid LCD12864_rectangle( unsigned char left, unsigned char up,unsigned char right, unsigned char down,

31、uchar color )LCD12864_line( left, up, right, up, color );LCD12864_line( right, up, right, down, color );LCD12864_line( right, down, left, down, color );LCD12864_line( left, down, left, up, color );#endif/*画一整行 *Y: 行数 ( 0 63 ) */#ifdef_LCD12864_whole_linevoid LCD12864_whole_line( unsigned char Y, uns

32、igned char color )unsigned char temp = 0x80;if( Y >= 32 )temp += 8;Y -= 32;LCD12864_cmd( Y + 0x80);LCD12864_cmd( temp );for( temp = 0; temp < 16; temp+ )LCD12864_dat( color );#endif/*画一幅128*64的图画*/#ifdef_LCD12864_BMPvoid LCD12864_BMP( unsigned char *table )uchar i,j;uint n = 0;LCD12864_cmd( 0x34 );for( i = 0; i < 64; i+ )if( i >= 32 )LCD12864_cmd( 0x80 + i - 32 );LCD12864_cmd( 0x88 );elseLCD12864_cmd( 0x80 + i );LCD12864_cmd( 0x80 );for( j = 0; j < 16; j+ )LCD12864_dat( tablen+ );LCD12864_cmd( 0x36 );#endif- my_inclu

温馨提示

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

评论

0/150

提交评论