佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 2520|回复: 14

紧急救命。。。想问coding问题。有谁会PicBasic Pro Progamming code 的???

[复制链接]
发表于 21-11-2006 11:03 AM | 显示全部楼层 |阅读模式
紧急救命。。。

有谁会PicBasic Pro Progamming code 的???
以下几楼是我和其他大大讨论的过程。我已采用了PIC大大提供的circuit , 但是我是用PicBasic Pro 来program 16F877A 的。。。。

以下是我的coding...但是却遇到了convert hex code 和binary code 的问题。。

' PicBasic Pro program to measure voltage (0-5VDC)
' and display on LCD with 2 decimal places. A
' 60 segment bargraph is also displayed using
' custom LCD characters.
'
' This program uses the */ operator to scale the
' ADC result from 0-1023 to 0-500.  The */ performs
' a divide by 256 automatically, allowing math which
' would normally exceed the limit of a word variable.
'
' Connect analog input to channel-0 (RA0)

' Define LCD registers and bits
DEFINE  LCD_DREG                PORTD
DEFINE  LCD_DBIT                4
DEFINE  LCD_RSREG                      PORTD
DEFINE  LCD_RSBIT               0
DEFINE  LCD_EREG                PORTD
DEFINE  LCD_EBIT                2
DEFINE        LCD_RWREG                PORTD
DEFINE        LCD_RWBIT                1
DEFINE        LCD_COMMANDUS                2000
DEFINE        LCD_DATAUS                50

' Define ADCIN parameters
DEFINE  ADC_BITS        10             ' Set number of bits in result
DEFINE  ADC_CLOCK       3             ' Set clock source (3=rc)
DEFINE  ADC_SAMPLEUS    50            ' Set sampling time in uS

' Declare variables
adval                  VAR WORD                        ' Create adval to store result

TRISA = %11111111                ' Set PORTA to all input
ADCON1 = %10000010                ' Set PORTA analog and right justify result
      
        Low PORTD.1                                ' LCD R/W line low (W)
        Pause 500                       ' Wait .5 second
        

loop:         ADCIN 0, adval                        ' Read channel 0 to adval (0-1023)

        adval = (adval */ 500)>>2        ' equates to: (adval * 500)/1024
        LCDOut $fe, 1           ' clear lcd sreen.
        LCDOut $FE,$C0          ' clear lcd screen.
        LCDOut $FE,1,"volt METER"
        LCDOut $FE,$C0,"volt=",DEC (adval/100),".", DEC2 adval,"uW"
' Display the decimal value
        Pause 100                                       ' Wait .1 second
        GoTo loop                                       ' Do it forever


End


________________________________________________________

adval = (adval */ 500)>>2        ' equates to: (adval * 500)/1024
LCDOut $FE,$C0,"volt=",DEC (adval/100),".", DEC2 adval,"uW"


就是这两行coding ,因为我要拿的result是必须要有5个decimal point 的 ,但是无论我如何改 : 把“DEC2 adval”改成“DEC5 adval” ,又或者改advl=(adval*/500)>>5 都不行。。。有谁可以教教我?????


各位大大帮帮忙啦!!!

[ 本帖最后由 gab102001 于 20-12-2006 12:24 AM 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

发表于 21-11-2006 06:43 PM | 显示全部楼层
68HC11A8(48pin) 的output pin可以直接connect到lcd display 吗??
lcd display 是 parallel input 的 16*2 character lcd display ...
(JHD162A series).....

如你的68HC11A8 和JHD162A 都是用5V的电源,那是可以直接连接LCD的。

我问过了好几个lecturer,有些说可以,有些说不可以。。。。
想知道你是在那里求学的?
回复

使用道具 举报

 楼主| 发表于 22-11-2006 09:30 AM | 显示全部楼层

有问题吗???

原帖由 pic 于 21-11-2006 06:43 PM 发表

如你的68HC11A8 和JHD162A 都是用5V的电源,那是可以直接连接LCD的。

想知道你是在那里求学的?


谢谢啦。。我试下看吧。。因为68HC11A8 好贵哦。。。我短路烧掉啊。。。
在拉曼啊。。。。有问题吗??

[ 本帖最后由 gab102001 于 22-11-2006 09:31 AM 编辑 ]
回复

使用道具 举报

发表于 2-12-2006 06:06 PM | 显示全部楼层
原帖由 gab102001 于 22-11-2006 09:30 AM 发表


谢谢啦。。我试下看吧。。因为68HC11A8 好贵哦。。。我短路烧掉啊。。。
在拉曼啊。。。。有问题吗??


为何不用PIC? 价钱便宜很多。 还有,要小心你的LCD DISPLAY很容易坏。我用的
LCD DISPLAY刚刚瓜了。
回复

使用道具 举报

发表于 4-12-2006 08:46 AM | 显示全部楼层
原帖由 gab102001 于 21-11-2006 11:03 AM 发表
紧急救命。。。
68HC11A8(48pin) 的output pin可以直接connect到lcd display 吗??
lcd display 是 parallel input 的 16*2 character lcd display ...
(JHD162A series).....

还是需要什么特别的电路设 ...





可以啦,没问题。。。
只是比较难progam,pic就比较容易。。。
回复

使用道具 举报

 楼主| 发表于 9-12-2006 11:25 AM | 显示全部楼层

各位大大帮帮忙啦!!!

用PIC真的比较容易吗?16F628行吗??我要有analog to digital signal的function 的。。。因为我的inputsignal是detect light 的voltage,然后转换成
digital signal display power value 在 lcd 。。。。时间紧迫啊。。。帮帮忙!!如果有电路设计
(pic connect lcd ) 的话 ,通知我吧!!!!!

各位大大帮帮忙啦!!!
回复

使用道具 举报

Follow Us
发表于 9-12-2006 02:38 PM | 显示全部楼层
拉曼什么系?
如果是 microelectronics , 就去找 Chan Fung lin
回复

使用道具 举报

发表于 9-12-2006 09:37 PM | 显示全部楼层
原帖由 gab102001 于 9-12-2006 11:25 AM 发表
用PIC真的比较容易吗?16F628行吗??我要有analog to digital signal的function 的。。。因为我的inputsignal是detect light 的voltage,然后转换成
digital signal display power value 在 lcd 。。。。时间紧 ...


真的啦,只是instuction太过simple....analog to digital signal没问题,只要你的voltage不超过vcc就可以了。。。


“pic connect lcd “ direct connect to lcd can liao..if you 8 bit data you can use like porta or portb and plus two io port for  read and write port ...

[ 本帖最后由 sgcheng 于 9-12-2006 09:41 PM 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

发表于 10-12-2006 08:35 AM | 显示全部楼层
原帖由 gab102001 于 9-12-2006 11:25 AM 发表
用PIC真的比较容易吗?16F628行吗??我要有analog to digital signal的function 的。。。因为我的inputsignal是detect light 的voltage,然后转换成
digital signal display power value 在 lcd 。。。。时间紧 ...

时间紧迫? 呵呵。。。

16F628A没有ADC ,当然用测量RC充电时间,用内建comparator 可以简单测量光的变化,但我不建议初学者。
用16F877A, 采用C语言比较容易实现你要的功能。

LCD电路,用4bit mode, 接去PIC16F877A的PortD。
PortD.0-> RS
PortD.1-> RW
PortD.2-> E
PortD.3
PortD.4-> D4
PortD.5-> D5
PortD.6-> D6
PortD.7-> D7

用什么MCU, 什么语言,在说说你要怎样做吧。。。
回复

使用道具 举报

发表于 10-12-2006 03:57 PM | 显示全部楼层
原帖由 pic 于 10-12-2006 08:35 AM 发表

时间紧迫? 呵呵。。。

16F628A没有ADC ,当然用测量RC充电时间,用内建comparator 可以简单测量光的变化,但我不建议初学者。
用16F877A, 采用C语言比较容易实现你要的功能。

LCD电路,用4bit mode, 接 ...



采用C语言,need c language compliler, Do you have it?
回复

使用道具 举报

 楼主| 发表于 12-12-2006 11:20 PM | 显示全部楼层

PIC大大救命。。。

原帖由 pic 于 10-12-2006 08:35 AM 发表

时间紧迫? 呵呵。。。

用16F877A, 采用C语言比较容易实现你要的功能。

LCD电路,用4bit mode, 接去PIC16F877A的PortD。
PortD.0-> RS
PortD.1-> RW
PortD.2-> E
PortD.3
PortD.4-> D4
PortD.5-> D5
PortD.6-> D6
PortD.7-> D7

用什么MCU, 什么语言,在说说你要怎样做吧。。。


那么,请问pic大大。。我看过了PIC16F877A 的datasheet ,我真的只需要把analog input connect 到 port AN0 (只有一个analog input),然后按照你所说的(portD connection)就行了吗??
为什么我看朋友用其他的PIC connect LCD 还需要做其他的port termination ??我需要像他们这样做port termination吗???
如这里

http://home.iae.nl/users/pouweha/lcd/lcd2.shtml#PIC_lcd_init

figure 4.4.2 Interface 那样的接法呢????
里头的coding又是否适合我用呢(是不是assembly code来的)???

我这几天都被HC11的assembly code弄得头都痛了。。。

[ 本帖最后由 gab102001 于 13-12-2006 12:53 AM 编辑 ]
回复

使用道具 举报

发表于 13-12-2006 09:52 AM | 显示全部楼层
首先,不要喊救命, 只有你自己可以救自己。。。
我会帮你起个斗,其他的要自己努力,因为是你的功课。

很多网友,尤其是学生,问来问去都是RS232,ADC, LCD,Programmer, VB MSCOMM之类的,所以如有需要,以后我会办教学,但也要得到大家的支持,不然写了也是浪费心血。

以下是一切你需要的, 电路图,C 源码, C编译器。


电路图:


CCS C compiler 下载( Free Demo, 16F877A,code limit 1K)

C 源码, 含LCD Driver。
  1. #include <16F877A.h>
  2. #device ADC=10
  3. #fuses HS,NOWDT,NOPROTECT,NOLVP
  4. #use delay(clock=20000000)

  5. ///////////////////////////////////////////////////////////////////////////////
  6. // LCD Driver
  7. ///////////////////////////////////////////////////////////////////////////////
  8. // As defined in the following structure the pin connection is as follows:
  9. /*
  10. LCD 16 X 2 line
  11. PortD.0-> RS
  12. PortD.1-> RW
  13. PortD.2-> E
  14. PortD.3
  15. PortD.4-> D4
  16. PortD.5-> D5
  17. PortD.6-> D6
  18. PortD.7-> D7
  19. */

  20. /////////////////////////////////////////////////////////////////
  21. // LCD Driver
  22. struct lcd_pin_map {                 // This structure is overlayed
  23.            boolean rs;               // on to an I/O port to gain
  24.            boolean rw;               // access to the LCD pins.
  25.            boolean enable;           // The bits are allocated from
  26.            boolean unused;           // low order up.  ENABLE will
  27.            int     data : 4;         // be pin B0.
  28.         } lcd;

  29. #byte lcd = 0x08                 // on to port D (at address 0x08)
  30. byte CONST LCD_INIT_STRING[4] = {0x28, 0xc, 1, 6};


  31. void lcd_send_nibble( byte n )
  32. {
  33.       lcd.data = n;
  34.       delay_cycles(1);
  35.       lcd.enable = 1;
  36.       delay_us(2);
  37.       lcd.enable = 0;
  38. }


  39. void lcd_send_byte( byte address, byte n )
  40. {
  41.       lcd.rs = 0;
  42.       delay_ms(5);
  43.       lcd.rs = address;
  44.       delay_cycles(1);
  45.       lcd.rw = 0;
  46.       delay_cycles(1);
  47.       lcd.enable = 0;
  48.       lcd_send_nibble(n >> 4);
  49.       lcd_send_nibble(n & 0xf);
  50. }


  51. void lcd_init()
  52. {
  53.     byte i;

  54.     set_tris_d(0);
  55.     lcd.rs = 0;
  56.     lcd.rw = 0;
  57.     lcd.enable = 0;
  58.     delay_ms(15);
  59.     for(i=1;i<=3;++i) {
  60.        lcd_send_nibble(3);
  61.        delay_ms(5);
  62.     }
  63.     lcd_send_nibble(2);
  64.     for(i=0;i<=3;++i)
  65.     {
  66.       lcd_send_byte(0,LCD_INIT_STRING);
  67.     }
  68. }


  69. void lcd_gotoxy( byte x, byte y)
  70. {
  71.    byte address;

  72.    if(y!=1)
  73.      address=0x40;
  74.    else
  75.      address=0;
  76.    address+=x-1;
  77.    lcd_send_byte(0,0x80|address);
  78. }

  79. void lcd_putc( char c)
  80. {
  81.    switch (c) {
  82.      case '\f'   : lcd_send_byte(0,1); //delay_ms(5);
  83.                     break;
  84.      case '\n'   : lcd_gotoxy(1,2);          break;
  85.      default     : lcd_send_byte(1,c);       break;
  86.    }
  87. }

  88. ///////////////////////////////////////////////////////////////////////////////


  89. void main()
  90. {
  91.    long value;

  92.    lcd_init();
  93.    delay_ms(6);

  94.    lcd_putc("\fLight Measure";
  95.    lcd_putc("\nBy : PIC @ cArI";
  96.    delay_ms(1000);
  97.    setup_port_a( ALL_ANALOG );
  98.    setup_adc( ADC_CLOCK_INTERNAL );
  99.    set_adc_channel( 0 );

  100.    while(TRUE)
  101.    {
  102.       value = Read_ADC();
  103.       printf(lcd_putc,"\fReading: %lu ",value);
  104.       delay_ms(500);
  105.    }
  106. }
复制代码

[ 本帖最后由 pic 于 11-2-2009 09:54 AM 编辑 ]
回复

使用道具 举报

 楼主| 发表于 13-12-2006 10:59 AM | 显示全部楼层

谢谢PIC大大。。。。

原帖由 pic 于 13-12-2006 09:52 AM 发表
首先,不要喊救命, 只有你自己可以救自己。。。
我会帮你起个斗,其他的要自己努力,因为是你的功课。

很多网友,尤其是学生,问来问去都是RS232,ADC, LCD,Programmer, VB MSCOMM之类的,所以如有需要,以 ...


谢谢PIC大大。。。。这几天我都被68HC11的assembly code搞得头都痛了。。。而且hc11的circuit 又比pic的复杂得多了,一不小心拿出来program时,碰到其他的jumper又要一条一条的检查;coding已经够麻烦了,每次拿出来program hc11时还要再检查jumper。。。

不过,我真的好感谢pic 大大啊。。。老实的说。。。我和kevy是认识的啦。。。我们都是同一个course的同学来的。。

放心吧。。。我会介绍junior进来看看前辈们的问题咯。。。
回复

使用道具 举报

 楼主| 发表于 20-12-2006 12:25 AM | 显示全部楼层

紧急救命。。。

紧急救命。。。

有谁会PicBasic Pro Progamming code 的???
以上几楼是我和其他大大讨论的过程。我已采用了PIC大大提供的circuit , 但是我是用PicBasic Pro 来program 16F877A 的。。。。

以下是我的coding...但是却遇到了convert hex code 和binary code 的问题。。

' PicBasic Pro program to measure voltage (0-5VDC)
' and display on LCD with 2 decimal places. A
' 60 segment bargraph is also displayed using
' custom LCD characters.
'
' This program uses the */ operator to scale the
' ADC result from 0-1023 to 0-500.  The */ performs
' a divide by 256 automatically, allowing math which
' would normally exceed the limit of a word variable.
'
' Connect analog input to channel-0 (RA0)

' Define LCD registers and bits
DEFINE  LCD_DREG                PORTD
DEFINE  LCD_DBIT                4
DEFINE  LCD_RSREG                      PORTD
DEFINE  LCD_RSBIT               0
DEFINE  LCD_EREG                PORTD
DEFINE  LCD_EBIT                2
DEFINE        LCD_RWREG                PORTD
DEFINE        LCD_RWBIT                1
DEFINE        LCD_COMMANDUS                2000
DEFINE        LCD_DATAUS                50

' Define ADCIN parameters
DEFINE  ADC_BITS        10             ' Set number of bits in result
DEFINE  ADC_CLOCK       3             ' Set clock source (3=rc)
DEFINE  ADC_SAMPLEUS    50            ' Set sampling time in uS

' Declare variables
adval                  VAR WORD                        ' Create adval to store result

TRISA = %11111111                ' Set PORTA to all input
ADCON1 = %10000010                ' Set PORTA analog and right justify result
      
        Low PORTD.1                                ' LCD R/W line low (W)
        Pause 500                       ' Wait .5 second
        

loop:         ADCIN 0, adval                        ' Read channel 0 to adval (0-1023)

        adval = (adval */ 500)>>2        ' equates to: (adval * 500)/1024
        LCDOut $fe, 1           ' clear lcd sreen.
        LCDOut $FE,$C0          ' clear lcd screen.
        LCDOut $FE,1,"volt METER"
        LCDOut $FE,$C0,"volt=",DEC (adval/100),".", DEC2 adval,"uW"
' Display the decimal value
        Pause 100                                       ' Wait .1 second
        GoTo loop                                       ' Do it forever


End


________________________________________________________

adval = (adval */ 500)>>2        ' equates to: (adval * 500)/1024
LCDOut $FE,$C0,"volt=",DEC (adval/100),".", DEC2 adval,"uW"


就是这两行coding ,因为我要拿的result是必须要有5个decimal point 的 ,但是无论我如何改 : 把“DEC2 adval”改成“DEC5 adval” ,又或者改advl=(adval*/500)>>5 都不行。。。有谁可以教教我?????


各位大大帮帮忙啦!!!
回复

使用道具 举报

发表于 31-12-2006 07:48 PM | 显示全部楼层
DEFINE        OSC        4
DEFINE  ADC_BITS        10
DEFINE  ADC_CLOCK       3   
DEFINE  ADC_SAMPLEUS    10            
Define        LCD_DREG        PORTC
Define        LCD_DBIT        4
Define        LCD_RSREG        PORTC
Define        LCD_RSBIT        1
Define        LCD_EREG        PORTC
Define        LCD_EBIT        0
adcVar  VAR WORD
voltage  VAR WORD
voltagerem  VAR WORD

TRISA = %11111111     

ADCON1 = %10000000      

Pause 500               

main:         
  ADCIN 0, adcVar
  voltage = adcVar * 5000
  voltage = DIV32 1022
  LCDOUT        254, 1
  LCDOUT        "adcVar = ",#adcVar
  LCDOUT        254, 192
  LCDOUT        "voltage = ",#voltage DIG 3, ".",#voltage DIG 2,#voltage DIG 1, #voltage DIG 0
  Pause 10               
GoTo main

[ 本帖最后由 sooyewguan 于 31-12-2006 07:50 PM 编辑 ]
回复

使用道具 举报

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

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


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

GMT+8, 23-12-2024 06:01 PM , Processed in 0.103154 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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