佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1441|回复: 5

....Initialize LCD.....

[复制链接]
发表于 16-7-2008 11:24 AM | 显示全部楼层 |阅读模式
大家好,我最近在学MCU,一个人学太闷了,遇到问题也没什么人可以讨论,所以就上来和大家研究研究吧。
我是用AT89c51ed2来control LCD,programming code 是C code,Programming software 是SDCC....
我打了整天的篇码(code)可就是不能generate .hex file 出来。
希望大家帮帮忙,看看是那里出错吧!一下是我的code :

#include <stdio.h>
#include <mcs51reg.h>
#include <tools.h>

#define RS   P1_2
#define RW   P1_1
#define EN   P1_0
#define DATA P2

void init_LCD();
void wait_LCD();
void clear_LCD();
void callDelay();
void writeText(unsigned char value);
void writeLCD(unsigned char *TEXT);
void writeCommand(unsigned char value);

void main()
{
  init_hardware();
  init_LCD();
  writeLCD("HELLO WORLD";
  
  }



void init_LCD()
{
  RS   = 0;    //Data read as command //set LCD to 8 bit data bus with 5x8 dot character font
  DATA = 0x38; //data send as command since RS is low
  //triger pulse = to send data to LCD
  EN   = 1;
  EN   = 0;
  wait_LCD;
  //The command 0Eh is really the instruction 08h plus 04h to turn the LCD on.
  //To that an additional 02h is added in order to turn the cursor on.
  RS   = 0;
  DATA = 0x0E;
  EN   = 1;
  EN   = 0;
  wait_LCD();
  //The command 06h is really the instruction 04h plus 02h to configure the LCD such that every time
  //we send it a character the cursor position automatically moves to the right.
  RS   = 0;
  DATA = 0x06;
  EN   = 1;
  EN   = 0;
  wait_LCD();  
  }
void wait_LCD()
{
  EN   = 0; //start LCD command
  RS   = 0;
  RW   = 1; //read command
  DATA = 0xFF;
  EN   = 1; //start transfer
  switch(P2_7)
    {
     case 1:
       callDelay();
       break;
     case 0:
        EN = 0;
        RW = 0;
          }
}

void callDelay()
{  //Generate a delay of 5ms
  TMOD = 0x10; //Select Timer 1 and Mode 1
  TH0  = 0xEC;
  TL0  = 0x78;
  TR1  = 1; //Run Timer 1
  if(TF1 =1)
     { TR1 = 0;
       TF1 = 0;
       }
  }
void writeLCD(unsigned char *TEXT)
{
  unsigned char i ;
  for (i=0; i<20; i++)
    {
      if(!TEXT)
      break;
      writeText(TEXT);
      }
}
void writeText(unsigned char value)
{
  RS  = 1;
  writeCommand(value);
  }
void writeCommand(unsigned char value)
{
  RW = 0;
  P2 |=value;
  EN = 1;
  EN = 0;
  callDelay();
  }
void clear_LCD()
{
  RS  = 0;
  DATA= 0x01;
  EN  = 1;
  EN  = 0;
  wait_LCD();
  }

谢谢你们抽出宝贵的时间和意见
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 16-7-2008 11:28 AM | 显示全部楼层
对了。。该如何control Curser ?!
我的LCD 是16x2character 的如何把字显示在第二条line 呢?!
回复

使用道具 举报

发表于 16-7-2008 05:55 PM | 显示全部楼层
原帖由 veren 于 16-7-2008 11:24 AM 发表
大家好,我最近在学MCU,一个人学太闷了,遇到问题也没什么人可以讨论,所以就上来和大家研究研究吧。
我是用AT89c51ed2来control LCD,programming code 是C code,Programming software 是SDCC....
我打了整天的篇 ...


generate hex是compiler setting的问题。 和code没关系。
check 看sdcc如何才可以generete hex file.我没用过sdcc.这个website可能可以帮到你。
http://www.final-memory.org/?p=92
at89c51ed2好像是停产了。。。

[ 本帖最后由 fritlizt 于 16-7-2008 05:57 PM 编辑 ]
回复

使用道具 举报

发表于 16-7-2008 06:07 PM | 显示全部楼层
原帖由 veren 于 16-7-2008 11:28 AM 发表
对了。。该如何control Curser ?!
我的LCD 是16x2character 的如何把字显示在第二条line 呢?!


http://ouwehand.net/~peter/lcd/lcd0.shtml#hd44780

看chapter 2.2 和2.3有详细解释。
回复

使用道具 举报

 楼主| 发表于 17-7-2008 01:20 AM | 显示全部楼层
原帖由 fritlizt 于 16-7-2008 05:55 PM 发表 generate hex是compiler setting的问题。 和code没关系。check 看sdcc如何才可以generete hex file.我没用过sdcc.这个website可能可以帮到你。http://www.final-memory.org/?p=92at89c51ed2好像是停产了。 ...

谢谢fritlizt版主,是过该页的指示了我的sdcc操作正常。。纳闷。。

fritlizt版主你是用什么software来弄的?可以分享下吗?


回复

使用道具 举报

发表于 17-7-2008 02:10 AM | 显示全部楼层
原帖由 veren 于 17-7-2008 01:20 AM 发表

谢谢fritlizt版主,是过该页的指示了我的sdcc操作正常。。纳闷。。

fritlizt版主你是用什么software来弄的?可以分享下吗?




我用keil uVision. 不过不是freeware.要买。 有evaluation software. www.keil.com 2k code size limitation.
那个直接可以generate hex, assembly.
回复

使用道具 举报

Follow Us
您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 27-12-2024 01:13 AM , Processed in 0.109235 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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