3310/5110 LCD 驱动,一个函数实现任意位置放中英文字符,图片
才写好的3310/5110 LCD 驱动,可以在x=0-84,y=0-48的任意坐标上放字符,图片。可以图文混排,想怎么排就怎么排。修正过的文件ourdev_329422.rar(文件大小:8K) (原文件名:Atmega16L_Nokia_5100_LCD_Driver.rar)
(另外:有地方不懂,程序数据过大会有什么后果,我在点阵数组里加入过多的点阵数据的话程序就不能运行或运行不正常,删掉一部分点阵数据后就正常了,是超出flash大小了吗?怎么判断程序是否超出大小了?我现在做法就是运行正常了就加数据,不正常就减数据,减到正常为止。)
上午传的main.c里用于演示的几个字符位置设置有问题,有几个字符重叠了,修正了一下,顺便上两张图。 发点图看看效果嘛. 等晚上回家传。 http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_328923.jpg
图1 (原文件名:1.jpg)
http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_328942.jpg
图片2 (原文件名:2.jpg)
http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_329002.jpg
图片3 (原文件名:3.jpg) 标记,应该穿KU子 ""(另外:有地方不懂,程序数据过大会有什么后果,我在点阵数组里加入过多的点阵数据的话程序就不能运行或运行不正常,删掉一部分点阵数据后就正常了,是超出flash大小了吗?怎么判断程序是否超出大小了?我现在做法就是运行正常了就加数据,不正常就减数据,减到正常为止。)""
原因M16的SRAM溢出了!!!
更改1:
void BufferPixelStuff( unsigned char type, unsigned char index, unsigned char x, unsigned char y, unsigned char width, unsigned char height)
{
unsigned char i, j, tmpRow;
unsigned char row = y / 8;
unsigned char offset = y % 8;
unsigned char level = ( height % 8 ==0?height/8:(height/8+ 1 ) );
unsigned char bytes[ 2 ] = { 0 };
unsigned char byteTmp;
//pgm_read_byte(&write_chinese_string)
for( j=0; j < width; j++ )
{
tmpRow = row;
byteTmp = UnClear( LcdPixelBuffer[ tmpRow ][ x + j ], 8 - offset );
for( i=0; i < level; i++ )
{
if( type == 1 )
{
SplitByte( pgm_read_byte( &PIXEL_BMP[ index ][ i * width + j ] ), offset, bytes);
}
else if( type == 2 )
{
SplitByte( pgm_read_byte( &PIXEL_ENGLISH_CHAR[ index - 32 ][ i * width + j ]), offset, bytes);
}
else if( type == 3 )
{
SplitByte( pgm_read_byte( &PIXEL_CHINESE_CHAR[ index ][ i * width + j ] ), offset, bytes);
}
else
{
return;
}
LcdPixelBuffer[ tmpRow++ ][ x + j ] = byteTmp | bytes[ 0 ];
byteTmp = bytes[ 1 ];
}
LcdPixelBuffer[ tmpRow ][ x + j ] = byteTmp | LnClear( LcdPixelBuffer[ tmpRow ] , ( offset + height ) % 8 );
}
}
///////////////////////////////////////////////////////////////////////////////////////////////
更改2:
/*******************************************************
文件名 : PixelStuff.h
描述 : 点阵数据
作者 : xylch101
编辑器 : Notepad 2
日期 : 2008年06月27日
*******************************************************/
#ifndef PIXEL_STUFF_H
#define PIXEL_STUFF_H
#include <avr/pgmspace.h>
/*********************************************
数组名 : PIXEL_ENGLISH_CHAR
功能 : 5X7ASCII点阵数据
编辑器 : Notepad 2
*********************************************/
const prog_char PIXEL_ENGLISH_CHAR[ ][ 5 ] =
{
{ 0x00, 0x00, 0x00, 0x00, 0x00 },// sp
{ 0x00, 0x00, 0x2f, 0x00, 0x00 }, // !
{ 0x00, 0x07, 0x00, 0x07, 0x00 }, // "
{ 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // #
{ 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // $
{ 0xc4, 0xc8, 0x10, 0x26, 0x46 }, // %
{ 0x36, 0x49, 0x55, 0x22, 0x50 }, // &
{ 0x00, 0x05, 0x03, 0x00, 0x00 }, // '
{ 0x00, 0x1c, 0x22, 0x41, 0x00 }, // (
{ 0x00, 0x41, 0x22, 0x1c, 0x00 }, // )
{ 0x14, 0x08, 0x3E, 0x08, 0x14 }, // *
{ 0x08, 0x08, 0x3E, 0x08, 0x08 }, // +
{ 0x00, 0x00, 0x50, 0x30, 0x00 }, // ,
{ 0x10, 0x10, 0x10, 0x10, 0x10 }, // -
{ 0x00, 0x60, 0x60, 0x00, 0x00 }, // .
{ 0x20, 0x10, 0x08, 0x04, 0x02 }, // /
{ 0x3E, 0x51, 0x49, 0x45, 0x3E }, // 0
{ 0x00, 0x42, 0x7F, 0x40, 0x00 }, // 1
{ 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2
{ 0x21, 0x41, 0x45, 0x4B, 0x31 }, // 3
{ 0x18, 0x14, 0x12, 0x7F, 0x10 }, // 4
{ 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5
{ 0x3C, 0x4A, 0x49, 0x49, 0x30 }, // 6
{ 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7
{ 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8
{ 0x06, 0x49, 0x49, 0x29, 0x1E }, // 9
{ 0x00, 0x36, 0x36, 0x00, 0x00 }, // :
{ 0x00, 0x56, 0x36, 0x00, 0x00 }, // ;
{ 0x08, 0x14, 0x22, 0x41, 0x00 }, // <
{ 0x14, 0x14, 0x14, 0x14, 0x14 }, // =
{ 0x00, 0x41, 0x22, 0x14, 0x08 }, // >
{ 0x02, 0x01, 0x51, 0x09, 0x06 }, // ?
{ 0x32, 0x49, 0x59, 0x51, 0x3E }, // @
{ 0x7E, 0x11, 0x11, 0x11, 0x7E }, // A
{ 0x7F, 0x49, 0x49, 0x49, 0x36 }, // B
{ 0x3E, 0x41, 0x41, 0x41, 0x22 }, // C
{ 0x7F, 0x41, 0x41, 0x22, 0x1C }, // D
{ 0x7F, 0x49, 0x49, 0x49, 0x41 }, // E
{ 0x7F, 0x09, 0x09, 0x09, 0x01 }, // F
{ 0x3E, 0x41, 0x49, 0x49, 0x7A }, // G
{ 0x7F, 0x08, 0x08, 0x08, 0x7F }, // H
{ 0x00, 0x41, 0x7F, 0x41, 0x00 }, // I
{ 0x20, 0x40, 0x41, 0x3F, 0x01 }, // J
{ 0x7F, 0x08, 0x14, 0x22, 0x41 }, // K
{ 0x7F, 0x40, 0x40, 0x40, 0x40 }, // L
{ 0x7F, 0x02, 0x0C, 0x02, 0x7F }, // M
{ 0x7F, 0x04, 0x08, 0x10, 0x7F }, // N
{ 0x3E, 0x41, 0x41, 0x41, 0x3E }, // O
{ 0x7F, 0x09, 0x09, 0x09, 0x06 }, // P
{ 0x3E, 0x41, 0x51, 0x21, 0x5E }, // Q
{ 0x7F, 0x09, 0x19, 0x29, 0x46 }, // R
{ 0x46, 0x49, 0x49, 0x49, 0x31 }, // S
{ 0x01, 0x01, 0x7F, 0x01, 0x01 }, // T
{ 0x3F, 0x40, 0x40, 0x40, 0x3F }, // U
{ 0x1F, 0x20, 0x40, 0x20, 0x1F }, // V
{ 0x3F, 0x40, 0x38, 0x40, 0x3F }, // W
{ 0x63, 0x14, 0x08, 0x14, 0x63 }, // X
{ 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y
{ 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z
{ 0x00, 0x7F, 0x41, 0x41, 0x00 }, // [
{ 0x55, 0x2A, 0x55, 0x2A, 0x55 }, // 55
{ 0x00, 0x41, 0x41, 0x7F, 0x00 }, // ]
{ 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^
{ 0x40, 0x40, 0x40, 0x40, 0x40 }, // _
{ 0x00, 0x01, 0x02, 0x04, 0x00 }, // '
{ 0x20, 0x54, 0x54, 0x54, 0x78 }, // a
{ 0x7F, 0x48, 0x44, 0x44, 0x38 }, // b
{ 0x38, 0x44, 0x44, 0x44, 0x20 }, // c
{ 0x38, 0x44, 0x44, 0x48, 0x7F }, // d
{ 0x38, 0x54, 0x54, 0x54, 0x18 }, // e
{ 0x08, 0x7E, 0x09, 0x01, 0x02 }, // f
{ 0x0C, 0x52, 0x52, 0x52, 0x3E }, // g
{ 0x7F, 0x08, 0x04, 0x04, 0x78 }, // h
{ 0x00, 0x44, 0x7D, 0x40, 0x00 }, // i
{ 0x20, 0x40, 0x44, 0x3D, 0x00 }, // j
{ 0x7F, 0x10, 0x28, 0x44, 0x00 }, // k
{ 0x00, 0x41, 0x7F, 0x40, 0x00 }, // l
{ 0x7C, 0x04, 0x18, 0x04, 0x78 }, // m
{ 0x7C, 0x08, 0x04, 0x04, 0x78 }, // n
{ 0x38, 0x44, 0x44, 0x44, 0x38 }, // o
{ 0x7C, 0x14, 0x14, 0x14, 0x08 }, // p
{ 0x08, 0x14, 0x14, 0x18, 0x7C }, // q
{ 0x7C, 0x08, 0x04, 0x04, 0x08 }, // r
{ 0x48, 0x54, 0x54, 0x54, 0x20 }, // s
{ 0x04, 0x3F, 0x44, 0x40, 0x20 }, // t
{ 0x3C, 0x40, 0x40, 0x20, 0x7C }, // u
{ 0x1C, 0x20, 0x40, 0x20, 0x1C }, // v
{ 0x3C, 0x40, 0x30, 0x40, 0x3C }, // w
{ 0x44, 0x28, 0x10, 0x28, 0x44 }, // x
{ 0x0C, 0x50, 0x50, 0x50, 0x3C }, // y
{ 0x44, 0x64, 0x54, 0x4C, 0x44 } // z
};
/*********************************************
数组名 : PIXEL_CHINESE_CHAR
功能 : 12X12中文点阵数据
编辑器 : Notepad 2
*********************************************/
const prog_char PIXEL_CHINESE_CHAR[ ][ 24 ] PROGMEM =
{
//我
{
0x8a, 0x8a, 0x4a, 0xfe, 0x49, 0x28, 0x7f, 0x88, 0x49, 0x2a, 0x08, 0x00, 0x00, 0x04, 0x04, 0x07,
0x02, 0x02, 0x01, 0x01, 0x02, 0x04, 0x07, 0x00},
//们
{
0x10, 0xfc, 0x03, 0x00, 0xfd, 0x02, 0x04, 0x02, 0x02, 0x02, 0xfe, 0x00, 0x00, 0x07, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x04, 0x04, 0x07, 0x00}
};
/*********************************************
数组名 : PIXEL_BMP
功能 : 48X24图片点阵数据
编辑器 : Notepad 2
*********************************************/
const prog_char PIXEL_BMP[ ][ 144 ] PROGMEM =
{
{
0x00,0x00,0x00,0x00,0x80,0xE0,0xFC,0xFF,0xFF,0xFF,0x7F,0xFF,0xFE,0xFC,0xF0,0xC1,
0x0F,0x7F,0xFF,0xFF,0xFE,0xF0,0xC0,0x00,0x00,0x00,0xC0,0xF8,0xFE,0xFF,0xFF,0x3F,
0x07,0xC1,0xF0,0xFE,0xFF,0xFF,0xFF,0x1F,0x07,0x8F,0xCF,0xFF,0xFF,0xFF,0xFE,0xFC,
0x00,0x80,0xF0,0xFC,0xFF,0xFF,0xFF,0x7F,0x7F,0x78,0x78,0x79,0x7F,0x7F,0xFF,0xFF,
0xFC,0xF0,0xC1,0x07,0x1F,0xFF,0xFF,0xFE,0xFC,0xFF,0xFF,0xFF,0x1F,0x07,0xC1,0xF0,
0xFE,0xFF,0xFF,0x3F,0x0F,0x0F,0x7F,0xFF,0xFF,0xFF,0xFF,0xE7,0x07,0x03,0x01,0x00,
0x02,0x03,0x03,0x03,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
0x03,0x03,0x03,0x03,0x00,0x00,0x03,0x1F,0x3F,0x1F,0x07,0x00,0x00,0x02,0x03,0x03,
0x03,0x03,0x01,0x00,0x00,0x00,0x00,0x03,0x03,0x03,0x03,0x03,0x03,0x00,0x00,0x00
}
};
#endif 非常感谢楼上的!我是avr初学者,只是有一点儿c基础,对avr lib不是很了解。刚刚查了下,知道了 SRAM 内变量的使用,FLASH 内变量的使用,EEPROM 内变量的使用,再次感谢!下面是我查到的一点资料。
AVR 系列单片机内部有三种类型的被独立编址的存储器,它们分别为:Flash 程序存储器、内部SRAM 数据存储器和EEPROM 数据存储器。
Flash 存储器为1K~128K 字节,支持并行编程和串行下载,下载寿命通常可达10,000 次。由于AVR 指令都为16 位或32 位,程序计数器对它按字进行寻址,因此FLASH 存储器按字组织的,但在程序中访问 FLASH 存储区时专用指令LPM 可分别读取指定地址的高低字节。
寄存器堆(R0~R31)、I/O 寄存器和SRAM 被统一编址。所以对寄存器和I/O 口的操作使用与访问内部SRAM 同样的指令。32 个通用寄存器被编址到最前,I/O 寄存器占用接下来的64 个地址。从0X0060 开始为内部SRAM。外部SRAM 被编址到内部SRAM 后。
AVR 单片机的内部有64~4K 的EEPROM 数据存储器,它们被独立编址,按字节组织。擦写寿命可达100,000 次。
1. I/O 寄存器操作
I/O 专用寄存器(SFR)被编址到与内部SRAM 同一个地址空间,为此对它的操作和SRAM 变量操作类似。
SFR 定义文件的包含:
#include <avr/io.h>
io.h 文件在编译器包含路径下的avr 目录下,由于AVR 各器件间存在同名寄存器地址有不同的问题,io.h 文件不直接定义SFR 寄存器宏,它根据在命令行给出的 –mmcu 选项再包含合适的 ioxxxx.h 文件。在器件对应的ioxxxx.h 文件中定义了器件SFR 的预处理宏,在程序中直接对它赋值或引用的方式读写SFR,如:
PORTB=0XFF;
Val=PINB;
从io.h 和其总包含的头文件sfr_defs.h 可以追溯宏PORTB 的原型在io2313.h 中定义:
#define PORTB _SFR_IO8(0x18)
在sfr_defs.h 中定义:
#define _SFR_IO8(io_addr) _MMIO_BYTE((io_addr) + 0x20)
#define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr))
这样PORTB=0XFF; 就等同于 *(volatile unsigned char *)(0x38)=0xff;
0x38 在器件AT90S2313 中PORTB 的地址对SFR 的定义宏进一步说明了SFR 与SRAM 操作的相同点。
关键字volatile 确保本条指令不会因C 编译器的优化而被省略。
2. SRAM 内变量的使用
一个没有其它属性修饰的 C 变量定义将被指定到内部SRAM,avr-libc 提供一个整数类型定义文件inttype.h,其中定义了常用的整数类型如下表:
定义值长度(字节) 值范围
int8_t 1 -128~127
uint8_t 1 0~255
int16_t 2 -32768~32767
uint16_t 2 0~65535
int32_t 4 -2147483648~2147483647
uint32_t 4 0~4294967295
int64_t 8 -9.22*10^18~-9.22*10^18
uint64_t 8 0~1.844*10^19
根据习惯,在程序中可使用以上的整数定义。定义、初始化和引用
如下示例:
uint8_t val=8; 定义了一个SRAM 变量并初始化成8
val=10; 改变变量值
const uint8_t val=8; 定义SRAM 区常量
register uint8_t val=10; 定义寄存器变量
3. 在程序中访问FLASH 程序存储器
avr-libc 支持头文件:pgmspace.h
#include < avr/pgmspace.h >
在程序存储器内的数据定义使用关键字 __attribute__((__progmem__))。在pgmspace.h
中它被定义成符号 PROGMEM。
(1). FLASH 区整数常量应用
定义格式:
数据类型 常量名 PROGMEM = 值 ;
如:
char val8 PROGMEM = 1 ;
int val16 PROGMEM = 1 ;
long val32 PROGMEM =1 ;
对于不同长度的整数类型 avr-libc 提供对应的读取函数:
pgm_read_byte(prog_void * addr)
pgm_read-word(prg_void *addr)
pgm_read_dword(prg_void* addr)
另外在pgmspace.h 中定义的8 位整数类型 prog_char prog_uchar 分别指定在FLASH 内的8 位有符号整数和8 位无符号整数。应用方式如下:
char ram_val; //ram 内的变量
const prog_char flash_val = 1; //flash 内常量
ram_val=pgm_read_byte(&flash_val); //读flash 常量值到RAM 变量
对于应用程序FLASH 常量是不可改变的,因此定义时加关键字const 是个好的习惯。
(2). FLASH 区数组应用:
定义:
const prog_uchar flash_array[] = {0,1,2,3,4,5,6,7,8,9}; //定义
另外一种形式
const unsigned char flash_array[] RROGMEM = {0,1,2,3,4,5,6,7,8,9};
读取示例:
unsigend char I, ram_val;
for(I=0 ; I<10 ;I ++) // 循环读取每一字节
{
ram_val = pgm_read_byte(flash_array + I);
… … //处理
}
(3).FLASH 区字符串常量的应用
全局定义形式:
const char flash_str[] PROGMEM = “Hello, world!”;
函数内定义形式:
const char *flash_str = PSTR(“Hello, world!”);
以下为一个FLASH 字符串应用示例
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <stdio.h>
const char flash_str1[] PROGMEM = “全局定义字符串”;
int main(void)
int I;
char *flash_str2=PSTR(“函数内定义字符串”);
while(1)
{
scanf(“%d”,&I);
printf_P(flash_str1);
printf(“\n”);
printf_P(flash_str2);
printf(“\n”);
}
}
4. EEPROM 数据存储器操作
#include <avr/eeprom.h>
头文件声明了avr-libc 提供的操作EEPROM 存储器的API 函数。
这些函数有:
eeprom_is_ready() //EEPROM 忙检测(返回EEWE 位)
eeprom_busy_wait() //查询等待EEPROM 准备就绪
uint8_t eeprom_read_byte (const uint8_t *addr) //从指定地址读一字节
uint16_t eeprom_read_word (const uint16_t *addr) //从指定地址一字
void eeprom_read_block (void *buf, const void *addr, size_t n) //读块
void eeprom_write_byte (uint8_t *addr, uint8_t val) //写一字节至指定地址
void eeprom_write_word (uint16_t *addr, uint16_t val) //写一字到指定地址
void eeprom_write_block (const void *buf, void *addr, size_t n)//写块
在程序中对EEPROM 操作有两种方式
方式一:直接指定EERPOM 地址
示例:
#include <avr/io.h>
#include <avr/eeprom.h>
int main(void)
{
unsigned char val;
eeprom_busy_wait(); //等待EEPROM 读写就绪
eeprom_write_byte(0,0xaa); //将0xaa 写入到EEPORM 0 地址处
eeprom_busy_wait();
val=eeprom_read_byte(0); //从EEPROM 0 地址处读取一字节赋给RAM 变量val
while(1);
}
方式二:先定义EEPROM 区变量法
示例:
#include <avr/io.h>
#include <avr/eeprom.h>
unsigned char val1 __attribute__((section(".eeprom")));//EEPROM 变量定义方式
int main(void)
{
unsigned char val2;
eeprom_busy_wait();
eeprom_write_byte (&val1, 0xAA);
eeprom_busy_wait();
val2 = eeprom_read_byte(&val1);
while(1);
}
在这种方式下变量在EEPROM 存储器内的具体地址由编译器自动分配。相对方式一,数据在EEPROM 中的具体位置是不透明的。为EEPROM 变量赋的初始值,编译时被分配到.eeprom 段中,可用avr-objcopy 工具从.elf 文件中提取并产生ihex 或binary 等格式的文件。 按照您的修改后,程序完全好了,右下角的几个杂点也没了。以前总是存不了4句诗,现在好了。上面文件已经修改过了。再次感谢 wangguanfu!!! COOL ! 哈哈!修改之后全屏图片都能存放好几张了。(感谢站长加酷)
http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_329564.jpg
(原文件名:0628_105203.jpg)
http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_329566.jpg
(原文件名:0628_104941.jpg) 楼主的LCD在哪里买的? 类似这种经过简单封装的LCD好像也不少吧?这个网站上就有,淘宝上也有,不难找到的,我知道3310和5110的程序是完全兼容的。 http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_338804.gif
(原文件名:S004.gif)
我靠!!这个网站流量这么大!!这才几天不见,这个帖子就被“顶”到第5页去了,好不容易被我找到了。 好东东. 标记,以后过来下载 图文混排还是比较实用的 曾经对这个屏很迷恋 谢谢,学习了。 顶 顶,标记一下 看屏好像是我这里出售的 :-) 手机标记回家看 ""(另外:有地方不懂,程序数据过大会有什么后果,我在点阵数组里加入过多的点阵数据的话程序就不能运行或运行不正常,删掉一部分点阵数据后就正常了,是超出flash大小了吗?怎么判断程序是否超出大小了?我现在做法就是运行正常了就加数据,不正常就减数据,减到正常为止。)""
上次一个朋友还问我用ADS调试时调用一个很大有数组就复位,想了想就是启动代码时设计SRAM少了点,
也想搞一个屏玩玩,可没有什么实用价值利益有点不想花时间,呵呵 学习了,原来3310和5110LCD是完全兼容的/ 那个淘宝超值8元的液晶,是否也兼容这个程序???
那好像是nokia1110的 标记! mark 谢谢!! 标记一下 问两个问题啊!
1、LCD5110的屏固定的很不好啊,很容易松动,导致屏幕显示有问题啊。有没有什么办法使屏固定的更牢靠啊!
2、屏怎么能固定刷新呢,这样就可以重新连上后继续显示啊! 每看到原始的LCD,我就好恨
就是没有封装成DIP脚的LCD来给爱好者 我想用这个函数数显示从SD卡中读出的信息。可读出的并不是字符串怎么办?
CacheEnglishString(7,0,5,7,2,"USB/SD CARD"); 【楼主位】 xylch101
请问:您的"图片"是用的什么软件取模的.是否可以共享一下.谢谢. 问问大家.有知道他的"图片"是用的什么软件取模的?
是否可以共享一下.谢谢. 不知道为什么我得3310 就是不能显示小字~~只能显示很大的字~~ 帅气啊 根据汉字内码来查表更灵活 谁能回答我在【33楼】的问题.
----------------------------
问问大家.有知道他的"图片"是用的什么软件取模的?
是否可以共享一下.谢谢. 请问一下楼主,你的汉字点阵怎么弄的!! 不錯,向你學習。 图像怎么取模,取模之后的数据是按照什么样子的规则放置的?又该按什么顺序向lcd里写呢?迷惑中!!!!!!!!!!!!!!!!!!!!!!!!!! 强烈标记一下。 请问,51上能用否? mark 学习 mark一下。回头用着再看 做个标记呀 标记 不错,刚好用到 很好! 论坛怎么没法收藏呀!看到好的就得回复 有没有引脚信息,我有一个拆机的,不知道引脚!! MARK! 顶了。。。 TING mark cool! COOLCOOL COOLCOOL sign 记号下 mark m 好文章,楼主强人啊!!! 学习了…… cool 收藏 楼主,你的程序我下载下来,好乱啊,中文注释都不能正常显示 jihao 最近搞lcd脑袋都肿了。。。 我也收藏下 ^_^ 毕业设计就这个屏整的。。还搞过FLASH。。。。
这屏真的不错,,,,, 楼主强人!!!研究研究!!!! COOL 顶,标记 标记 这个屏确实好用 mark mark mark 顶,标记一下 顶 !!! mark mark mark,thanks a lot/ mark,以后好找 thanks a lot 标记一下···马上就可以用啦··哈哈·· mark 发现一个问题,在while中更新显示,点阵就会整体向右移动,应该是不动的在原位置,有人遇到过吗? 研究一下3310哈~ 回复【楼主位】xylch101
-----------------------------------------------------------------------
好东西,感谢分享 mark mark mark mark 回复【楼主位】xylch101
-----------------------------------------------------------------------
mark mark mark 脚印 支持!
页:
[1]
2