搜索
bottom↓
回复: 7

ATMEGA128 2004液晶 驱动成功 (程序+图片)

[复制链接]

出0入0汤圆

发表于 2009-11-23 00:12:41 | 显示全部楼层 |阅读模式
看了淘宝超值宝贝推介后,早上跑去买了4块,要多了也没有用。
回来写了程序
测试成功!
上图上程序
/****************************2004.h************************************************************/
#define uchar unsigned char  
#define uint unsigned int  

#define RS 0
#define RW 1
#define EN 2

void s_ms(uint ms)
{
for(;ms>1;ms--);
}

//查忙
void busy(void)
{
    uchar temp;
s_ms(500);
PORTC&=~(1<<RS);    //RS=0
s_ms(500);
PORTC|=(1<<RW);     //RW=1
s_ms(500);
while(temp)
{
PORTC|=(1<<EN);        //EN=1
s_ms(500);
DDRA=0x00;         //A口变输入
PORTA=0xff;       //上拉使能
s_ms(500);
temp = PINA&0x80;     //读取A口
s_ms(500);      
DDRA=0xff;      
PORTA=0xff;           //A口变输出
s_ms(500);
PORTC&=~(1<<EN);      //EN=0
s_ms(500);
}
}

//写指令
void writecom(uchar com)
{
busy();
s_ms(500);
PORTC&=~(1<<RS);   //RS=0
s_ms(500);
PORTC&=~(1<<RW);   //RW=0
s_ms(500);
PORTC|=(1<<EN);    //EN=1
s_ms(500);
PORTA = com;       //输出指令
s_ms(500);
PORTC&=~(1<<EN);   //EN=0
s_ms(500);
}

//1602初始化
void LcdInit(void)
{
writecom(0x38);
s_ms(1000);
writecom(0x01);
s_ms(10000);
s_ms(1000);
s_ms(1000);
s_ms(1000);
s_ms(1000);
s_ms(1000);
s_ms(1000);
writecom(0x02);
s_ms(1000);
writecom(0x06);
s_ms(1000);
writecom(0x0c);
s_ms(1000);
writecom(0x38);
s_ms(1000);
}

//写数据
void writedata(uchar data)
{
busy();
s_ms(500);
PORTC|=(1<<RS);   //RS=1
s_ms(500);
PORTC&=~(1<<RW);   //RW=0
s_ms(500);
PORTC|=(1<<EN);    //EN=1
s_ms(500);
PORTA = data;      //输出数据
s_ms(500);
PORTC&=~(1<<EN);   //EN=0
s_ms(500);
}


//读数据
uchar readdata(void)
{
uchar temp;
busy();
s_ms(500);
PORTC|=(1<<RS);  //RS=1
s_ms(500);
PORTC|=(1<<RW);  //RW=1
s_ms(500);
PORTC|=(1<<EN);  //EN=1
s_ms(500);
DDRA=0x00;       //A端口变输入
s_ms(500);
temp = PINA;     //读A端口
s_ms(500);
DDRA=0xff;       //A端口变输出
s_ms(500);
PORTC&=~(1<<EN); //EN=0
s_ms(500);
return temp;
}

//=================================================
// 描述: 写LCD内部CGRAM函数
// 入口: ‘num’要写的数据个数
//        ‘pbuffer’要写的数据的首地址
// 出口: 无
//================================================
void WriteCGRAM(uint num, const uint *pBuffer)
{
uint i,t;
writecom(0x40);
PORTC|=(1<<RS);
PORTC&=~(1<<RW);
for(i=num;i!=0;i--)
{
t = *pBuffer;
PORTC|=(1<<EN);
PORTA = t;
PORTC&=~(1<<EN);
pBuffer++;
}

}


//================================================================
// 描述:在任意位置写任意多个字符
// 入口:’row‘要写的字符所在的行,只能为1或2;
//       ‘col’要写的字符所在的列,只能为0---15
//       ‘num’要写字符的个数
//       ‘pbuffer’要写字符的首地址
//==================================================================  
void WriteChar(uchar row,uchar col,uint num,uchar *pBuffer)
{
uchar i,t;

switch (row)
{
case 1 : row = 0x80 + col;   break;
case 2 : row = 0xC0 + col;   break;
case 3 : row = 0x94 + col;   break;
case 4 :    row = 0xD4 + col;   break;
default: break;
}
    writecom(row);

PORTC|=(1<<RS);
s_ms(500);
PORTC&=~(1<<RW);
s_ms(500);
for(i=num;i!=0;i--)
{
t = *pBuffer;
s_ms(500);
PORTA = t;
s_ms(500);
PORTC|=(1<<EN);
s_ms(500);
PORTC&=~(1<<EN);
s_ms(500);
pBuffer++;
}

}
/************************************main.c***************************************************/
#include <iom128v.h>
#include "2004.h"
#define uchar unsigned char  
#define uint unsigned int  

uchar a[]={"www.ourdev.cn"};
uchar b[]={"I Love AVR!"};
uchar c[]={"shop57085242.taobao.com"};
uchar d[]={"Airwolf 09/11/22"};

main()
{
DDRA=0xff;
PORTA=0xff;
DDRC=0xff;
PORTC=0xff;
LcdInit();
WriteChar(1,0,13,a);
WriteChar(2,0,11,b);
WriteChar(3,0,20,c);
WriteChar(4,0,16,d);
}

(原文件名:调试成功.jpg)

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入25汤圆

发表于 2009-11-23 08:55:40 | 显示全部楼层
呵呵~~我买了一箱

出0入0汤圆

发表于 2009-11-23 14:34:18 | 显示全部楼层
好呀,我也要了15个

出0入0汤圆

发表于 2009-11-23 14:59:04 | 显示全部楼层
我买了两小盒。

出0入0汤圆

发表于 2009-11-24 15:03:32 | 显示全部楼层
你好,请问我现在已经有1602的程序,将1602取下直接换为LCD2004,却没有显示,不是说兼容1602吗?能帮我分析一下原因吗?

出0入0汤圆

发表于 2009-11-24 16:15:59 | 显示全部楼层
LS,你调节一下调对比度的那个电阻试试~~~

出0入0汤圆

发表于 2013-12-17 17:28:31 | 显示全部楼层
MARK

出0入0汤圆

发表于 2013-12-17 21:58:18 来自手机 | 显示全部楼层
谢谢分享
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-23 23:26

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

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