| 
|  | 
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 编辑 ]
 | 
 |  |  |  |
 
|  |  |  
|  |  | 
 |  | 
 
 发表于 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?
 期待着你的分享.
  | 
 |  |  |  |
 
|  |  |  
|  |  | 
 |  | 
 
 发表于 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你买多少钱?
 | 
 |  |  |  |
 
|  |  |  
|  |  | 
 |  | 
 
 发表于 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.
 复制代码int main (void)
{
        system_init ();
        lcd_4bit_init ();
        lcd_4bit_output (1,"cari.com");
        lcd_4bit_output (2,"fritlizt");
        return 0;
}
[ 本帖最后由 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
|
显示全部楼层 |  |  |  |
 
|  |  |  
|  |  | 
 |  | 
 
 发表于 23-5-2008 11:15 AM
|
显示全部楼层 |  |  |  |
 
|  |  |  
|  |  | 
 |  | 
 
 发表于 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 好难理解 !
 | 
 |  |  |  |
 
|  |  |  
|  |  |  |  | 
            本周最热论坛帖子 |