佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

楼主: gabrielloy

问问关于atmelAT89c51的program问题!

[复制链接]
发表于 20-2-2009 11:18 PM | 显示全部楼层
原帖由 gabrielloy 于 20-2-2009 10:47 PM 发表
对对,我的LCD的pin 4,5 ,6,7,DB4,DB5,DB6和DB7都是4-bit or 8-bit interface的


不明白。
RS, RW, E是control pin.

如果只用DB4-7是4 bit interface.
如果是8 bit interface你需要接DB0-7.
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 20-2-2009 11:19 PM | 显示全部楼层
刚刚拿fritlizt大大上面的program去simulate,发现很多东西没有define,和我说的一样.fritlizt大大怎么办?
回复

使用道具 举报

 楼主| 发表于 20-2-2009 11:34 PM | 显示全部楼层
如果要的只是当有input 5V是才会display,没有input的时候就不会display.program该怎么写呢?我的5Vinput,会接到一个CO sensor 的output上,当CO sensor detect到一定浓度的CO后,就会有一个5V的output,我就把它的output接到89c51的input.
也就是说,当我的sensor detect到之后,LCD才会display.当我的sensor没有detect到,是不会有output的,所以就没有input进89c51了,LCD就不会display了。
这就是我想要的。
回复

使用道具 举报

发表于 20-2-2009 11:53 PM | 显示全部楼层
原帖由 gabrielloy 于 20-2-2009 11:19 PM 发表
刚刚拿fritlizt大大上面的program去simulate,发现很多东西没有define,和我说的一样.fritlizt大大怎么办?


那去compile还是simulate?
error message是什么?
我用keil c51.
回复

使用道具 举报

发表于 20-2-2009 11:55 PM | 显示全部楼层
原帖由 gabrielloy 于 20-2-2009 11:34 PM 发表
如果要的只是当有input 5V是才会display,没有input的时候就不会display.program该怎么写呢?我的5Vinput,会接到一个CO sensor 的output上,当CO sensor detect到一定浓度的CO后,就会有一个5V的output,我就把它的out ...


这个很简单。
把我之前帮你纠正的program,加上这个lcd program就可以了.

你做过后post上来.
我再帮你检查
回复

使用道具 举报

 楼主| 发表于 21-2-2009 12:53 AM | 显示全部楼层
我也是用keil c compiler,但是就是有问题
回复

使用道具 举报

Follow Us
发表于 21-2-2009 01:04 AM | 显示全部楼层
原帖由 gabrielloy 于 21-2-2009 12:53 AM 发表
我也是用keil c compiler,但是就是有问题


回复前请读贴。
我知道有问题。 keil c51 error msg 这样多.你得给我知道error message是什么。
还是你要我从user manual copy全部error messages explaination给你猜.


原帖由 fritlizt 于 20-2-2009 11:53 PM 发表


那去compile还是simulate?
error message是什么?
我用keil c51.
回复

使用道具 举报

 楼主| 发表于 21-2-2009 01:18 AM | 显示全部楼层
error 309: bad or missing filename
error 308: can't open file
error c202:'P2':undefined identifier
error c202:'P0':undefined identifier
error c202:'P1':undefined identifier
error c202:'P3':undefined identifier
error c202:'TMOD':undefined identifier
error c202:'TH0:undefined identifier
error c202:'TL0':undefined identifier
error c202:'TR0':undefined identifier
error c202:'TF0':undefined identifier
error c202:'RS':undefined identifier
error c202:'RW':undefined identifier
error c202:'EN':undefined identifier
还有D7~D4 undefined identifier
回复

使用道具 举报


ADVERTISEMENT

发表于 21-2-2009 01:46 AM | 显示全部楼层
原帖由 gabrielloy 于 21-2-2009 01:18 AM 发表
error 309: bad or missing filename
error 308: can't open file
error c202:'P2':undefined identifier
error c202:'P0':undefined identifier
error c202:'P1':undefined identifier
error c202:'P3':undefi ...


你用什么版本的keil c51?
在你的C:\Keil\C51\INC\Atmel 里面有没有at89x51.h这个header?
回复

使用道具 举报

 楼主| 发表于 21-2-2009 01:56 AM | 显示全部楼层
我改了一点点,加了一些define,不知对不对
#include<stdio.h>

#define     CLR_DISP        0x01      
#define     DISP_ON         0x0C      
#define     DISP_OFF        0x08      
#define     CUR_HOME        0x02
#define     CUR_OFF         0x0C
#define     CUR_ON_UNDER    0x0E
#define     CUR_ON_BLINK    0x0F
#define     CUR_LEFT        0x10
#define     CUR_RIGHT       0x14
#define     CUR_UP          0x80      
#define     CUR_DOWN        0xC0
#define     ENTER           0xC0
#define     DD_RAM_ADDR     0x80      
#define     DD_RAM_ADDR2    0xC0
            
sbit D7 = P2^6;
sbit D6 = P2^5;
sbit D5 = P2^4;
sbit D4 = P2^3;
sbit EN = P2^2;
sbit RW = P2^1;
sbit RS = P2^0;

void system_init (void);
void delay_ms (unsigned int milisec);
void lcd_init (void);
void lcd_write_cmd (unsigned char cmd);
void lcd_write_data (unsigned char character);
void lcd_print (char *string);
void lcd_busy (void);

int main (void)
{
        system_init ();
        lcd_print ("fritzlizt\n@cari");
        while (1);
        return 0;
}

void system_init (void)
{
    int P0,P1,P2,P3,TMOD;
   
        P0 = 0xFF;          //port initialization
        P1 = 0xAA;
        P2 = 0xFF;
        P3 = 0xFF;
        TMOD = 0x21;        // set timer 1 to 8bit auto reload mode.
        lcd_init();
}

void delay_ms (unsigned int milisec)
{  
    int TH0,TL0,TRO,TF0;
    unsigned int i;

        for (i = 1; i <= milisec; i++){
                TH0 = 0xFC;
                TL0 = 0x18;
                TR0 = 1;
               
                while (!TF0);
                TF0 = 0;
                TR0 = 0;
        }
}

void lcd_init (void)
{
        int RS,RW,EN;
        int D7,D6,D5,D4;
        unsigned char i;
        delay_ms (15);
        RS = 0;
        RW = 0;
      
        for (i = 0; i < 3; i++){
                EN = 1;
                D7 = 0;
                D6 = 0;
                D5 = 1;
                D4 = 1;
                EN = 0;
                delay_ms (5);
        }
      
        EN = 1;
        D7 = 0;
        D6 = 0;
        D5 = 1;
        D4 = 0;
        EN = 0;
        delay_ms (5);
      
        lcd_write_cmd (0x28);                                   //4 bit mode
        lcd_write_cmd (CUR_ON_BLINK);                //display on, curser on, curcor blink on
        lcd_write_cmd (CLR_DISP);                         //Clear Display
        lcd_write_cmd (0x06);                                //increment cursor position
}

void lcd_write_cmd (unsigned char cmd)
{
        int RW,RS,EN,D7,D6,D5,D4;
        lcd_busy();
        RW = 0;
        RS = 0;         
        EN = 1;
      
        D7 = cmd & 0x80;
        D6 = cmd & 0x40;
        D5 = cmd & 0x20;
        D4 = cmd & 0x10;
        EN = 0;
      
        EN = 1;         
        D7 = cmd & 0x08;
        D6 = cmd & 0x04;
        D5 = cmd & 0x02;
        D4 = cmd & 0x01;
        EN = 0;
}

void lcd_write_data (unsigned char character)
{
        int RW,RS,EN,D7,D6,D5,D4;
        lcd_busy();
        RW = 0;
        RS = 1;
        EN = 1;
      
        D7 = character & 0x80;
        D6 = character & 0x40;
        D5 = character & 0x20;
        D4 = character & 0x10;
        EN = 0;
      
        EN = 1;                 
        D7 = character & 0x08;
        D6 = character & 0x04;
        D5 = character & 0x02;
        D4 = character & 0x01;
        EN = 0;
}

void lcd_print (char *string)
{
        unsigned char temp, i = 1;
        lcd_write_cmd (CLR_DISP);
        for (temp = 0; string[temp]!= 0; temp++){
                if (string[temp] == '\n'){
                        i++;
                        if(i > 2)
                                i = 1;
                        switch (i){
                                case 1:
                                        lcd_write_cmd (CUR_UP);
                                        break;
                                case 2:
                                        lcd_write_cmd (CUR_DOWN);
                                        break;      
                                default:
                                        break;
                        }
                }
                else
                        lcd_write_data (string[temp]);
        }
}

void lcd_busy (void)
{
       int RW,RS,EN,D7,D6,D5,D4;
        bit busy = 1;
        RS = 0;
        RW = 1;
        D7 = 1;
        D6 = 1;
        D5 = 1;
        D4 = 1;
        while (busy){
                EN = 0;
                EN = 1;
                EN = 1;
                busy = D7;
                EN = 0;
                EN = 1;
        }
        EN = 0;
}
回复

使用道具 举报

 楼主| 发表于 21-2-2009 02:00 AM | 显示全部楼层
有啊!有AT89c51的header.我用Keil uVision2
回复

使用道具 举报

 楼主| 发表于 21-2-2009 11:39 AM | 显示全部楼层
请问fritzlizt大大有没有msn?可以给我吗?msn chat 会比较容易讨论
回复

使用道具 举报

发表于 21-2-2009 12:20 PM | 显示全部楼层
原帖由 gabrielloy 于 21-2-2009 11:39 AM 发表
请问fritzlizt大大有没有msn?可以给我吗?msn chat 会比较容易讨论

讨论完后, 你会把心得发回这里和大家分享吗?我相信你会的。
回复

使用道具 举报

发表于 21-2-2009 01:05 PM | 显示全部楼层
原帖由 gabrielloy 于 21-2-2009 02:00 AM 发表
有啊!有AT89c51的header.我用Keil uVision2


keil uvision只是ide.
我看你可能用的是c51 v7。 一些header file没有。

我用的是keil uvision3. c51v8
你去www.keil.com重新下载吧。
lcd code size才450byte左右。 还是可以compile的。
回复

使用道具 举报

发表于 21-2-2009 01:07 PM | 显示全部楼层
原帖由 gabrielloy 于 21-2-2009 01:56 AM 发表
我改了一点点,加了一些define,不知对不对
#include

#define     CLR_DISP        0x01      
#define     DISP_ON         0x0C      
#define     DISP_OFF        0x08      
#define     CUR_HOME     ...


不对。你不需要stdio.h
你要的是at89x51.h这个header file.
或者generic 8051 header file也可以。 reg52.h
不过我prefer ic specific header file.
回复

使用道具 举报

发表于 21-2-2009 01:08 PM | 显示全部楼层
原帖由 gabrielloy 于 21-2-2009 11:39 AM 发表
请问fritzlizt大大有没有msn?可以给我吗?msn chat 会比较容易讨论


不用紧。 这里讨论就可以了。  差不多的了。
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 21-2-2009 01:46 PM | 显示全部楼层
那我加的define如int P0,P1,P2,P3,TMOD;或
int TH0,TL0,TRO,TF0;或
int RS,RW,EN;。
也错了?这样只要我download了新的keil uvision3.c51V8就可以compile大大的program了。大大用uvision3.c51v8compile没有问题?
回复

使用道具 举报

发表于 21-2-2009 01:50 PM | 显示全部楼层
原帖由 gabrielloy 于 21-2-2009 01:46 PM 发表
那我加的define如int P0,P1,P2,P3,TMOD;或
int TH0,TL0,TRO,TF0;或
int RS,RW,EN;。
也错了?这样只要我download了新的keil uvision3.c51V8就可以compile大大的program了。大大用uvision3.c51v8compile没有问题?


都错了。 因为P0,P1,P2,P3,TMOD,TH0,TL0,TRO,TF0都是sfr.都会在at89x51.h里面define 的。 你不需要自己define.你这样define 能compile也不能work。要自己define 可以。 要懂register address,还有用要define sfr keyword 是sfr,不是int. int是给variable declaration.

我用keilc51 v8没问题。
从新下在也不用很多时间。去下载过后compile看。
先create 一个project,然后add 我的program进去。

[ 本帖最后由 fritlizt 于 21-2-2009 01:52 PM 编辑 ]
回复

使用道具 举报

 楼主| 发表于 21-2-2009 01:56 PM | 显示全部楼层
还有别的网站可以download keil uvision3 c51v8.因为我要download uvision3 他们叫我填form,我没License code或TCP?
回复

使用道具 举报

 楼主| 发表于 21-2-2009 02:31 PM | 显示全部楼层
不用了,我现在在下!
回复

使用道具 举报

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

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


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

GMT+8, 23-1-2025 10:07 AM , Processed in 0.149704 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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