无中文字库LCD12864
12864点阵液晶显示模块(LCM)就是由128*64个液晶显示点组成的一个128列*64行的阵列。
每个显示点对应一位二进制数,1表示亮,0表示灭。
存储这些点阵信息的RAM称为显示数据存储器。
要显示某个图形或汉字就是将相应的点阵信息写入到相应的存储单元中。
图形或汉字的点阵信息当然由自己设计,问题的关键就是显示点在液晶屏上的位置(行和列)与其在存储器中的地址之间的关系。
由于多数液晶显示模块的驱动电路是由一片行驱动器和两片列驱动器构成,所以12864液晶屏实际上是由左右两块独立的64*64液晶屏拼接而成,每半屏有一个512*8 bits显示数据RAM。
左右半屏驱动电路及存储器分别由片选信号CS1和CS2选择。
(少数厂商为了简化用户设计,在模块中增加译码电路,使得128*64液晶屏就是一个整屏,只需一个片选信号。
)显示点在64*64液晶屏上的位置由行号(line,0~63)与列号(column,0~63)确定。
512*8 bits RAM中某个存储单元的地址由页地址(Xpage,0~7)和列地址(Yaddress,0~63)确定。
每个存储单元存储8个液晶点的显示信息。
为了使液晶点位置信息与存储地址的对应关系更直观关,将64*64液晶屏从上至下8等分为8个显示块,每块包括8行*64列个点阵。
每列中的8行点阵信息构成一个8bits二进制数,存储在一个存储单元中。
(需要注意:二进制的高低有效位顺序与行号对应关系因不同商家而不同)存放一个显示块的RAM区称为存储页。
即64*64液晶屏的点阵信息存储在8个存储页中,每页64个字节,每个字节存储一列(8行)点阵信息。
因此存储单元地址包括页地址(Xpage,0~7)和列地址(Yaddress,0~63)。
例如点亮128*64的屏中(20,30)位置上的液晶点,因列地址30小于64,该点在左半屏第29列,所以CS1有效;行地址20除以8取整得2,取余得4,该点在RAM中页地址为2,在字节中的序号为4;所以将二进制数据00010000(也可能是00001000,高低顺序取决于制造商)写入Xpage=2,Yaddress=29的存储单元中即点亮(20,30)上的液晶点。
详细参考资料: http://www.led-lcd-lcm.cn/
protues里lcd12864带中文字库仿真元器件模型
建议你再买一个不带字库的吧,这样学起来容易些。
程序是不一样的,两种屏驱动方式大不一样。
另外TFT的屏也跟他们不一样,LCD12864是每个点都要按字节操作,画线、打点、画圆的程序也比较繁琐。
而TFT的可以显示任一点,方便很多,慢慢学一步一步来吧。
用FPGA编写12864显示的程序,跪求。
。
。
可以显示就行,内容可以...
/*LCD12864显示程序 此程序控制LCD12864液晶屏,IC为KS0108或兼容型号 图形文件获取方法: 在字模提取V21软件中 ,导入一幅128*64黑白图像. * 参数设置: * 参数设置->其它选项,选择纵向取模,勾上字节倒序,保留逗号, * 取模方式为C51。
将生成的数组通过keilc等C编译软件,在编译软件中新建一工程,写入源程序如下:unsigned char code tab[]= {//图像数据 } 编译此工程将得到hex文件.在QII中使用lpm_rom宏功能模块中调用此hex文件.********************************************************************************/ module newlcd(clock,rst_n,rs,rw,en,data,lcd_cs);// I/O口声明 input clock; //系统时钟 input rst_n; //复位信号 output[1:0] lcd_cs; // output rs; //1:数据模式;0:指令模式 output rw; //1:读操作;0:写操作 output en; //使能信号,写操作时在下降沿将数据送出;读操作时保持高电平 output[7:0] data; //LCD数据总线// I/O寄存器 reg rs; reg en; reg[1:0] lcd_cs; reg[7:0] data; //内部寄存器 reg[3:0] state; //状态机 reg[3:0] next_state; reg[20:0] div_cnt; //分频计数器 reg[9:0] cnt; //写操作计数器 reg cnt_rst; //写操作计数器复位信号 wire[7:0] showdata; //要显示的数据 reg[1:0] cs_r; reg [2:0] page_addr; reg [5:0] row_addr;//内部网线 wire clk_div; //分频时钟 wire clk_divs; wire page_done; //写一行数据完成标志位 wire frame_done; //写一屏数据完成标志位 wire left_done;//状态机参数 parameter idle =4'b0000, setbase_1 =4'b0001, setbase_2 =4'b0011, setmode_1 =4'b0010, setmode_2 =4'b0110, SETpage_addr_1 =4'b0111, SETpage_addr_2 =4'b0101, SETrow_addr_1 =4'b1101, SETrow_addr_2 =4'b1111, write_right_1 =4'b1110, write_right_2 =4'b1010, write_nextpage_1 =4'b1011, write_nextpage_2 =4'b1001, wr_data_1 =4'b0100, wr_data_2 =4'b1100;// set_1 =4'b1000;//******************************代码开始********************************* assign rw = 1'b0; //对LCD始终为写操作//时钟分频 always@(posedge clock or negedge rst_n) begin if(!rst_n) div_cnt else div_cnt end assign clk_div = (div_cnt[15:0] == 20'h7fff); //状态机转向 always@(posedge clock or negedge rst_n) begin if(! rst_n) state else if(clk_div) state end//************************状态机逻辑********************************* always@(state or page_done or left_done or frame_done or cnt or showdata or page_addr or row_addr or cs_r) begin rs en lcd_cs cnt_rst data case(state) idle: begin next_state cnt_rst end//**************************初始化LCD******************************** setbase_1: //基本指令操作 begin lcd_cs next_state data en end setbase_2: begin lcd_cs next_state data end //****************************************************************** setmode_1: begin lcd_cs next_state data en end setmode_2: begin next_state data end //****************************************************************** SETpage_addr_1: //设置页地址 begin next_state data en end SETpage_addr_2: begin next_state data end SETrow_addr_1: //设置列地址 begin next_state data en end SETrow_addr_2: begin next_state data end //****************************************************************** /* write_right_1: //写完左半屏64个,换为右半屏显示 begin next_state row_addr end write_right_2: begin next_state end //****************************************************************** write_nextpage_1: //写完全一行128个 begin next_state row_addr end write_nextpage_2: begin next_state end *///****************************************************************** wr_data_1: //写数据到图形显示区 begin next_state rs en data end wr_data_2: begin rs data if(left_done) //写完左半屏数据64个 begin if(page_done) //写完一页数据128个 begin if(frame_done) //写完一屏数据(8页) next_state else // next_state next_state end else // next_state next_state end else next_state end default: next_state endcase end//******************************************************************** always@(posedge clock) begin if(clk_div) begin if(cnt_rst) begin cnt end else if(state == wr_data_2) begin cnt end end end//**************************************************** always@(posedge clock or negedge rst_n) if(!rst_n) begin cs_r page_addr end else if(clk_div && (state == wr_data_2)) if(page_done)// begin cs_r page_addr end else if(left_done) begin cs_r end //*********************************************************************//******************************************************************** assign left_done = (cnt[5:0] == 6'd63); //写完左半屏数据64个 assign page_done = (cnt[6:0] == 7'd127); //写完一页数据128个 assign frame_done = (cnt[9:4] == 7'h3f); //写完一屏数据//***********************************************************************//*******************************************************************//调用ROM(图片数据) rom ...
由于本人考虑没有周全,画好的电路板插上LCD12864模块,发现方向...
您好,1. 首先是接口的预定义----------------------------------------------#define LCD_DATA (*((volatile Uint16 *)0x0070E0)) // GPIOA7-A0对应DB7-DB0#define RS GpioDataRegs.GPBDAT.bit.GPIOB0#define RW GpioDataRegs.GPBDAT.bit.GPIOB1 //别弄错0 1 2#define EN GpioDataRegs.GPBDAT.bit.GPIOB2 // 实际接线要对应void InitGpio(void){ EALLOW; GpioMuxRegs.GPAMUX.bit.PWM1_GPIOA0 = 0; // 设置为普通GPIO使用 GpioMuxRegs.GPADIR.bit.GPIOA0 = 1; // 设置为输出 GpioMuxRegs.GPAMUX.bit.PWM2_GPIOA1 = 0; GpioMuxRegs.GPADIR.bit.GPIOA1 = 1; GpioMuxRegs.GPAMUX.bit.PWM3_GPIOA2 = 0; GpioMuxRegs.GPADIR.bit.GPIOA2 = 1; GpioMuxRegs.GPAMUX.bit.PWM4_GPIOA3 = 0; GpioMuxRegs.GPADIR.bit.GPIOA3 = 1; GpioMuxRegs.GPAMUX.bit.PWM5_GPIOA4 = 0; GpioMuxRegs.GPADIR.bit.GPIOA4 = 1; GpioMuxRegs.GPAMUX.bit.PWM6_GPIOA5 = 0; GpioMuxRegs.GPADIR.bit.GPIOA5 = 1; GpioMuxRegs.GPAMUX.bit.T1PWM_GPIOA6 = 0; GpioMuxRegs.GPADIR.bit.GPIOA6 = 1; GpioMuxRegs.GPAMUX.bit.T2PWM_GPIOA7 = 0; GpioMuxRegs.GPADIR.bit.GPIOA7 = 1; GpioMuxRegs.GPBMUX.bit.PWM7_GPIOB0 = 0; GpioMuxRegs.GPBDIR.bit.GPIOB0 = 1; GpioMuxRegs.GPBMUX.bit.PWM8_GPIOB1 = 0; GpioMuxRegs.GPBDIR.bit.GPIOB1 = 1; GpioMuxRegs.GPBMUX.bit.PWM9_GPIOB2 = 0; GpioMuxRegs.GPBDIR.bit.GPIOB2 = 1; EDIS;} ---------------------------------------------- 一般液晶的控制线是直接对I/O口的位进行操作,数据线是按字进行操作。
在这容易出错的是:(1)数据线地址的对应。
DSP的GPIO数据地址一般为16位一个地址(F28335有的是32个GPIO一组,给出了一个地址,实际上是有两个地址的,给出的那一个地址是低16位的)。
需要注意的是,液晶数据线一般为8位,那么把八位数据送出的时候,实际给的是DSP的16位数据的低八位,所以接线上要接低八位的GPIO;如果接高八位的GPIO,软件上要用下面一行程序进行移位【 dat = dat << 8; //左移8位,向高位移动】。
(2)在进行GPIO初始化和预定义的时候,一般都会复制,但是别忘记改一些0 1 2 3等数,接线上也要一一对应,仔细检查。
2. 51程序移植到DSP的时序问题----------------------------------------------void Display_Data_All(uchar *hz){ while(*hz != '\0') { WriteData12864(*hz); hz++; delay(20);//2就不够!!!!!! }} ---------------------------------------------- 由于51单片机的晶振一般为11.0592MHz,而DSP等控制器的晶振为30MHz,实际执行起来最高有150MHz,而液晶为低速外设,所以移植后可能会不显示,显示乱码等情况。
我在调试12864液晶的时候就出现过只显示乱码数字不显示汉字的情况,这不是字库损坏,而是因为写汉字的时间要比写数字的时间长,而程序中延时过短。
上面程序中把delay(2)改为delay(20)就解决问题了。
实际上,真正造成影响的是,程序执行过快。
它认为显示完一个字之后,又很快进入下一个字的操作;实际上液晶要一定的时间才能写完(见液晶操作时序图),所以写数据的程序中要加长延时。
至于RS、RW、EN等控制引脚,延时与否影响不大。
3. 240128液晶的调试 240128液晶有busy和int返回信号,实际上不需要接即可。
程序中也可以不测忙。
。
程序中写控制指令两者中间也要加长延时,更不用说写数据之间的延时。
----------------------------------------------void lcd_regwrite(Uint16 regname,Uint16 regdata) // 写控制指令{ lcd_regwr(regname); delay(10); // 加长延时 lcd_regwr(regdata);}void lcd_character(uchar *cha,int count) // 显示中文或字符{ int i; for(i=0;i<count;i++) { delay(10); // 加长延时 lcd_datawrite(*cha); ++cha; }}
比较七段LED数码显示管和LCD12864液晶显示屏的优缺点及在方案选...
展开全部 数码管具有:低能耗、低损耗、低压、寿命长、耐老化、防晒、防潮、防火、防高(低)温,对外界环境要求低,易于维护,同时其精度高,称量快,精确可靠,操作简单。
数码显示是采用 BCD 编码显示数字和代码,程序编写容易,资源占用较少。
LED显示器也属于液晶显示器的一种, LED代替了传统的液晶背光模组。
高亮度,而且可以在寿命范围内实现稳定的亮度和色彩表现。
更宽广的色域,实现更艳丽的色彩。
控制容易因为采用了固态发光器件,对环境的适应能力非常强,所以LED的使用温度范围广、低电压、耐冲击。
而且LED光源没有任何射线产生,低电磁辐射、无汞可谓是绿色环保光源。
总结下来LED液晶的优点:LED液晶电视有省电、环保、色彩更真实的优势。
类型比较的重要方面:结构和产品体积,辐射和电磁干扰,屏幕平坦度和分辨率,显示效果(传统CRT显示的亮度比液晶显示要好,视觉角度上也要好很多,显示反应速度相差无几){LCD克服了CRT体积庞大、耗电和闪烁的缺点,但也同时带来了造价过高、视角不广以及彩色显示不理想等问题。
CRT显示可选择一系列分辨率,而且能按屏幕要求加以调整,但LCD屏只含有固定数量的液晶单元,只能在全屏幕使用一种分辨率显示(每个单元就是一个像素)。
12864点阵式液晶显示模块(LCD)广泛应用于单片机控制系统,比数码管、段式液晶能模块显示更多、更直观的信息。
12864LCD属于点阵图形液晶显示模块,不但能显示字符,还能显示汉字和图形,显示面积大,数字和汉字显示容易实现,程序要求不是很高,更加容易操作。
点阵液晶显示模块集成度很高,一般都内置控制芯片、行驱动芯片和列驱动芯片。
...
求使用8051单片机和lcd显示图片的汇编程序,要汇编的,不要C语言版...
展开全部 带字库的LCD模块不需要取字模只需要向LCD模块写入需要显示的汉字的GB2312代码就可以了,显示位置可用模块手册中的定位指令代码设置 切换到点阵图形模式,并设置好书写规律,在字模相应位置写入对应字模数据就可以了比如16*16点阵,定义第一组两个8字节数据的起始位置,连续列入两字节,然后定位下一行起始地址,再写,重复上述过程直到写完一个字的全部16行原理都是一样的,具体命令与实现方法或有不同,详情参见LCD产品手册...
转载请注明出处51数据库 » lcd12864图形取模软件