查看: 2519|回复: 14
|
紧急救命。。。想问coding问题。有谁会PicBasic Pro Progamming code 的???
[复制链接]
|
|
紧急救命。。。
有谁会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 编辑 ] |
|
|
|
|
|
|
|
发表于 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
|
显示全部楼层
|
|
|
|
|
|
|
发表于 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 ) 的话 ,通知我吧!!!!!
各位大大帮帮忙啦!!! |
|
|
|
|
|
|
|
发表于 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 编辑 ] |
|
|
|
|
|
|
|
发表于 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。- #include <16F877A.h>
- #device ADC=10
- #fuses HS,NOWDT,NOPROTECT,NOLVP
- #use delay(clock=20000000)
- ///////////////////////////////////////////////////////////////////////////////
- // LCD Driver
- ///////////////////////////////////////////////////////////////////////////////
- // As defined in the following structure the pin connection is as follows:
- /*
- LCD 16 X 2 line
- PortD.0-> RS
- PortD.1-> RW
- PortD.2-> E
- PortD.3
- PortD.4-> D4
- PortD.5-> D5
- PortD.6-> D6
- PortD.7-> D7
- */
- /////////////////////////////////////////////////////////////////
- // LCD Driver
- struct lcd_pin_map { // This structure is overlayed
- boolean rs; // on to an I/O port to gain
- boolean rw; // access to the LCD pins.
- boolean enable; // The bits are allocated from
- boolean unused; // low order up. ENABLE will
- int data : 4; // be pin B0.
- } lcd;
- #byte lcd = 0x08 // on to port D (at address 0x08)
- byte CONST LCD_INIT_STRING[4] = {0x28, 0xc, 1, 6};
- void lcd_send_nibble( byte n )
- {
- lcd.data = n;
- delay_cycles(1);
- lcd.enable = 1;
- delay_us(2);
- lcd.enable = 0;
- }
- void lcd_send_byte( byte address, byte n )
- {
- lcd.rs = 0;
- delay_ms(5);
- lcd.rs = address;
- delay_cycles(1);
- lcd.rw = 0;
- delay_cycles(1);
- lcd.enable = 0;
- lcd_send_nibble(n >> 4);
- lcd_send_nibble(n & 0xf);
- }
- 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);
- }
- }
- void lcd_gotoxy( byte x, byte y)
- {
- byte address;
- if(y!=1)
- address=0x40;
- else
- address=0;
- address+=x-1;
- lcd_send_byte(0,0x80|address);
- }
- void lcd_putc( char c)
- {
- switch (c) {
- case '\f' : lcd_send_byte(0,1); //delay_ms(5);
- break;
- case '\n' : lcd_gotoxy(1,2); break;
- default : lcd_send_byte(1,c); break;
- }
- }
- ///////////////////////////////////////////////////////////////////////////////
- void main()
- {
- long value;
- lcd_init();
- delay_ms(6);
- lcd_putc("\fLight Measure";
- lcd_putc("\nBy : PIC @ cArI";
- delay_ms(1000);
- setup_port_a( ALL_ANALOG );
- setup_adc( ADC_CLOCK_INTERNAL );
- set_adc_channel( 0 );
- while(TRUE)
- {
- value = Read_ADC();
- printf(lcd_putc,"\fReading: %lu ",value);
- delay_ms(500);
- }
- }
复制代码
[ 本帖最后由 pic 于 11-2-2009 09:54 AM 编辑 ] |
|
|
|
|
|
|
|
楼主 |
发表于 13-12-2006 10:59 AM
|
显示全部楼层
|
|
|
|
|
|
|
楼主 |
发表于 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 编辑 ] |
|
|
|
|
|
|
| |
本周最热论坛帖子
|