佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

123
返回列表 发新帖
楼主: Right

LM35D接PIC16F877A (LCD ADC)

[复制链接]
发表于 5-5-2008 12:56 AM | 显示全部楼层
原帖由 半夜鬼 于 4-5-2008 06:53 PM 发表


明白,谢谢fritlizt 大大。。
不过我是用 C 来写,不知道单单一个单纯的
while(1);  //


while (1); 是一个infinite loop.永远loop 不完的。只是单纯的goto 自己的address.
for (i=0; i<10; i++) 这个你就要看asm/list file.算有几个instruction, 再算execution time.
你的program有critical到要算for loop的execution time吗?

[ 本帖最后由 fritlizt 于 5-5-2008 12:58 AM 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

发表于 6-5-2008 01:14 PM | 显示全部楼层
原帖由 fritlizt 于 5-5-2008 12:56 AM 发表


while (1); 是一个infinite loop.永远loop 不完的。只是单纯的goto 自己的address.
for (i=0; i<10; i++) 这个你就要看asm/list file.算有几个instruction, 再算execution time.
你的program有critical到要算for loop的execution time吗?


while loop 我明白,只是打个比方。。因为在转换去 assembly 里跑一个 while loop 循环也是有时间的
看了asm/list file, 算有几个instruction之后,我知道 execution time 了。。 谢谢fritlizt 大大

因为有些简单的 delay(不需要太准的) 不想用 timer,就用 for loop 来 run loh, 因为常用到,就自己仔细算一个咯
回复

使用道具 举报

发表于 6-5-2008 03:23 PM | 显示全部楼层
原帖由 半夜鬼 于 6-5-2008 01:14 PM 发表
while loop 我明白,只是打个比方。。因为在转换去 assembly 里跑一个 while loop 循环也是有时间的
看了asm/list file, 算有几个instruction之后,我知道 execution time 了。。 谢谢fritlizt 大大

因为有些简单的 delay(不需要太准的) 不想用 timer,就用 for loop 来 run loh, 因为常用到,就自己仔细算一个咯.

最好不要。。。如你这样做, 你还不如去写ASM 好了。。。要不你写的C只有你会看,没意义了。。。
回复

使用道具 举报

发表于 7-5-2008 08:54 AM | 显示全部楼层
原帖由 pic 于 6-5-2008 03:23 PM 发表

最好不要。。。如你这样做, 你还不如去写ASM 好了。。。要不你写的C只有你会看,没意义了。。。


实在是无法完全看懂 arm instruction 和 32bit assembly language leh... 暂时写给自己看的。。testing 完先...
回复

使用道具 举报

发表于 9-5-2008 10:13 PM | 显示全部楼层
yes... 终于成功简单 display 出来了,谢谢这里的网友有讨论关于 LCD display...
在玩转和 detail 收悉应用之后,在改一下,分享经验,分享如何应用
回复

使用道具 举报

发表于 9-5-2008 11:41 PM | 显示全部楼层
原帖由 半夜鬼 于 9-5-2008 10:13 PM 发表
yes... 终于成功简单 display 出来了,谢谢这里的网友有讨论关于 LCD display...
在玩转和 detail 收悉应用之后,在改一下,分享经验,分享如何应用


用什么mcu和langauge?
期待着你的分享.
回复

使用道具 举报

Follow Us
发表于 13-5-2008 10:00 AM | 显示全部楼层
aiyah... 不是很会画 schematic... 放 code 上来,要用普通 LCD display 的可以看看。。
我用的是 NXP (Philips) 的 LPC2103, 用 C language

可以的话。。帮我写一个 method,可以很方便的丢一个 byte 到 function就可以 send data... 就好像

void send (unsigned char chr)  /* chr = 0xaa, 酱我就不用分 msb 和 lsb 送两次,很麻烦下。。*/
{

}

对了,因为 pin 脚不够,我用 74HC273 来 latch LCD 的 data, LCDCS = 74HC273 clock trigger


/****************************************************************************************/
#include <LPC2103.H>

#define LCDCS        1<<2
#define LED_ON        1<<31        // backlight
#define LCD_E        1<<28        // clock
#define LCD_RS        1<<30
#define        LCD_RW        1<<29
#define LD4                1<<24
#define LD5                1<<25
#define LD6                1<<26
#define LD7                1<<27

void Timer0_Init (void)
{
        T0TC = 0;
        T0PR = 0;
        T0MCR = 3;
}

void Timer0_Enable (unsigned int dly)
{
        T0MR0 = dly;
        T0TCR = 1;

        while ( (T0IR&0x01) == 0) ;

        T0IR  = 0x01;
        T0TCR = 0;
}

/*
void Delay (unsigned int dly)        //134 nano second, but i count as 135 nano second, easy remember
{
        unsigned int i;

        for (i=0; i<dly; i++) ;
}
  */

void LCD_Enable (void)
{
        IOSET |= LCD_E;
        IOSET |= LCD_E;
        IOSET |= LCDCS;                        // 273 refresh
        Timer0_Enable(119);                                                        // Delay  2  micro  secs

        IOCLR |= LCDCS;
        IOCLR |= LCD_E;
        IOSET |= LCDCS;                        // 273 refresh
}

void LCD_Send (unsigned char data)
{
        unsigned char temp;
        temp = data;

        IOCLR |= LD4 | LD5 | LD6 | LD7 | LCDCS;

        switch (temp)
        {
                case 0x00:
                        IOCLR |= LD4 | LD5 | LD6 | LD7;
                        LCD_Enable();
                        break;

                case 0x01:
                        IOSET |= LD4;
                        LCD_Enable();
                        break;

                case 0x02:
                        IOSET |= LD5;
                        LCD_Enable();
                        break;

                 case 0x03:
                        IOSET |= LD4 | LD5;
                        LCD_Enable();
                        break;

                case 0x04:
                        IOSET |= LD6;
                        LCD_Enable();
                        break;

                case 0x05:
                        IOSET |= LD4 | LD6;
                        LCD_Enable();
                        break;
               
                case 0x06:
                        IOSET |= LD5 | LD6;       
                        LCD_Enable();
                        break;

                case 0x07:
                        IOSET |= LD4 | LD5 | LD6;
                        LCD_Enable();
                        break;

                case 0x08:
                        IOSET |= LD7;
                        LCD_Enable();
                        break;
                       
                case 0x09:
                        IOSET |= LD4 | LD7;
                        LCD_Enable();
                        break;

                case 0x0A:
                        IOSET |= LD5 | LD7;
                        LCD_Enable();
                        break;

                case 0x0B:
                        IOSET |= LD4 | LD5 | LD7;
                        LCD_Enable();
                        break;

                case 0x0C:        //12
                        IOSET |= LD6 | LD7;
                        LCD_Enable();
                        break;

                case 0x0D:        //13
                        IOSET |= LD4 | LD5 | LD7;
                        LCD_Enable();
                        break;

                case 0x0E:        //14
                        IOSET |= LD5 | LD6 | LD7;
                        LCD_Enable();
                        break;

                case 0x0F:        //16
                        IOSET |= LD4 | LD5 | LD6 | LD7;
                        LCD_Enable();
                        break;

                default:
                        break;
        }
}

void LCD_Init (void)
{
//         IODIR |= LCDCS | LED_ON | LCD_E | LCD_RS |LCD_RW | LD4 | LD5 | LD6 | LD7;
//        IOCLR |= LCDCS | LED_ON | LCD_E | LCD_RS |LCD_RW | LD4 | LD5 | LD6 | LD7;

        IODIR |= LCDCS | LCD_E | LCD_RS |LCD_RW | LD4 | LD5 | LD6 | LD7;
        IOCLR |= LCDCS | LCD_E | LCD_RS |LCD_RW | LD4 | LD5 | LD6 | LD7;

        Timer0_Enable (1199999);                                        // Delay  20 mili  secs

        LCD_Send (0x03); /*****************************************/
        Timer0_Enable (299999);                                                // Delay   5 mili  secs

        LCD_Send (0x03);
        Timer0_Enable (11999);                                                // Delay 200 micro secs

        LCD_Send (0x03);
        Timer0_Enable (2399);                                                // Delay  40 micro secs

        LCD_Send (0x02);
        Timer0_Enable (2399);                                                // Delay  40 micro secs

        LCD_Send (0x02);
        LCD_Send (0x08);
        Timer0_Enable (2399);                                                // Delay  40 micro secs

        LCD_Send (0x00);
        LCD_Send (0x08);
        Timer0_Enable (2399);                                                // Delay  40 micro secs

        LCD_Send (0x00);
        LCD_Send (0x01);
        Timer0_Enable (119999);                                                // Delay   2 mili secs

        LCD_Send (0x00);
        LCD_Send (0x06);
        Timer0_Enable (2399);                                                // Delay  40 micro secs

        LCD_Send (0x00);
        LCD_Send (0x0f);
        Timer0_Enable (2399);                                                // Delay  40 micro secs
}

void LCD_Write (void)
{
        IOCLR |= LCDCS | LCD_E | LCD_RS |LCD_RW | LD4 | LD5 | LD6 | LD7;
        IOSET |= LCD_RS;
        IOSET |= LCDCS;
        LCD_Send (0x03);
        LCD_Send (0x01);
        Timer0_Enable (2999);                                                // Delay  50 micro secs

        LCD_Send (0x03);
        LCD_Send (0x02);
        Timer0_Enable (2999);                                                // Delay  50 micro secs

        LCD_Send (0x03);
        LCD_Send (0x03);
        Timer0_Enable (2999);                                                // Delay  50 micro secs

        LCD_Send (0x03);
        LCD_Send (0x04);
        Timer0_Enable (2999);                                                // Delay  50 micro secs

        LCD_Send (0x03);
        LCD_Send (0x05);
        Timer0_Enable (2999);                                                // Delay  50 micro secs

        LCD_Send (0x03);
        LCD_Send (0x06);
        Timer0_Enable (2999);                                                // Delay  50 micro secs

        LCD_Send (0x03);
        LCD_Send (0x07);
        Timer0_Enable (2999);                                                // Delay  50 micro secs

        LCD_Send (0x03);
        LCD_Send (0x08);
        Timer0_Enable (2999);                                                // Delay  50 micro secs

        LCD_Send (0x03);
        LCD_Send (0x09);
        Timer0_Enable (2999);                                                // Delay  50 micro secs

        LCD_Send (0x03);
        LCD_Send (0x00);
        Timer0_Enable (2999);                                                // Delay  50 micro secs
}

int main (void)
{
        Timer0_Init();
        LCD_Init();
        LCD_Write();
}
回复

使用道具 举报

发表于 13-5-2008 03:52 PM | 显示全部楼层
原帖由 半夜鬼 于 13-5-2008 10:00 AM 发表
aiyah... 不是很会画 schematic... 放 code 上来,要用普通 LCD display 的可以看看。。
我用的是 NXP (Philips) 的 LPC2103, 用 C language

可以的话。。帮我写一个 method,可以很方便的丢一个 byte 到 functi ...


你用developement board 吗??
还是自己fabricate?
如果是developement board你买多少钱?
回复

使用道具 举报


ADVERTISEMENT

发表于 13-5-2008 09:43 PM | 显示全部楼层
原帖由 fritlizt 于 13-5-2008 03:52 PM 发表


你用developement board 吗??
还是自己fabricate?
如果是developement board你买多少钱?


我是那已经洗好了的板,看着他的 schematic,要 test 什么 function 就焊什么 component 上起
,then 再写 function loh...

在这边还要非常感谢一个大大,帮我把我的 cpu 焊上去。。不然我焊上去的都不能用。。不是很会焊四边脚的 cpu..
还有谢谢他帮我找 LCD detail 的 datasheet!!
回复

使用道具 举报

发表于 20-5-2008 03:16 AM | 显示全部楼层
原帖由 半夜鬼 于 13-5-2008 09:43 PM 发表


我是那已经洗好了的板,看着他的 schematic,要 test 什么 function 就焊什么 component 上起
,then 再写 function loh...

在这边还要非常感谢一个大大,帮我把我的 cpu 焊上去。。不然我焊上去的都不能用。 ...


我也写了一个lcd interfacing program.用c. 给lpc210x的.还不是这样optimize.我用bit masking.一个一个bit mask去相关的I/O.
解决了你那个要send两次msb和lsb的问题。还可以send string.
可以开一个arm讨论区。。。。。在谈下去就离题了。。。
忘了说我用的是keil mdk arm compiler.
  1. int main (void)
  2. {
  3.         system_init ();
  4.         lcd_4bit_init ();
  5.         lcd_4bit_output (1,"cari.com");
  6.         lcd_4bit_output (2,"fritlizt");
  7.         return 0;
  8. }
复制代码
  1. #include <lpc2103.h>
  2. #include "global.h"
  3. #include "lcd.h"

  4. void lcd_4bit_init (void)
  5. {
  6.         delay_ms (15);                                        //lcd init
  7.         IOCLR = LCD_RS;
  8.         IOCLR = LCD_RW;
  9.         IOSET = LCD_EN;
  10.         IOCLR = LCD_D7;
  11.         IOCLR = LCD_D6;
  12.         IOSET = LCD_D5;
  13.         IOSET = LCD_D4;
  14.         IOCLR = LCD_EN;
  15.         delay_us(40);
  16.         IOSET = LCD_EN;
  17.         IOCLR = LCD_D7;
  18.         IOCLR = LCD_D6;
  19.         IOSET = LCD_D5;
  20.         IOCLR = LCD_D4;
  21.         IOCLR = LCD_EN;
  22.         delay_us (100);
  23.         
  24.         lcd_4bit_write_cmd (0x28);//set lcd 4 bit interface, 2 line display, 5x7 dot format
  25.         lcd_4bit_write_cmd (CUR_ON_BLINK);
  26.         lcd_4bit_write_cmd (CLR_DISP);
  27.         lcd_4bit_write_cmd (0x06);//set cursor move direction - increment  
  28. }

  29. void lcd_4bit_write_cmd (unsigned long cmd)
  30. {
  31.         IOCLR = LCD_RW;
  32.         IOCLR = LCD_RS;
  33.         IOSET = LCD_EN;
  34.         
  35.         if (cmd & 0x80)
  36.                 IOSET = LCD_D7;
  37.         else
  38.                 IOCLR = LCD_D7;
  39.         if (cmd & 0x40)
  40.                 IOSET = LCD_D6;
  41.         else
  42.                 IOCLR = LCD_D6;
  43.         if (cmd & 0x20)
  44.                 IOSET = LCD_D5;
  45.         else
  46.                 IOCLR = LCD_D5;
  47.         if (cmd & 0x10)
  48.                 IOSET = LCD_D4;
  49.         else
  50.                 IOCLR = LCD_D4;
  51.         IOCLR = LCD_EN;
  52.         
  53.         IOSET = LCD_EN;
  54.         if (cmd & 0x08)
  55.                 IOSET = LCD_D7;
  56.         else
  57.                 IOCLR = LCD_D7;
  58.         if (cmd & 0x04)
  59.                 IOSET = LCD_D6;
  60.         else
  61.                 IOCLR = LCD_D6;
  62.         if (cmd & 0x02)
  63.                 IOSET = LCD_D5;
  64.         else
  65.                 IOCLR = LCD_D5;
  66.         if (cmd & 0x01)
  67.                 IOSET = LCD_D4;
  68.         else
  69.                 IOCLR = LCD_D4;
  70.         IOCLR = LCD_EN;
  71.         
  72.         if (cmd == CLR_DISP || cmd == CUR_HOME)
  73.                 delay_ms(2);
  74.         else
  75.                 delay_us (40);
  76. }

  77. void lcd_4bit_write_data (unsigned long data)
  78. {
  79.         IOCLR = LCD_RW;
  80.         IOSET = LCD_RS;
  81.         IOSET = LCD_EN;
  82.         
  83.         if (data & 0x80)
  84.                 IOSET = LCD_D7;
  85.         else
  86.                 IOCLR = LCD_D7;
  87.         if (data & 0x40)
  88.                 IOSET = LCD_D6;
  89.         else
  90.                 IOCLR = LCD_D6;
  91.         if (data & 0x20)
  92.                 IOSET = LCD_D5;
  93.         else
  94.                 IOCLR = LCD_D5;
  95.         if (data & 0x10)
  96.                 IOSET = LCD_D4;
  97.         else
  98.                 IOCLR = LCD_D4;
  99.         IOCLR = LCD_EN;
  100.         
  101.         IOSET = LCD_EN;
  102.         if (data & 0x08)
  103.                 IOSET = LCD_D7;
  104.         else
  105.                 IOCLR = LCD_D7;
  106.         if (data & 0x04)
  107.                 IOSET = LCD_D6;
  108.         else
  109.                 IOCLR = LCD_D6;
  110.         if (data & 0x02)
  111.                 IOSET = LCD_D5;
  112.         else
  113.                 IOCLR = LCD_D5;
  114.         if (data & 0x01)
  115.                 IOSET = LCD_D4;
  116.         else
  117.                 IOCLR = LCD_D4;
  118.         IOCLR = LCD_EN;
  119.         delay_us (40);
  120. }

  121. void lcd_4bit_output (unsigned char line, char *string)
  122. {
  123.         unsigned int temp;
  124.         if (line == 1)
  125.                 lcd_4bit_write_cmd (CUR_UP);
  126.         else if (line == 2)
  127.                 lcd_4bit_write_cmd (CUR_DOWN);
  128.         for (temp = 0; string[temp]!= 0; temp++)
  129.                 lcd_4bit_write_data (string[temp]);
  130. }
复制代码

[ 本帖最后由 fritlizt 于 20-5-2008 03:29 AM 编辑 ]
回复

使用道具 举报

发表于 22-5-2008 10:56 PM | 显示全部楼层
原帖由 fritlizt 于 20-5-2008 03:16 AM 发表


我也写了一个lcd interfacing program.用c. 给lpc210x的.还不是这样optimize.我用bit masking.一个一个bit mask去相关的I/O.
解决了你那个要send两次msb和lsb的问题。还可以send string.
可以开一个arm讨论区。 ...


万分感谢 fritlizt 大大,这个 LCD 的程式我写完之后,就没有动了。。
工作了近两个礼拜,今天我终于抽出时间来 test 4X4 keypad。。
想了一天,写出来了~~
等下开个主题把 program 放上来,可以的话你帮我画 schematic。。

还是要万分感谢 fritlizt 大大!!抽空帮我写了方便的 function!!
对了你是怎样 test 的呢? 用 proteus? 还是自己 fabricated,像我这样?
我也想学  proteus.. 但是 懒惰 study... 有没有快速的上手的方法?教程之类?
回复

使用道具 举报

发表于 22-5-2008 11:14 PM | 显示全部楼层
原帖由 半夜鬼 于 22-5-2008 10:56 PM 发表


万分感谢 fritlizt 大大,这个 LCD 的程式我写完之后,就没有动了。。
工作了近两个礼拜,今天我终于抽出时间来 test 4X4 keypad。。
想了一天,写出来了~~
等下开个主题把 program 放上来,可以的话你帮我画 ...


我用proteus 仿真。 hardware 订了。 还没到。 circuit也还没design.只是program写了。哈
基本上proteus还算容易上手。 用几天就会了。 自己试试看吧。 我也是自己慢慢摸索的。 不会就问pic 大大。
shcematics为什么不用电脑画呢?
回复

使用道具 举报

发表于 22-5-2008 11:46 PM | 显示全部楼层
原帖由 fritlizt 于 22-5-2008 11:14 PM 发表


我用proteus 仿真。 hardware 订了。 还没到。 circuit也还没design.只是program写了。哈
基本上proteus还算容易上手。 用几天就会了。 自己试试看吧。 我也是自己慢慢摸索的。 不会就问pic 大大。
shcemati ...


我这边有一片 Z2103(LPC2103) 的 evaluation board,还有多余的一个debugger 你是住 JB 的吗?
如果你有需要的话可以接你先~~

还有要开设一个 arm 的讨论区吗?
回复

使用道具 举报

发表于 22-5-2008 11:49 PM | 显示全部楼层
原帖由 半夜鬼 于 22-5-2008 11:46 PM 发表


我这边有一片 Z2103(LPC2103) 的 evaluation board,还有多余的一个debugger 你是住 JB 的吗?
如果你有需要的话可以接你先~~

还有要开设一个 arm 的讨论区吗?


我人在melaka..哈。你可以开一个arm讨论区的。不过预计回复者不多。 可能 <10个。
你有msn, ym吗?这种借来借去私人问题我们可以私低下讨论。
回复

使用道具 举报

发表于 23-5-2008 11:15 AM | 显示全部楼层
《10 ??
哈哈, 普通话题都很难到 10 个。

proteus 还蛮容易学, 但是现在自己的都不知道要去哪里找。公司是有lisence 的。
我用multisim + ultiboard, 都不错一二三四五六七八下,
讨论方面, 开一个话题咯,至少之后能参考。
还是你要用 irc ?

看看有没有朋友, 拉多一点人过来。
回复

使用道具 举报

发表于 29-11-2009 02:26 PM | 显示全部楼层
1。看了 这个电路 http://www.kmitl.ac.th/~kswichit/thermo/digithermo.htm
有用 CA3162 A/D Converters for 3-Digit Display
请问是不是一定要用这个 不能直接 用MCU convert??
我参考了有些电路 他们没有用 AD converters 直接 LM35 > PIN_AN0

我 COPY 了大大的 code
build all 时 有error 请问这是什么 error?
void lcd_init()
{
    byte i;
    set_tris_d(0);
    lcd.rs = 0;
    lcd.rw = 0;
    lcd.enable = 0;
    delay_ms(15);
    for(i=1;i<=3;++i) {
       lcd_send_nibble(3);
       delay_ms(5);
    }
    lcd_send_nibble(2);
    for(i=0;i<=3;++i)
    {
      lcd_send_byte(0,LCD_INIT_STRING);   <<<
    }
}


Attempt to create a pointer to a constant

我的头很大!! PIC 好难理解 !
回复

使用道具 举报


ADVERTISEMENT

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

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


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

GMT+8, 23-12-2024 07:17 PM , Processed in 0.127248 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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