搜索
bottom↓
回复: 116

我被一块240128的LCD搞得快辞职了

[复制链接]

出0入0汤圆

发表于 2009-11-24 14:55:03 | 显示全部楼层 |阅读模式
我要用Atmega16驱动一块240128的LCD,精心设计了一个月,用Protues模拟实现了所有要求的内用,今天开的板子下来了,正是等待丰收的时候。
我把程序下进去以后,却什么都显示不出来,线路我检查了,也没发现问题,搞得我快辞职了。今天,我来这里做最后一搏。我把程序浓缩了一下,显示结果就是在屏幕第一行第一列输出一个8,刚用protues模拟完,可以显示,可下到单片机里就不行,大家帮我看看哪里有错误?

#include <iom16v.h>
#include <macros.h>

#define cchar           const unsigned char
//8X16字库
const unsigned char  fons[16]={

0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x24,0x18,0x24,0x42,0x42,0x42,0x3C,0x00,0x00,

};

#define LCD_RW          PC2
#define LCD_RD          PC3
#define LCD_CE          PC0
#define LCD_CD          PC1
#define LCD_RES         PC4
#define LCD_CODE_P      PORTC

#define LCD_RW_H        LCD_CODE_P |=  BIT(LCD_RW)
#define LCD_RW_L        LCD_CODE_P &= ~BIT(LCD_RW)
#define LCD_RD_H        LCD_CODE_P |=  BIT(LCD_RD)
#define LCD_RD_L        LCD_CODE_P &= ~BIT(LCD_RD)
#define LCD_CE_H        LCD_CODE_P |=  BIT(LCD_CE)
#define LCD_CE_L        LCD_CODE_P &= ~BIT(LCD_CE)
#define LCD_CD_H        LCD_CODE_P |=  BIT(LCD_CD)
#define LCD_CD_L        LCD_CODE_P &= ~BIT(LCD_CD)
#define LCD_RES_H       LCD_CODE_P |=  BIT(LCD_RES)
#define LCD_RES_L       LCD_CODE_P &= ~BIT(LCD_RES)

#define LCD_DATA        PINB
#define LCD_DDR         DDRB
#define LCD_PORT        PORTB

#define LCD_LEFT        0
#define LCD_TOP         0
#define LCD_RIGHT       239
#define LCD_BOTTOM      127

#define LCD_DELAY       0
#define uchar           unsigned char
#define uint            unsigned int

uint lcd_line=0;//全局变量,用于显示光标定位

//#define movepoint(n) lcd_line=n  //细化地指定位置,n=0~30*128-1
/***********************************************************************************/
void lcd_delay(uint time)
{
        uint i;
        while(time--){
                i=1000;
                while(--i);
        }
}
/***********************************************************************************/
void lcd_wd(uchar lcd_data)/*写数据*/
{
        LCD_DDR          = 0X00;
        LCD_CODE_P      &= ~(BIT(LCD_RD) | BIT(LCD_CE));
        /*LCD_CODE_P       = 0XF9;*/
        while((LCD_DATA & 0X03) != 0X03);
        LCD_RD_H;
        LCD_CD_L;
        LCD_RW_L;
        /*LCD_CODE_P       = 0XF2;*/
        LCD_DDR          = 0XFF;
        LCD_PORT         = lcd_data;
        LCD_CODE_P       |= (BIT(LCD_RW) | BIT(LCD_RD) | BIT(LCD_CD) | BIT(LCD_CE));
}
/***********************************************************************************/
void lcd_wc(uchar lcd_code)/*写命令*/
{
        LCD_DDR          = 0X00;
        LCD_CODE_P      &= ~(BIT(LCD_RD) | BIT(LCD_CE));
        /*LCD_CODE_P      = 0XF9;*/
        while((LCD_DATA & 0X03) != 0X03);
        LCD_RD_H;
        LCD_RW_L;
        /*LCD_CODE_P       = 0XFA;*/
        LCD_DDR          = 0XFF;
        LCD_PORT         = lcd_code;
        LCD_CODE_P       |= (BIT(LCD_RW) | BIT(LCD_RD) | BIT(LCD_CD) | BIT(LCD_CE));
}
/***********************************************************************************/
void lcd_wc3(uchar lcd_code,uchar lcd_data1,uchar lcd_data2)
{
        lcd_wd(lcd_data1);
        lcd_wd(lcd_data2);
        lcd_wc(lcd_code);
}
void port_init(void)
{
      
        PORTD = 0xFF;
        DDRD  = 0xFF;
        PORTB = 0x00;
        DDRB  = 0x00;
            PORTA = 0x00;
        DDRA  = 0x00;
        PORTC = 0xFF;
        DDRC  = 0xFF;
}
void lcd_init(void)
{
        port_init();
        LCD_RES_H;
        LCD_RES_L;
        lcd_delay(15);
        LCD_RES_H;
        lcd_wc(0x80);          //设置显示模式为逻辑“或”模式
        lcd_wc(0x98);          //开显示
        lcd_wc3(0x40,0,0);     //设置文本显示区首地址
        lcd_wc3(0x41,30,0);    //设置文本显示区宽度
        lcd_wc3(0x42,0,0);     //设置图形显示区首地址
        lcd_wc3(0x43,30,0);    //设置图形显示区宽度
                lcd_wc(0x98);          //设置为图形显示
}

void lcd_print(uint x,uchar lcd_data)
{
        //lcd_wc(0x98);
        lcd_wc3(0x24,(uchar)x,(uchar)(x>>8));
        lcd_wc(0xb0);
        lcd_wd(lcd_data);
        lcd_wc(0xb2);
}
/**********************************************************************************/
void put8x16(const uchar *s){//输出一个8x16点阵的数
        uint temp;
                uchar i;
                temp=lcd_line;
                for(i=0;i<16;i++,temp+=30)
             lcd_print(temp,s);
}

void main(void)
{
    lcd_init();
        put8x16(fons);
}
我还伴随一个问题,就是插上LCD无法下载程序,拔了就可以下载
我听说LCD里要有驱动程序,有这么一回事吗?如果要加驱动怎么往LCD里下,另外到哪去弄LCD的驱动程序?

出0入0汤圆

发表于 2009-11-24 15:00:16 | 显示全部楼层
辞职?是6963控制器的?我传个给你
点击此处下载 ourdev_506793.rar(文件大小:5K) (原文件名:240128.rar)

出0入0汤圆

发表于 2009-11-24 15:01:00 | 显示全部楼层
速度问题,单片机和LCD速度不一样

出0入0汤圆

发表于 2009-11-24 15:01:28 | 显示全部楼层
稳住稳住 坛子里高手很多的 别弄不弄就把自己往绝路上逼

出0入0汤圆

发表于 2009-11-24 15:03:59 | 显示全部楼层
是不是PORTC口与JTAG口冲突了

出0入0汤圆

发表于 2009-11-24 15:05:15 | 显示全部楼层
延时时间太短了,这个模拟看不出来差别来的。

出0入0汤圆

发表于 2009-11-24 15:08:24 | 显示全部楼层
无非就几个问题,复位,上拉,时序,电压,延时……

出0入0汤圆

发表于 2009-11-24 15:09:39 | 显示全部楼层
仔细描述一下,从上电开始屏的现象。

仿真信不过,我从来都不仿真,程序写好直接下进去看现象。(关键是不会仿真。。)

出0入0汤圆

发表于 2009-11-24 15:17:48 | 显示全部楼层
void main(void)
{
    lcd_init();
put8x16(fons);
}


void main(void)
{
   lcd_init();
   while(1)
  {
    put8x16(fons);
  }
}

以后最好不要用什么模拟软件,玩一下 还好了

出0入0汤圆

发表于 2009-11-24 15:20:08 | 显示全部楼层
延时,还是延时,LCD操作延时够了一般很容易调出来。你看一下LCD手册中每个命令的执行时间

出0入0汤圆

发表于 2009-11-24 15:23:11 | 显示全部楼层
Protues 不知道害了多少人。你要是做开发,示波器,逻辑分析仪是少不了的,还有仿真器。

出0入0汤圆

发表于 2009-11-24 15:25:12 | 显示全部楼层
还有你的lcd屏的数据手册呢?复位时间,数据保持时间等等。不要告诉我你没看数据手册就开始开发。时间很重要,不然延时时间怎么确认。

出0入0汤圆

发表于 2009-11-24 15:26:12 | 显示全部楼层
延时,还是延时

出0入0汤圆

发表于 2009-11-24 15:28:54 | 显示全部楼层
看了lz的帖子,晕死。

出0入0汤圆

发表于 2009-11-24 15:29:41 | 显示全部楼层
void main(void)
{
    lcd_init();
put8x16(fons);
}

?

出0入0汤圆

发表于 2009-11-24 15:37:58 | 显示全部楼层
仿的再真,终究还是仿的

我觉得仿真用来模拟理论知识不错,比如模电。 单片机就算了吧

出0入0汤圆

发表于 2009-11-24 15:38:16 | 显示全部楼层
【10楼】 heky
积分:802
派别:
等级:------
来自:
Protues 不知道害了多少人。你要是做开发,示波器,逻辑分析仪是少不了的,还有仿真器。  
   
____________________________________________________________________________________

不同意10楼的,Protues作为一个单片机仿真软件个人觉得是相当不错,我用Protues也有两年时间了,一般来说,仿真是什么情况实际就是什么情况。但我只用它作单片机仿真,如果是电路仿真我看算了还是自己搭电路做吧。
LZ别动不动就辞职,今天不行明天又做就是了。

出0入0汤圆

发表于 2009-11-24 15:53:02 | 显示全部楼层
是不是负压不对,太暗了看不出来?
或者1-20脚位搞反了?

出0入0汤圆

发表于 2009-11-24 15:59:30 | 显示全部楼层
手工搭个电路也不是很难,错了可以改.做板回来不行就挨老板批了

出0入0汤圆

发表于 2009-11-24 15:59:31 | 显示全部楼层
我能这么讲 Protues 是因为我被他害过,我用max7219芯片时,电脑仿真就是不对,但是实际可以工作。后来还发现跟电脑配置还有关。你可以相信他,可能你有时间,有精力。反正我觉得还是实际硬件验证才是硬道理。

出0入0汤圆

发表于 2009-11-24 16:02:11 | 显示全部楼层
我也试过proteus的7219,仿真行时,实际电路不行,实际电路行时,仿真不行,晕

出0入0汤圆

发表于 2009-11-24 16:04:24 | 显示全部楼层
沉稳的心态比技术更为重要。

出0入0汤圆

发表于 2009-11-24 16:08:33 | 显示全部楼层
楼主,上个图片或视频最实际!
那么多的高手,你还怕搞不定?

出0入0汤圆

 楼主| 发表于 2009-11-24 16:09:53 | 显示全部楼层
我还伴随一个问题,就是插上LCD无法下载程序,拔了就可以下载

出0入0汤圆

发表于 2009-11-24 16:17:13 | 显示全部楼层
lcd_wc3(0x24,(uchar)x,(uchar)(x>>8));

这个语句要注意一下。建议这样使用

uchar m,n;
m = (uchar)(x>>8));
n = (uchar)x;
lcd_wc3(0x24,n,m);

感觉ICC编译器有点“傻”。我发现过问题

出0入0汤圆

发表于 2009-11-24 16:18:33 | 显示全部楼层
我也是用proteus仿真,关键是他太方便了,搭个电路几分钟。
确实是有很多地方和实际不一样,但是proteus作为辅助是很方便的。。

出0入0汤圆

发表于 2009-11-24 16:20:10 | 显示全部楼层
仿真并不能代替打样,建议实际开发中还是尽量用实物.

出0入0汤圆

发表于 2009-11-24 16:23:38 | 显示全部楼层
确认下,单片机是不是正常工作了?

出0入0汤圆

发表于 2009-11-24 16:28:31 | 显示全部楼层
仿真之前必须弄清楚:
你软件里的LCD和你手头的LCD是否一样

出0入0汤圆

发表于 2009-11-24 16:39:13 | 显示全部楼层
看看对比电路,以前刚搞液日的时候也和你一样,用的12864,最后发现VO的接法不对,要接个电位器来调对比度
没用过240128,参考一下,

出0入0汤圆

发表于 2009-11-24 16:49:38 | 显示全部楼层
做项目的话不要用PROTEUS 有时候这个软件很RZ。仿得毕竟是仿得。要实实在在的东西摆在面前才行
一块240 128的屏搞不定不至于让你想到辞职吧
沉住气用JTAG搞一下马上就知道问题在哪里了

出0入0汤圆

发表于 2009-11-24 16:54:28 | 显示全部楼层
我们一起来帮助楼主吧

出0入0汤圆

发表于 2009-11-24 16:54:32 | 显示全部楼层
不着急的

出0入0汤圆

发表于 2009-11-24 16:56:02 | 显示全部楼层
先确定对比度和背光吧~硬件没问题再说~在不就炒了老板的鱿鱼
(原文件名:lol.gif)

出0入0汤圆

发表于 2009-11-24 16:58:28 | 显示全部楼层
【23楼】 wuyueprotel
我还伴随一个问题,就是插上LCD无法下载程序,拔了就可以下载

是否和JTAG 有关 ?用ISP或是JTAG下载的?

出0入147汤圆

发表于 2009-11-24 17:00:36 | 显示全部楼层
第一次看到用Proteus的结果来判断电路的...
拿个万用表量一量单片机的复位脚,时钟脚,还有液晶的负压是否正常

出0入0汤圆

发表于 2009-11-24 17:06:44 | 显示全部楼层
不要再玩软件仿真了。
有时间去仿真,还不如腐蚀块板。

出0入0汤圆

发表于 2009-11-24 17:08:24 | 显示全部楼层
T6963C的速度是很快的,以前用m128总线驱动,11mhz晶振,很轻松。

出0入0汤圆

发表于 2009-11-24 17:12:59 | 显示全部楼层
无非三点:
1, MCU是否工作了,这点容易解决,写个最简单的软件测试就可以了。
2,时序问题,既然在PROTEUS仿真成功,如果还是时序的问题,那延时多点点你应该解决。
3,液晶背光问题,液晶背光供电方式有几种的,认真看看数据手册,或是直接电话供应商问就是。
第三点问题可能性较大。

出0入147汤圆

发表于 2009-11-24 17:14:06 | 显示全部楼层
6963C用总线速度确实很快,而且操作显存很方便,以前做项目时还把它的显存当RAM来用了

出0入0汤圆

发表于 2009-11-24 17:17:01 | 显示全部楼层
用proteus仿真过1602,仿真时显示正常
可以遇到实际的板子,一点反映都没有,晕啊
之后就基本不用了

出0入0汤圆

发表于 2009-11-24 17:39:57 | 显示全部楼层
楼主程序是ISP还JTAG下进去的?
你用了PB口作数据口,ISP的方式下程序时会出现冲突,下不了程序的现象
你也用了JTAG口作I/O口用,确定关闭了JTAG功能?

出0入0汤圆

发表于 2009-11-24 18:10:49 | 显示全部楼层
能不用仿真软件,就少用,有时把简单的事搞复杂了

出0入0汤圆

发表于 2009-11-24 18:15:26 | 显示全部楼层
没有留JTAG口么?

出0入0汤圆

发表于 2009-11-24 18:22:37 | 显示全部楼层
首先确定单片机是否运行,用LED做个延时闪烁,或串口发连续数据。
第二,就是上面说的,时序问题,延时问题
第三,JTAG最好不要复用,经验不够老道的还是放在那好。
祝好运!

出0入0汤圆

发表于 2009-11-24 18:45:03 | 显示全部楼层
示波器+逻辑分析仪 才是正道!

出0入0汤圆

发表于 2009-11-24 18:57:22 | 显示全部楼层
LCD出问题最多的地方:
1.初始化
2.时序
3.弄错了控制芯片
4.注意引脚是不是和手册一样

另外LZ测测单片机是否工作正常

出0入0汤圆

发表于 2009-11-24 21:11:35 | 显示全部楼层
看看单片机和液晶是否通讯正常,比如说读一下液晶的状态位
再看看液晶的手册,初始化顺序
楼上也有提醒液晶的复位电路,偏压正常不

出0入0汤圆

发表于 2009-11-24 22:20:02 | 显示全部楼层
你的LCD 初始化好像有问题,一般先设置 文本区和图形区的起始地址、宽度后,才打开文本区和图形区(要全打开,否则在 Protues仿真正常,到硬件上就不正常了),再设置它们的关系即可。

出0入0汤圆

发表于 2009-11-24 22:26:14 | 显示全部楼层
你的是 0x98,应该是 0x9C

出0入0汤圆

发表于 2009-11-25 03:01:52 | 显示全部楼层
延时问题

出0入0汤圆

发表于 2009-11-25 07:09:46 | 显示全部楼层
没用过AVR,main里面没有个while(1)什么的,程序跑不飞啊?

出0入0汤圆

发表于 2009-11-25 08:59:17 | 显示全部楼层
【51楼】 mawenwei 小马
积分:99
派别:
等级:------
来自:山西*上海
没用过AVR,main里面没有个while(1)什么的,程序跑不飞啊?  
__________________________

翻上去一看,呵呵,怪不得他说就显示一个8
头像被屏蔽

出0入0汤圆

发表于 2009-11-25 09:06:44 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2009-11-25 09:30:52 | 显示全部楼层
看了楼主的另外一个帖子 我也比较赞同辞职

出0入0汤圆

发表于 2009-11-25 09:31:23 | 显示全部楼层
刚刚看了一下,果真是没有while(1)的....

出0入0汤圆

发表于 2009-11-25 10:33:01 | 显示全部楼层
看完帖子后,我支持楼主辞职,

出0入0汤圆

发表于 2009-11-25 10:37:18 | 显示全部楼层
这种时序严格的东西 根本不合适用 Protues

出0入0汤圆

发表于 2009-11-25 10:43:06 | 显示全部楼层
楼主大可不必灰心,不必辞职.

从会C语言到能用C语言写单片机程序,有个过程.经历过一两个产品后,就会发现很简单.

出0入147汤圆

发表于 2009-11-25 10:44:59 | 显示全部楼层
纠正楼上某几位的观点,跑不跑飞跟加不加while(1)关系不大,以GCC为例,编译器默认都会在main函数的最后加上这么一句:
jmp        _exit

对应的_exit为:
_exit:
    rjmp        .-2

相当于加了个while(1)。

出0入0汤圆

发表于 2009-11-25 11:41:51 | 显示全部楼层
lz怎么样了?

出0入0汤圆

发表于 2009-11-25 12:28:20 | 显示全部楼层
慢慢来吧,细心,先别慌~~

出0入0汤圆

发表于 2009-11-25 12:46:18 | 显示全部楼层
纠正楼上某几位的观点,跑不跑飞跟加不加while(1)关系不大,以GCC为例,编译器默认都会在main函数的最后加上这么一句:
jmp _exit

对应的_exit为:
_exit:
    rjmp .-2

相当于加了个while(1)。
____________________________________________________________________________________
HOHO,还没用到过GCC,谢谢了,有机会瞅瞅

出0入0汤圆

发表于 2009-11-25 12:49:53 | 显示全部楼层
应急措施,~LZ应该寻求所在地的网友们帮忙,周边的也可以,我们无法看见LZ的硬件是否有误,将硬件给他们,适当的给点费用就可以了,只

是个LCD底层驱动而已,不要拿辞职开玩笑

软件问题很好解决,分把钟的问题,就怕你硬件没搞对,重做板

出0入0汤圆

发表于 2009-11-25 12:58:11 | 显示全部楼层
程序时序,如果供应商有提供参考程序,可参考,只要是对应控制器的,一般就不会有什么问题,除非自己改得不正确哈。

我们有很多客户出现显示屏无显示有个重要原因,玻璃的负压未正确供给而导致,这里请仔细检查。

出0入0汤圆

发表于 2009-11-25 13:06:28 | 显示全部楼层
看看仿真的LCD控制芯片和实物的是不是一种?

出0入0汤圆

发表于 2009-11-25 13:13:47 | 显示全部楼层
遇到问题慢慢来,总有办法解决,怎么这么快想到辞职?

出0入0汤圆

 楼主| 发表于 2009-11-25 17:14:47 | 显示全部楼层
I am lz.
I keep fighting to the end!!!

出0入0汤圆

发表于 2009-11-25 17:34:23 | 显示全部楼层
现在做产品开发老简单咯,元件选型的时候就要找个技术支持比较好的厂家,像这种底层驱动的事情搞不定就叫厂家,跑这发帖意义实在不大。

出0入0汤圆

发表于 2009-11-25 19:12:14 | 显示全部楼层
希望楼主不要用工程师自居,新手,还有很漫长的路要走。。。

出0入0汤圆

发表于 2009-11-25 23:15:42 | 显示全部楼层
如果是用 GCC 的话,lcd_delay(uint time) 这个函数要小心

/***********************************************************************************/
void lcd_delay(uint time)
{
        uint i;
        while(time--){
                i=1000;
                while(--i);
        }
}
/***********************************************************************************/

uint i 最好改成是 volatile uint i
我曾经吃过一次苦头,搞到我现在对于 delay 的函数都用汇编.

出70入0汤圆

发表于 2009-11-30 17:09:10 | 显示全部楼层
通常,仿真通过,实物不通过的原因都是延时的问题。楼主搞个液晶驱动搞不好就面临被炒了,有点夸张

出0入0汤圆

发表于 2009-11-30 21:36:24 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-11-30 22:50:25 | 显示全部楼层
仿真不信的,得出实物的,12864...不会这么难吧...

出0入0汤圆

发表于 2009-12-1 01:09:27 | 显示全部楼层
应该是延时问题,我用meg128驱动24064也是这样,不是花屏就是缺点,移到51上也可以,后来按说明上延时就OK了

出0入0汤圆

发表于 2009-12-1 08:03:34 | 显示全部楼层
这么多好言好策,楼主应该搞通了.

出0入0汤圆

发表于 2009-12-1 09:41:36 | 显示全部楼层
我这边有很多240128的板子  自己做的

插上屏幕无法下载很正常,因为你屏幕接口用到了ISP或JTAG口,而屏幕在不工作的时候 有几只脚会强制拉低。
没字显示负压其实也好调整,看阴影就知道
LCD没有驱动程序。

出0入0汤圆

 楼主| 发表于 2009-12-2 14:43:16 | 显示全部楼层
我是LZ,我把产品搞出来了

(原文件名:图像165.jpg)


(原文件名:图像163.jpg)

问题出在这里:
一硬件方面:
背光灯一定要调对,背光灯如果没调好,即使硬件电路正确,软件正确,也什么都显示不出来。
二软件方面:
单片机反应快,LCD反应慢;所以单片机对LCD说话要慢慢的说,说快了,即使说得全对,LCd也听不懂。
这就要在读写指令要加延时;另外,LCD初始化以后,一定要清屏!
现在我把地层驱动函数发出来
#define LCD_OUT    PORTB
#define LCD_IN     PINB
#define dir_datap  DDRB

#define dir_conp   DDRD
#define port_conp  PORTD

#define LCM 1  //数据寄存器、控制寄存器选择
#define RD 5
#define WR 3

// T6963C 命令定义
#define LC_ADD_POS 0x24 // 地址指针位置a
#define LC_TXT_STP 0x40 // 文本区首址a
#define LC_TXT_WID 0x41 // 文本区宽度
#define LC_GRH_STP 0x42 // 图形区首址
#define LC_GRH_WID 0x43 // 图形区宽度
#define LC_MOD_OR 0x80 // 显示方式逻辑或

#define LC_DIS_SW 0x90 // 显示开关D0=1/0:光标闪烁启用/禁用

#define LC_CUR_SHP 0xA0 // 光标形状选择0xA0-0xA7表示光标占的行数a
#define LC_AUT_WR 0xB0 // 自动写设置a

#define LC_AUT_OVR 0xB2 // 自动读/写结束a

#define NOP() asm("nop")

#define uchar           unsigned char
#define uint            unsigned int
void port_init(void)
{
      
        PORTD = 0xFF;
        DDRD  = 0xFF;
        PORTB = 0x00; //m103 output only
        DDRB  = 0x00;
            PORTA = 0x00; //m103 output only
        DDRA  = 0x00;
        PORTC = 0xFF;
        DDRC  = 0xFF;
}
/************************************************/
/* 读状态*/
/************************************************/
unsigned char RD_LCM(void)
{
    unsigned char temp;
    dir_datap=0x00;
    port_conp  |= (1 <<LCM ); //LCM=LCMCW;
    port_conp &= ~(1 << RD);  //RD=0;
    NOP();
    temp=LCD_IN;
    port_conp |= (1<<RD);     //RD=1;
    dir_datap = 0xff;
    return(temp);
}
/************************************************/
/* 读数据*/
/************************************************/
unsigned char RD_DAT(void)
{
    unsigned char temp;
    dir_datap = 0x00;
    port_conp &= ~(1<<LCM);     //LCM=LCMDW;
    port_conp &= ~(1 << RD);    //RD=0;
    NOP();
    temp = LCD_IN;
    port_conp |= (1<<RD);       //RD=1;
    dir_datap = 0xff;
    return(temp);
}
/************************************************/
/* 写数据*/
/************************************************/
void WR_DAT(unsigned char val)
{
    dir_datap = 0xff;
    port_conp &= ~(1<<LCM);     //LCM=LCMDW;
    LCD_OUT = val;
    port_conp &= ~(1<<WR);      //WR=0;
    NOP();
    NOP();
    port_conp |= (1<<WR);       //WR=1;
}
/************************************************/
/* 写命令*/
/************************************************/
void WR_CMD(unsigned char val)
{
    dir_datap = 0xff;
    port_conp  |= (1 << LCM);    //LCM=LCMCW;
    LCD_OUT = val;
    port_conp &= ~(1<<WR);       //WR=0;
    NOP();
    NOP();
    port_conp |= (1<<WR);        //WR=1;
}
/************************************************/
/* 状态位STA1,STA0判断读写指令和读写数据*/
/* 在读写数据或者写入命令前必须保证均为1 */
/************************************************/
unsigned char fnSTA01(void)
{
    unsigned char i;
    for(i=10;i>0;i--)
    {
        if((RD_LCM() & 0x03) == 0x03) // 读取状态
        {
            break;
        }
    }
    return(i); // 若返回零说明错误
}

/***********************************************/
/* 状态位STA3 判断STA3 = 1 数据自动写状态*/
/***********************************************/
unsigned char fnSTA3(void)
{
    unsigned char i;
    for(i=10;i>0;i--)
    {
        if((RD_LCM() & 0x08) == 0x08)
        {
            break;
        }
    }
    return(i); // 若返回零说明错误
}

/************************/
/* 写双参数的指令*/
/************************/
unsigned char fnPR1(unsigned char uCmd,unsigned char uPar1,unsigned char uPar2)
{
    if(fnSTA01() == 0)
    {
        return 1;
    }
    WR_DAT(uPar1);
    if(fnSTA01() == 0)
    {
        return 2;
    }
    WR_DAT(uPar2);
    if(fnSTA01() == 0)
    {
        return 3;
    }
    WR_CMD(uCmd);
    return(0); // 返回0 成功
}
/************************/
/* 写单参数的指令*/
/************************/
unsigned char fnPR11(unsigned char uCmd,unsigned char uPar1)
{
    if(fnSTA01() == 0)
    {
        return 1;
    }
    WR_DAT(uPar1);
    if(fnSTA01() == 0)
    {
        return 2;
    }
    WR_CMD(uCmd);
    return(0); // 返回0 成功
}
/************************/
/* 写无参数的指令*/
/************************/
unsigned char fnPR12(unsigned char uCmd)
{   
    if(fnSTA01() == 0)
    {
        return 1;
    }
    WR_CMD(uCmd);
    return(0); // 返回0 成功
}
/************************/
/* 写数据*/
/************************/
unsigned char fnPR13(unsigned char uData)
{
    if(fnSTA3() == 0)
    {
        return 1;
    }
    WR_DAT(uData);
    return(0); // 返回0 成功
}
/************************/
/* 读数据*/
/************************/
unsigned char fnPR2(void)
{
    unsigned char temp;
    if(fnSTA01() == 0)
    {
         return 1; // 获取状态如果状态错
    }
    temp=RD_DAT();
    return(temp); // 返回数据
}

/*********************/
/* 清屏*/
/*********************/
void cls(void)
{
    unsigned int i;
    fnPR1(LC_ADD_POS,0x00,0x00); // 置地址指针为从零开始
    fnPR12(LC_AUT_WR); // 自动写
    for(i=0;i<240*128/8;i++) // 清一屏
    {
        fnSTA3();
        fnPR13(0x0); // 写数据实际使用时请将0x55 改成0x0
    }
    fnPR12(LC_AUT_OVR); // 自动写结束
    fnPR1(LC_ADD_POS,0x00,0x00); // 重置地址指针
   
}
/************************/
/* LCM 初始化*/
/************************/
char fnLCMInit(void)
{
    if(fnPR1(LC_TXT_STP,0x00,0x00) != 0) // 文本显示区首地址
    {
        return (0xff);
    }
    fnPR1(LC_TXT_WID,0x1E,0x00); // 文本显示区宽度
    fnPR1(LC_GRH_STP,0x00,0x00); // 图形显示区首地址
    fnPR1(LC_GRH_WID,0x1E,0x00); // 图形显示区宽度
    fnPR12(LC_CUR_SHP | 0x01); // 光标形状
    fnPR12(LC_MOD_OR); // 显示方式设置
    fnPR12(LC_DIS_SW | 0x08); // 显示开关设置
    return(0);
}
最后我要说的是protues是个非常好的软件,我们不能求全责备。一但protues模拟出来,我们就离胜利很近了!!!
最后再一次谢谢大家!!!

出0入0汤圆

发表于 2009-12-2 16:26:42 | 显示全部楼层
害的 我差点亲自出马

出0入0汤圆

发表于 2009-12-2 21:15:12 | 显示全部楼层
学习

出0入0汤圆

发表于 2009-12-2 22:43:21 | 显示全部楼层
学习

出0入0汤圆

发表于 2009-12-3 12:42:27 | 显示全部楼层
你是不是负压没搞好?,显示屏的那个VO

出0入0汤圆

发表于 2009-12-3 13:24:22 | 显示全部楼层
怎么又一个被LCD逼得要辞职的...

出0入0汤圆

 楼主| 发表于 2009-12-3 15:03:31 | 显示全部楼层
我是LZ.我是第一次被一块240128的LCD搞得快辞职了
上次那个被一块240128的LCD搞得快辞职了的人不是我!!!

出0入0汤圆

发表于 2009-12-3 15:14:57 | 显示全部楼层
看见题目,让我想起了那个 AVR驱动液晶,也是快辞职了!!

出0入0汤圆

发表于 2009-12-3 21:05:18 | 显示全部楼层
呵呵 就这个也要辞职  你受打击的能力的也太强了吧

出0入0汤圆

发表于 2009-12-4 20:01:59 | 显示全部楼层
我做的

(原文件名:DSCN2200.jpg)

出0入0汤圆

发表于 2010-6-27 11:23:04 | 显示全部楼层
学习了。mark

出0入0汤圆

发表于 2010-6-27 21:56:17 | 显示全部楼层
嗯···

出0入0汤圆

发表于 2010-7-26 17:51:37 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-26 18:57:02 | 显示全部楼层
我的一點點屏經驗:
                 1,先確定MCU與屏的聯線是否正確,一般檢查兩遍!
                 2,上電確定電源電壓及VO是否正確,在沒有燒錄程式或沒裝單片機時,先把VO調到,LCD上顯示輕微底色時即可!
                 3,寫指令或寫數據的子程式的延時剛開始可以寫長一些(比IC SPEC上規定的長些),等程式完成的差不多,再最後慢慢試著調至最快!
                 4,初始是否寫成功的判斷,上電後屏會出現很多雜亂無章的點(不是線)那說明初始成功!
                 5,先寫個全屏顯示,成功後,再寫一些點,線,字或圖片!

                                       希望對大家有點用!

出0入0汤圆

发表于 2010-7-26 19:15:09 | 显示全部楼层
86楼的界面很好看,怎么做出来啊

出0入0汤圆

发表于 2010-7-26 22:00:56 | 显示全部楼层
回复【92楼】kyughanum 初级玩家
86楼的界面很好看,怎么做出来啊
-----------------------------------------------------------------------

功夫不负有心人。。。。。

出10入0汤圆

发表于 2010-7-26 22:20:26 | 显示全部楼层
被屏玩转转的一律确定为初级阶段的电子民工!

出0入0汤圆

发表于 2010-7-27 11:16:59 | 显示全部楼层
ll

出0入0汤圆

发表于 2010-12-15 14:53:54 | 显示全部楼层
回复【77楼】wuyueprotel
我是lz,我把产品搞出来了

最后我要说的是protues是个非常好的软件,我们不能求全责备。一但protues模拟出来,我们就离胜利很近了!!!
最后再一次谢谢大家!!!
-----------------------------------------------------------------------

楼主尊重事实,实事求是。值得顶!
不论哪一种仿真软件,能够立足,必有存在的道理,人家不是白吃饭的。

出0入0汤圆

发表于 2010-12-15 16:31:37 | 显示全部楼层
在找不到问题出在哪里的时候,确实很愁人

出0入0汤圆

发表于 2010-12-15 16:32:31 | 显示全部楼层
标记

出0入0汤圆

发表于 2010-12-24 21:05:28 | 显示全部楼层
至于吗,遇到问题不要慌,不要急,车到山前必有路,

出0入0汤圆

发表于 2010-12-24 21:26:37 | 显示全部楼层
1程序延时很重要。曾经的18B20也是改了延时弄好的,自定义总线延时弄好的,不会写韦根,老古那下了一个别人弄不成的求助贴里德程序延时调整好读数据正常了。

2proteus 还是用来验证程序架构比较合适,细节还是搭板子来的踏实。

3如果在公司压力那么大,还是辞了吧,本人就是刚跳了。在原公司总是有很多不痛快的事情(工作之外的)。慎重选择了一个新公司,用了20分钟把别人做的51+ENC28J60移植到自己的板子上成功。用了两个工作日实现了TCP-MODBUS。这样的效率是原来不可能实现的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 11:42

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表