单片机stc89c52单片机RC LCD 12864(st7920) 求:电脑COM发送汉字直接显示在LCD的程序

STC89C52RC单片机接12864液晶驱动显示为什么不加上拉排阻也可以正常显示 - 单片机论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
STC89C52RC单片机接12864液晶驱动显示为什么不加上拉排阻也可以正常显示
17:15:57  
STC89C52RC单片机接12864液晶驱动显示为什么不加上拉排阻也可以正常显示
(74.78 KB, 下载次数: 7)
17:15 上传
17:17:34  
跟内部三极管组态有关系,加会稳定些。兼容性也会好。
助理工程师
09:13:27  
这个要看12864液晶的类型& & 不同的不同& & 一般要加上拉电阻
17:54:34  
12864需要的是信号,不是电平
等待验证会员
17:54:39  
这个情况说明液晶驱动的质量比较好,单片机给他的小信号电流,它能输出大电流足矣提供给液晶工作。加上拉电阻一般是单片机输出电流小,驱动芯片也不能够提供大电流维持负载工作~~~~
等待验证会员
21:28:39  
仿真,不需要理由
22:01:37  
多谢分享,对我很有用
12:00:46  
你可以试试其他的再用表量一下就知道原因了
19:39:05  
12864需要的是信号,不是电平
怎么理解需要信号而不是需要电平?
01:30:20  
仿真不一定那么准确,有个大概就行,但是实物必须严格要求
Powered by  LCD12864带字库,型号:CM12864-12.其相关数据手册可以在百度中搜索&ST7920 系列中文图形液晶模块使用说明书&,里面有详细的介绍。这里就不在多描述。
其原理简图:(我们只需关心接口部分)
接口定义:这里注意V0,我一开始就栽倒这,网上搜到的资料中,这PIN可以悬空或接个滑动电阻,程序检查好多遍,没有发现问题,就是不显示,接到3.3V上也不行,后来把V0直接接到5V上,就可以正常显示。在这提醒大家数据手册仅供参考,具体还是以自己的实物为主。避免走没必要的弯路。
管脚功能描述
对比度(亮度)调整.(直接接到5V上最靠谱)
RS=&H&,表示DB7&&DB0为显示数据
RS=&L&,表示DB7&&DB0为显示指令数据
R/W=&H&,E=&H&,数据被读到DB7&&DB0
R/W=&L&,E=&H&L&, DB7&&DB0的数据被写到IR或DR
三态数据线
三态数据线
三态数据线
三态数据线
三态数据线
三态数据线
三态数据线
三态数据线
H:8位或4位并口方式,L:串口方式
复位端,低电平有效(悬空或接到5V都可以)
LCD驱动电压输出端(悬空)
背光源正端(+5V)
背光源负端(0V)
ST7920数据手册中,提到每次在写命令之前都要判断LCD是否处于空闲状态,是为0,否则为1,本次试验全过程只写不读,为了避开LCD忙的状态,可以采取隔断时间写一次命令或数据。在指令表中,可以看到每个命令执行的时间,这里注意,除清除显示和地址归位,网上有不同的说法,有的说是1.6ms,有的4.6ms外,其他命令执行时间都是72us,不管怎么样,我们还是取最大值更为靠谱,4.6ms取个整数,好听点的6ms吧。当然可以取比这个更大(LCD在显示数据时,是一个接一个的显示出来,就可以察觉到,取的越大,显示速度就越慢),看自己的决定了。利用FPGA分频,产生一个周期6ms的时钟,给LCD的E管脚,进行控制写数据或命令。在8为并口写操作时序图中,DB0~DB7是在E为高时,写入数据。
知道了何时给LCD写数据或命令,还得知道如何把自己想要显示的东西显示在LCD屏幕上,这点也不难:
第一得知道中文字行的编码,可以查国标GB2312,来调用CGROM字库,比如"文:CEC4、少:C9D9、清:C7E5&。或可以下载&汉字十六进制转换工具&软件直接生成。
第二得知道显示文字的地址该如何设置,就是一个文字我可以摆在第一行的开头或结尾或其他行。如下图示。
第三若自带的库中没有你想要的东西时,可以自己定义,比如代码中的星星月亮组合图标,库中没有,那么我们可以自己定义(组合图标的编码可以用字模软件进行提取)。自定义字符具体操作,先设定CGRAM存储地址,其次把该组合图标的编码数据放置到该地址中,在设置该图标在LCD屏幕显示的位置,最后连续写两次数据(注意写的是数据不是命令,我也被这东东栽倒一次),先写高8it,后写低8bit,就可以了。此时知道写这数据到底是啥数据。那么就得理解0x2,0x6这四种编码.至于这四种编码有什么区别,我也不是很明白,在程序中,0x6没发现有区别,显示正常;0x0002,在星星的左上角有个小点;0x0004显示乱码。
第四半宽字型,数据手册中写的是&半宽字型ROM(HCGROM),总共提供126 个西文字型(16&8 点阵)&,应该就是英文字符。程序中的"LCD12864"。
在写代码之前理清思路,程序的流程该如何跑,写起代码来也比较顺手。如下图。前面设置好频率后,每步中的延时就不用在考虑了。
代码:(使用并口,只有写)
LCD12864.v
1 module LCD12864(
13 input sys_// 50MHZ
14 input rst_n;
16 output lcd_//H:data
17 output lcd_//H:read module
L:write module
18 output lcd_//H active
19 output [7:0] lcd_
20 output lcd_//H:parallel
L:SPI module
22 /***************************************************/
23 parameter T3MS = 18'd149_999;
24 parameter
INIT_FUN_SET1 = 4'd1,
INIT_FUN_SET2 = 4'd2,
INIT_DISPLAY
INIT_CLEAR
INIT_DOT_SET
WRITE_DATA1
INIT_FUN_SET3 = 4'd8,
WRITE_DATA2
SET_DDRAM2
SET_CUSTOM_L
SET_CUSTOM_H
39 /***************************************************/
40 //产生周期为6MS的lcd_clk给LCD
41 reg [17:0]
42 reg lcd_
43 always @(posedge sys_clk or negedge rst_n)
44 if(!rst_n) begin
cnt &= 18'd0;
lcd_clk &= 1'b0;
48 else if(cnt == T3MS)begin
cnt &= 18'd0;
lcd_clk &= ~lcd_
cnt &= cnt + 1'b1;
54 /***************************************************/
55 reg lcd_
56 always @(posedge lcd_clk or negedge rst_n)
57 if(!rst_n)
lcd_rs &= 1'b0;
59 else if((state == WRITE_DATA1) || (state == WRITE_DATA2)|| (state == SET_CUSTOM_H) || (state == SET_CUSTOM_L))
lcd_rs &= 1'b1;
//写数据模式
lcd_rs &= 1'b0;
//写命令模式
63 /***************************************************/
64 reg [3:0]
65 reg [7:0] lcd_
66 reg [6:0]
68 always @(posedge lcd_clk or negedge rst_n)
69 if(!rst_n) begin
state &= IDLE;
lcd_data &= 8'
en &= 1'b1;
num &= 6'd0;
case(state)
state &= INIT_FUN_SET1;
lcd_data &= 8'
en &= 1'b1;
INIT_FUN_SET1:
lcd_data &= 8'h30;
//功能设定
state &= INIT_FUN_SET2;
INIT_FUN_SET2:
lcd_data &= 8'h30;
//功能设定
state &= INIT_DISPLAY;
INIT_DISPLAY:
lcd_data &= 8'h0c;
//显示设定
state &= INIT_CLEAR;
INIT_CLEAR:
lcd_data &= 8'h01;
state &= INIT_DOT_SET;
INIT_DOT_SET:
lcd_data &= 8'h06;
//进入点设定
state &= SET_DDRAM;
SET_DDRAM:
if(num == 7'd0)
lcd_data &= 8'h81;//1 line
else if(num == 7'd12)
lcd_data &= 8'h92;//2 line
else if(num == 7'd18)
lcd_data &= 8'h8a;//3 line
else if(num == 7'd26)
lcd_data &= 8'h99;//4 line
state &= WRITE_DATA1;
WRITE_DATA1:
if(num &= 7'd11) begin
num &= num + 1'b1;
lcd_data &= dis_
if(num == 7'd11)
state &= SET_DDRAM;
state &= WRITE_DATA1;
else if( num & 7'd11 && num &= 7'd17) begin
num &= num + 1'b1;
lcd_data &= dis_
if(num == 7'd17)
state &= SET_DDRAM;
state &= WRITE_DATA1;
else if(num & 7'd17 && num &= 7'd25) begin
num &= num + 1'b1;
lcd_data &= dis_
if(num == 7'd25)
state &= SET_DDRAM;
state &= WRITE_DATA1;
else if(num & 7'd25 && num &= 7'd33) begin
num &= num + 1'b1;
lcd_data &= dis_
if(num == 7'd33)
state &= INIT_FUN_SET3;
state &= WRITE_DATA1;
INIT_FUN_SET3:
lcd_data &= 8'h30;//功能设定
state &= SET_CGRAM;
SET_CGRAM:
lcd_data &= 8'h40;//设定CGRAM字符的位置
state &= WRITE_DATA2;
WRITE_DATA2:
if(num &= 7'd34 && num &= 7'd65) begin
num &= num + 1'b1;
lcd_data &= dis_
state &= WRITE_DATA2;
else begin
num &= 7'd0;
state &= SET_DDRAM2;
SET_DDRAM2:
lcd_data &= 8'h9e;
state &= SET_CUSTOM_H;//设置自定义显示字符编码
SET_CUSTOM_H:
lcd_data &= 8'h00;//高8bit
state &= SET_CUSTOM_L;
SET_CUSTOM_L:
lcd_data &= 8'h06;//低8bit 00:正常 02:星星左上角多了一小点 04:显示的是乱码 06:显示也正常
state &= STOP;
en &= 1'b0;//显示完了,lcd_e就一直拉为低
state &= STOP;
default: state &= IDLE;
215 /***************************************************/
216 reg [7:0] dis_
217 always @(posedge sys_clk or negedge rst_n)
218 if(!rst_n)
dis_data &= 8'
//1 Line 81位置显示 欢迎访问博客
dis_data &= 8'
dis_data &= 8'hb6;
dis_data &= 8'hd3;
dis_data &= 8'
dis_data &= 8'hb7;
dis_data &= 8'hc3;
dis_data &= 8'
dis_data &= 8'
dis_data &= 8'hb2;
dis_data &= 8'ha9;
dis_data &= 8'
dis_data &= 8'
92位置显示 文少清
dis_data &= 8'
dis_data &= 8'hc4;
dis_data &= 8'hc9;
dis_data &= 8'hd9;
dis_data &= 8'hC7;
dis_data &= 8'he5;
//3Line 8a位置显示 LCD12864
dis_data &=
dis_data &=
dis_data &=
dis_data &=
dis_data &=
dis_data &=
dis_data &=
dis_data &=
//4Line 99位置显示 谢谢!
dis_data &= 8'hd0;
dis_data &= 8'
dis_data &= 8'hd0;
dis_data &= 8'
dis_data &= 8'ha3;
dis_data &= 8'ha1;
dis_data &= " ";
//这两次空格可以不写的
dis_data &= " ";
//4line 9e位置显示星星月亮
dis_data &= 8'h08;
dis_data &= 8'h20;
dis_data &= 8'h1c;
dis_data &= 8'h10;
dis_data &= 8'h1c;
dis_data &= 8'h1c;
dis_data &= 8'
dis_data &= 8'h9e;
dis_data &= 8'h7f;
dis_data &= 8'h1e;
dis_data &= 8'h1c;
dis_data &= 8'h1f;
dis_data &= 8'h3e;
dis_data &= 8'h1f;
dis_data &= 8'h3e;
dis_data &= 8'h1f;
dis_data &= 8'h77;
dis_data &= 8'h1f;
dis_data &= 8'h41;
dis_data &= 8'h3f;
dis_data &= 8'h00;
dis_data &= 8'h7e;
dis_data &= 8'h00;
dis_data &= 8'
dis_data &= 8'h83;
dis_data &= 8'
dis_data &= 8'h7f;
dis_data &= 8'hf8;
dis_data &= 8'h3f;
dis_data &= 8'hf0;
dis_data &= 8'h0f;
dis_data &= 8'hc0;
dis_data &= 8'h00;
295 /***************************************************/
296 assign lcd_rw = 1'b0;//只有写模式
297 assign lcd_psb = 1'b1;//并口模式
298 assign lcd_en = en ?
lcd_clk : 1'b0;
299 /***************************************************/
300 endmodule
显示效果:
图片显示待续。
阅读(...) 评论()求个大神帮忙做一个基于STC89C52单片机的小设计,要求能够在液晶显示屏上显示汉字就可以啦,在线等_百度知道
求个大神帮忙做一个基于STC89C52单片机的小设计,要求能够在液晶显示屏上显示汉字就可以啦,在线等
如果有以前做过的小设计给我也可以,谢谢
我有更好的答案
加块液晶板,买电路板自己焊接也可以.老板附送原理图和测试程序,成品也可以TAOBAO去搜
有程序,有仿真,记得给分
其他类似问题
为您推荐:
液晶显示屏的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁刚出炉带汉字库(ST7920驱动)的12864液晶的反白程序,任意位置汉字反白
就三根线啊~ 强
不错,,,&&收藏了,,,
受益了~!!!!!!
不错不错 啊!呵呵
我下载,简单地换成M16,,,8MHz(就用原端口,只用了4线)试了,,,,非常成功!!!!立即收为引用库!!顶呀。。。。。。
解决大问题了,呵呵,谢谢分享
收藏好帖!!!!!!
支持,收藏了
80楼】 PWZH
等级:------
lz你好,小妹刚开始学习12864,也是ST7920驱动。现在只会显示单一的汉字(就是用指令分别写字型码的高位和低位来完成某个汉字的显示)。现在想显示一个变化的量,比如变化的频率,应该怎么办呢?着急的很,希望lz能好心帮忙。期待中...&&
用定时中断,一定时间到(比如200MS)就调用显示频率的界面
刚好用到OCMJ12864C-15
谢谢!刚好用到
lz你好,小妹刚开始学习12864,也是ST7920驱动。现在只会显示单一的汉字(就是用指令分别写字型码的高位和低位来完成某个汉字的显示)。现在想显示一个变化的量,比如变化的频率,应该怎么办呢?着急的很,希望lz能好心帮忙。期待中...
我碰到过一个问题:开始在基本模式显示字符串正常。我想反白,就切换到图形模式即写入0xff,反白后,反白的区域正常反白,但其它的地方就会出现花屏。
个完整的st7920驱动
有没有原理图呀
呵呵 对大家有用就好 现在这液晶都在角落里晾着了 现在TFT流行又便宜 玩TFT了
谢谢lanshuitianxia 黑蚂蚁!
在您的例程帮助下,带ST7920的LCD模块搞定了,这个论谈真好,热心人很多,我从中学了不少,也谢谢阿莫
Good!&&感谢一下哈!
我下了程序,正常显示时可以,但反白不行.请楼主帮看看是哪里问题 程序就是楼主的
问一下各位买的3线带汉字库的是什么型号?多少银子买的?之前的印象好像带汉字库的都很贵的,我都是自己把字元码放在程序里,反正菜单上的汉字不会很多
我用这个来做菜单,加了反白后,不同菜单间切换时中间会有花屏,且反映太慢,楼主有没有好的方法
好像有点思路了
作个记号,也许可以参考一下.&
我想问几个问题.
1.不知道为什么我的128*64的写图层只能一次写两行,写三行或以上的话就会卡死在某些语句上,请问您们有没有遇到这样的情况呢?
2.再我关机再开机的时候,LCD的图层原来没有东西的地方会多出了一些点点,可能在断电或得电瞬间LCD引脚有干扰,从而对LCD图层进行了修改.请问您们有没有遇到这样的情况呢?该怎样解决呢?
为了顶你,特意注册一个,在顶一下!!
谢谢,正在学习!
不错的东东,今天也搞了一个12864液晶!
正在学习中,过几天编个例子也传上来
灌水不是我目的,顶你才是硬道理!
顶......支持!!!能说一下用串行怎样画点和划线吗?
做个记号,以后好查
在这里非常感谢楼主的贡献!但我一点小的问题是,如果我要在第1-4行中的任一行的第1-8列,并且是此列的左边一半或者是右边一半反白的话又怎样处理呢?因为4*8的液晶显示汉字是可以显示4*8个一屏,但显示数字或字母就可以每行显示16个,假如在液晶的座标中的0X90这个地方,显示出来二个数字23,如果要将3反白显示又怎么处理呢?不知道我说明白没有,呵呵,
好东西,顶一个
怎么今天才找到要要的
好冬冬 。。。
顶 有机会玩玩 呵呵~~~&&谢谢
White_Disp(0xff,0xff,0x80,0x80,2,16);& &//反白
& && && && &Delay(500);
& && && && &White_Disp(0x00,0x00,0x80,0x80,2,16);& &//恢复(取消反白)
呵呵,才发现有取消反白指令。。。。
void White_Disp_2(uchar han,uchar lie,uchar gao)//任意一个汉字的反白程序(可调节高度)
//han行的取值范围:0~1(128x32只有2行,即0和1行)
//lie列的取值范围:1~8(128x32只有8个汉字显示)
//gao高度取值范围:1~16(标准16dot&点&汉字行大小)& && &&&
& & uchar i,j;
& & k=lie-1; //调整起始位置
& & if(han==0)
& && &&&han=0x80;//st7920显示的第一行
& & else//if(han==1)
& && &&&han=0x90;//st7920显示的第二行
& & for(j=0;j&j++)
& && &&&for(i=k;i&i++)
& && && && &wr_lcd (comm,0x34);
& && && && &wr_lcd (comm,han+j);//
& && && && &wr_lcd (comm,han+i);//
& && && && &wr_lcd (comm,0x30);
& && && && &wr_lcd (dat,0xff);
& && && && &wr_lcd (dat,0xff);
& & wr_lcd (comm,0x36);
void White_Disp_3(uchar han,uchar lie)//任意一个汉字的反白程序(固定高度为16dot)
//han行的取值范围:0~1(128x32只有2行,即0和1行)
//lie列的取值范围:1~8(128x32只有8个汉字显示)
& & uchar i,j;
& & k=lie-1; //调整起始位置
& & if(han==0)
& && &&&han=0x80;//st7920显示的第一行
& & else//if(han==1)
& && &&&han=0x90;//st7920显示的第二行
& & for(j=0;j&16;j++)
& && &&&for(i=k;i&i++)
& && && && &wr_lcd (comm,0x34);
& && && && &wr_lcd (comm,han+j);//
& && && && &wr_lcd (comm,han+i);//
& && && && &wr_lcd (comm,0x30);
& && && && &wr_lcd (dat,0xff);
& && && && &wr_lcd (dat,0xff);
& & wr_lcd (comm,0x36);
又改了改,简化函数的调用参数。。。。。。呵呵,偶不太懂avr只会8515什么的,这里只给出51的任意一个汉字反白程序,可以参考参考。。。。^_^!
//****************************************************************
//&&ocmj2x8c(st7920)写屏函数
//----------------------------------------------------------------
void wr_lcd (uchar dat_comm,uchar content)
& & uchar a,i,j;
& & Delay_us(50);
& & //cs=1;
& & sclk=0;
& & std=1;
& & for(i=0;i&5;i++)
& && &&&sclk=1;
& && &&&sclk=0;
& & std=0;
& & sclk=1;
& & sclk=0;
& & if(dat_comm)
& && &&&std=1;& &//data
& && &&&std=0;& &//command
& & sclk=1;
& & sclk=0;
& & std=0;
& & sclk=1;
& & sclk=0;
& & for(j=0;j&2;j++)
& && &&&for(i=0;i&4;i++)
& && && && &a=a&&1;
& && && && &std=CY;
& && && && &sclk=1;
& && && && &sclk=0;
& && &&&std=0;
& && &&&for(i=0;i&4;i++)
& && && && &sclk=1;
& && && && &sclk=0;
//****************************************************************
//&&反白显示:&&当data1=0xff,data2=0xff时,在x0,y0处反白显示16 xl*yl
//----------------------------------------------------------------
void White_Disp(uchar data1,uchar data2,uchar x0,uchar y0,uchar xl,uchar yl)
& & uchar i,j;
& & for(j=0;j&j++)
& && &&&for(i=0;i&i++)
& && && && &wr_lcd (comm,0x34);
& && && && &wr_lcd (comm,y0+j);
& && && && &wr_lcd (comm,x0+i);
& && && && &wr_lcd (comm,0x30);
& && && && &wr_lcd (dat,data1);
& && && && &wr_lcd (dat,data2);
& & wr_lcd (comm,0x36);
主程序里面只要这样写就是把第一行的头两个汉字反白:& && && && &偶这是51的st7920反白程序
White_Disp(0xff,0xff,0x80,0x80,2,16);& & //反白
先收了再说
有点小错误修正了一下:
我这样有个好处就是反白另一行时,其它行自动恢复了.
void fanbai(uchar x)
& & uchar i,j;& &
& & if(x&2)
& & {& && &&&
& && &&&for(j=0;j&32;j++)
& && && && &for(i=0;i&8;i++)
& && && && &{
& && && && && & wr_lcd(comm,0x34);
& && && && && & wr_lcd(comm,0x80+j);
& && && && && & wr_lcd(comm,0x80+i);
& && && && && & wr_lcd(comm,0x30);
& & & & & & & & & & & & & & & & if(x&1)
& & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & && &&&if(j&16)
& & & & & & & & & & & & & & & && &&&{& & & & & & & & & & & & & & & && &&&
& && && && && && && && &wr_lcd(da,0xff);
& && && && && && && && &wr_lcd(da,0xff);
& & & & & & & & & & & & & & & && &&&}
& & & & & & & & & & & & & & & && &&&else
& & & & & & & & & & & & & & & && &&&{
& & & & & & & & & & & && && && && & wr_lcd(da,0x00);&&
& && && && && && && && &wr_lcd(da,0x00);
& & & & & & & & & & & & & & & && &&&}
& & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & else
& && && && && & {
& & & & & & & & & & & & & & & && &&&if(j&16)
& & & & & & & & & & & & & & & && &&&{& & & & & & & & & & & & & & & && &&&
& && && && && && && && &wr_lcd(da,0x00);
& && && && && && && && &wr_lcd(da,0x00);
& & & & & & & & & & & & & & & && &&&}
& & & & & & & & & & & & & & & && &&&else
& & & & & & & & & & & & & & & && &&&{
& & & & & & & & & & & && && && && & wr_lcd(da,0xff);&&
& && && && && && && && &wr_lcd(da,0xff);
& & & & & & & & & & & & & & & && &&&}
& & & & & & & & & & & & & & & & }& && && && && && && &&&
& && && && &}
& & & && &&&for(j=32;j&64;j++)
& && && && &for(i=0;i&8;i++)
& && && && &{
& && && && && & wr_lcd(comm,0x34);
& && && && && & wr_lcd(comm,0x80+j-32);
& && && && && & wr_lcd(comm,0x88+i);
& && && && && & wr_lcd(comm,0x30);
& && && && && & wr_lcd(da,0x00);
& && && && && & wr_lcd(da,0x00);
& && && && &}
& & & & else
& & & && &&&for(j=0;j&32;j++)
& && && && &for(i=0;i&8;i++)
& && && && &{
& && && && && & wr_lcd(comm,0x34);
& && && && && & wr_lcd(comm,0x80+j);
& && && && && & wr_lcd(comm,0x80+i);
& && && && && & wr_lcd(comm,0x30);
& && && && && & wr_lcd(da,0x00);
& && && && && & wr_lcd(da,0x00);
& && && && &}
& & & & & & & & for(j=32;j&64;j++)
& && && && &for(i=0;i&8;i++)
& && && && &{
& && && && && & wr_lcd(comm,0x34);
& && && && && & wr_lcd(comm,0x80+j-32);
& && && && && & wr_lcd(comm,0x88+i);
& && && && && & wr_lcd(comm,0x30);
& & & & & & & & & & & & & & & & if(x&3)
& & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & && &&&if(j&48)
& & & & & & & & & & & & & & & && &&&{& & & & & & & & & & & & & & & && &&&
& && && && && && && && &wr_lcd(da,0xff);
& && && && && && && && &wr_lcd(da,0xff);
& & & & & & & & & & & & & & & && &&&}
& & & & & & & & & & & & & & & && &&&else
& & & & & & & & & & & & & & & && &&&{
& & & & & & & & & & & && && && && & wr_lcd(da,0x00);&&
& && && && && && && && &wr_lcd(da,0x00);
& & & & & & & & & & & & & & & && &&&}
& & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & else
& && && && && & {
& & & & & & & & & & & & & & & && &&&if(j&48)
& & & & & & & & & & & & & & & && &&&{& & & & & & & & & & & & & & & && &&&
& && && && && && && && &wr_lcd(da,0x00);
& && && && && && && && &wr_lcd(da,0x00);
& & & & & & & & & & & & & & & && &&&}
& & & & & & & & & & & & & & & && &&&else
& & & & & & & & & & & & & & & && &&&{
& & & & & & & & & & & && && && && & wr_lcd(da,0xff);&&
& && && && && && && && &wr_lcd(da,0xff);
& & & & & & & & & & & & & & & && &&&}
& & & & & & & & & & & & & & & & }& && && && && && && &&&
& && && && &}
& & & & & & & & }
& & }& &&&
& & wr_lcd (comm,0x36);
我用的是美国TRULY的12864液晶,使用反白时出现问题,主要是液晶更新的时候,要全屏一起更新才行,如果反白其中的几个字,就要其它的字全写成0x00,后一起更新,如果只是把其中几个字写成FF,显示图形后会花屏,还有就是更新的要1 2行一起写入,3 4行一起写入,全部写入后显示图形才行.大家有没有遇到过这种问题?是液晶的问题还是程序的问题,我用网上常用的反白程序都不行,而且这款液晶还是比较贵的,比国产普通液晶贵近一倍了.后来我更改了程序,4行同时更新,则可以反白其中一行了,程序如下:
void fanbai(uchar x)
& & uchar i,j;& &
& & if(x&2)
& & {& && &&&
& && &&&for(j=0;j&32;j++)
& && && && &for(i=0;i&8;i++)
& && && && &{
& && && && && & wr_lcd(comm,0x34);
& && && && && & wr_lcd(comm,0x80+j);
& && && && && & wr_lcd(comm,0x80+i);
& && && && && & wr_lcd(comm,0x30);
& & & & & & & & & & & & & & & & if(x&1)
& & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & && &&&if(j&16)
& & & & & & & & & & & & & & & && &&&{& & & & & & & & & & & & & & & && &&&
& && && && && && && && &wr_lcd(da,0xff);
& && && && && && && && &wr_lcd(da,0xff);
& & & & & & & & & & & & & & & && &&&}
& & & & & & & & & & & & & & & && &&&else
& & & & & & & & & & & & & & & && &&&{
& & & & & & & & & & & && && && && & wr_lcd(da,0x00);&&
& && && && && && && && &wr_lcd(da,0x00);
& & & & & & & & & & & & & & & && &&&}
& & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & else
& && && && && & {
& & & & & & & & & & & & & & & && &&&if(j&16)
& & & & & & & & & & & & & & & && &&&{& & & & & & & & & & & & & & & && &&&
& && && && && && && && &wr_lcd(da,0x00);
& && && && && && && && &wr_lcd(da,0x00);
& & & & & & & & & & & & & & & && &&&}
& & & & & & & & & & & & & & & && &&&else
& & & & & & & & & & & & & & & && &&&{
& & & & & & & & & & & && && && && & wr_lcd(da,0xff);&&
& && && && && && && && &wr_lcd(da,0xff);
& & & & & & & & & & & & & & & && &&&}
& & & & & & & & & & & & & & & & }& && && && && && && &&&
& && && && &}
& & & & for(j=32;j&64;j++)
& && && && &for(i=0;i&8;i++)
& && && && &{
& && && && && & wr_lcd(comm,0x34);
& && && && && & wr_lcd(comm,0x80+j-32);
& && && && && & wr_lcd(comm,0x88+i);
& && && && && & wr_lcd(comm,0x30);
& && && && && & wr_lcd(da,0x00);
& && && && && & wr_lcd(da,0x00);
& && && && &}
& & & & else
& & & && &&&for(j=0;j&32;j++)
& && && && &for(i=0;i&8;i++)
& && && && &{
& && && && && & wr_lcd(comm,0x34);
& && && && && & wr_lcd(comm,0x80+j);
& && && && && & wr_lcd(comm,0x88+i);
& && && && && & wr_lcd(comm,0x30);
& && && && && & wr_lcd(da,0x00);
& && && && && & wr_lcd(da,0x00);
& && && && &}
& & & & & & & & for(j=32;j&64;j++)
& && && && &for(i=0;i&8;i++)
& && && && &{
& && && && && & wr_lcd(comm,0x34);
& && && && && & wr_lcd(comm,0x80+j-32);
& && && && && & wr_lcd(comm,0x80+i);
& && && && && & wr_lcd(comm,0x30);
& & & & & & & & & & & & & & & & if(x&3)
& & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & && &&&if(j&48)
& & & & & & & & & & & & & & & && &&&{& & & & & & & & & & & & & & & && &&&
& && && && && && && && &wr_lcd(da,0xff);
& && && && && && && && &wr_lcd(da,0xff);
& & & & & & & & & & & & & & & && &&&}
& & & & & & & & & & & & & & & && &&&else
& & & & & & & & & & & & & & & && &&&{
& & & & & & & & & & & && && && && & wr_lcd(da,0x00);&&
& && && && && && && && &wr_lcd(da,0x00);
& & & & & & & & & & & & & & & && &&&}
& & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & else
& && && && && & {
& & & & & & & & & & & & & & & && &&&if(j&48)
& & & & & & & & & & & & & & & && &&&{& & & & & & & & & & & & & & & && &&&
& && && && && && && && &wr_lcd(da,0x00);
& && && && && && && && &wr_lcd(da,0x00);
& & & & & & & & & & & & & & & && &&&}
& & & & & & & & & & & & & & & && &&&else
& & & & & & & & & & & & & & & && &&&{
& & & & & & & & & & & && && && && & wr_lcd(da,0xff);&&
& && && && && && && && &wr_lcd(da,0xff);
& & & & & & & & & & & & & & & && &&&}
& & & & & & & & & & & & & & & & }& && && && && && && &&&
& && && && &}
& & & & & & & & }
& & }& &&&
& & wr_lcd (comm,0x36);
反白倒是挺有趣的,收藏起来,以后有时间也做个板来玩玩
至于那个滚动现实,我以前用51也做过,好象是12864自带了一条命令修改行号,再用一个循环就可以实现了.
OCMJ4*8C是液晶型号 自带程序就有逐个反白汉字的例子 主控芯片也是&&ST7920
OCMJ4*8C?液晶型号吗 我用的是MS12864-R 深圳的美视液晶
LZ用的是不是OCMJ4*8C啊?
不知你要如何的滚动呢 ST7920自带左移,右移指令 不过不爽 不如不用(4行一起动,第3行会移到第1行,第4行会移到第2行)
回去想想 呵呵 我也没写过滚动的 估计要使用绘图模式了 把文字做成图片 然后再处理一下 主要是个方法问题
我回去想想
楼主能否写个滚动汉字显示的程序吗,我的也是串行驱动,也是7920,谢谢!
不可能吧 这么巧啊?
楼主的软件和我的一样,我是在杭州炜煌买的12864
不错,顶楼主一个.......................
不错!!!
好像是很久以前的一个液晶字符转换软件
截图软件用HyperSnap-DX,先截图,再把图片转换成黑白图片。
请问楼主用的什么字模软件
作为记号以后好查。。。。。呵呵
哈哈 十一回家时逛街顺便买了个摄像头玩玩。来上几个液晶反白的效果图。效果不好,让大家见笑了。
正筹划着买个数码相机,还请大家给推荐几款效果不错的相机,价格2500以内的。
怎样用它来画线呀?用串行画线好像很难,请大家指点指点!
恩,我也是在ouravr上看到那个帖子的。不过反白子程序是自己编的,贴出来大家看看:
//*****************************************************************
//设置反白显示,
//X:开始坐标X,以字符为单位
//y:开始坐标y,0表示第一行,1表示第二行
//lenth:连续多少个字符设为反白
//reverse:为0xff时对所选字符反白,为0x00时取消所选字符的反白
void SetReverse(unsigned char x,unsigned char y,unsigned char lenth,unsigned char reverse)
{unsigned char temp1;
unsigned char StartX;
LCDWriteCmd(0x36);&&//设定为扩充指令集
Delay72us();
StartX=x&&1;
StartX+=0x80;
for(temp1=16;temp1&0;temp1--)
{unsigned char temp2;
&&LCDWriteCmd(y);//设定y坐标
&&Delay72us();
&&LCDWriteCmd(StartX);
&&Delay72us();
&&if(x&0x01)//
&&{LCDWriteData(0x00);
& &Delay72us();
&&while(temp2--)
&&{LCDWriteData(reverse);
& &Delay72us();
LCDWriteCmd(0x30);&&//设定为基本指令集
Delay72us();
是我用在一个产品液晶是RS16032上的,芯片也是st7920,只有2行,有兴趣的可以改成4行。
你反白的实验成功了吗
反白后要显示变化的数有两种方式(只是提供你这个思路)
1、用自带的字库里的数字,反白侯要切换到普通模式,再在要显示的位置写字库里的数字。
2、自己做数字的字库,用查表的方式,在绘图模式下,绘图。
PS:本程序我只是实现了任意字反白的功能,因为最近有点忙,其他如在反白位置上变换数字、文字这些功能没来的及试。这里我只是提供你这个思路。
其实,你只要理解了如何实现反白,如何切换模式,如何在指定的位置绘图,图的长度,宽度如何设定,然后自己灵活变通一下就可以解决了。
回楼主,我是想用定时器做个简单的计数器,然后把计数值显示出来,本人搞了很久(定时器的程序没问题),就是显示不了数字。能指点一下吗?
感谢楼主“lanshuitianxia 蓝水天下” 和 【4楼】 eagle2006 。
正在用金鹏的ocmj12232c-1,也是st7920的控制芯片,有的学了。
之前无奈之下都是弄个小箭头指示..
我靠~~ 及时雨啊 哈哈 那个反白真是把人搞晕 资料上面写是4行中可以随意一行进行反白后来搞了N久才清楚只能两行而且是整行反白 马上下楼主的东西看看撒...
这个好呀,才用三线,
“要显示变化的变量”指什么啊&&
&&你是想做什么啊 举个例子说说
请问楼主,如果要显示变化的变量,该怎样做呀?
谢谢,做个记号了先
呵呵 我就是用的这种方法。清除反白只要写0X00就行了。
你说的这个指令不是指液晶本身带的反白指令 其实是绘图指令
液晶自带的反白指令用起来极不爽。还不如没有这指令。
其实ST7920的反白不难了,不用指令也很简单。
就是先用字库显示汉字然后把有汉字的地方全部用绘图写FF就可以把汉字反白了,这是我无意中发现的,呵呵
不错,st7920的反白确实是个bug
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:
您需要登录后才可以回帖
阿莫电子论坛, 原"中国电子开发网"

我要回帖

更多关于 stc89c52单片机 的文章

 

随机推荐