19-11-2008, 05:24 PM | #1 |
Đệ tử 5 túi
Tham gia ngày: Oct 2008
Bài gửi: 95
: |
Thắc mắc về code cho PIC16F877
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock=20000000) int k ; void main() { set_tris_c(0); do { for(k=0;k<15;k++) { delay_ms(100); PORTC=k ; } } while (1); } Các bạn vui lòng cho mình hỏi :sao đoạn code mình viết bằng CCS4.068 không biên dịch được,nó cứ báo lỗi chỗ PORTC.Mình làm cả ngày nay mà chẳng được gì hết !Mong các bạn chỉ giúp .Rất cảm ơn. |
19-11-2008, 06:19 PM | #2 | |
Đệ tử 6 túi
Tham gia ngày: Mar 2007
Bài gửi: 150
: |
Trích:
Code:
#byte PORTC = 0x07
__________________
_________________________________________________ Le Trung Duc Industry Research & Application Center NTT Institute of Hi_technolog ltduc@ntt.edu.vn leduc_cktd@yahoo.com.vn http://www.nttc.edu.vn CNC DIY : http://quangcaosanpham.com/shop/driverservo 0909300332 |
|
19-11-2008, 07:36 PM | #3 |
Đệ tử 5 túi
Tham gia ngày: Oct 2008
Bài gửi: 95
: |
cam on bạn đã chỉ bảo,nhưng 0x07 là sao vậy bạn,mình còn yếu lắm,mong bạn chỉ bảo.
|
19-11-2008, 07:42 PM | #4 |
Đệ tử 5 túi
Tham gia ngày: Oct 2008
Bài gửi: 95
: |
Vậy mình có cần định nghĩa trisc=87h khong bạn
|
19-11-2008, 07:50 PM | #5 |
Đệ tử 7 túi
Tham gia ngày: Jul 2007
Nơi Cư Ngụ: Đà Nẵng
Bài gửi: 188
: |
|
19-11-2008, 08:44 PM | #6 |
Đệ tử 5 túi
Tham gia ngày: Oct 2008
Bài gửi: 95
: |
Code:
#include <16F877A.h> // #use delay(clock=20000000) // #include <lcd.c> // float vantoc,soxung; // int8 a,b,c,d,a1; // int16 sovong,i; // /////////////////ket thuc phan khai bao thu vien va cac bien////////////////////// ////////////khai bao va chuong trinh ngat cho TIMER1///////////////////// #int_TIMER1 // void TIMER1_isr(void) // { // soxung=get_timer0(); //Lay so xung ma Timer0 dem // set_timer1(65535); // Trong 1ms // if(tmr1if==1) //neu Timer1 tran thi co tmr1if =1 // { // intcon=0; //stop ngat (reset cac thong so ngat ) // a1=1; //cho a1=1 // } // } // //////////////////////////ket thuc phan TIMER1/////////////////////////// //////////////////////////bat dau chuong trinh chinh//////////////////////////// void main() { trisa=0xFF; //set RA4 input,chan lay xung tu Encoder trisb=0; //dinh huong portB la ngo ra trisc=0; //dinh huong portC la ngo ra trisd=0; //dinh huong portD la ngo ra lcd_init(); //ham khoi tao LCD lcd_gotoxy(1,1); //den vi tri hang 1 cot 1 lcd_putc("Beginning...."); //in ra beginning.... delay_ms(1000); // tao tre 1s lcd_putc('\f'); //dau cham nhap nhay setup_timer_2(T2_DIV_BY_2,254,1); //tao f(pwm)=9775Hz hay T(pwm)=0.1023ms setup_ccp1(CCP_PWM); //thiet lap chan CCP1 o che do PWM for(i=0;i<1000;i++) //tu 0 den 1000 thi toc do tang dan { set_pwm1_duty(i); // Toc do tang dan delay_ms(1); set_timer0(0); //lam moi Timer0 de chuan bi dem xung set_timer1(65535); //dat gia tri cho Timer1_khoang 1s setup_timer_0(RTCC_EXT_H_TO_L|RTCC_DIV_1);//setupTimer0_demcanhxuongxungEncoder setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); enable_interrupts(INT_TIMER1); //cho phep ngat Timer1 enable_interrupts(GLOBAL); //cho phep ngat toan cuc delay_ms(10); // if(a1==1) //cu moi lan Timer1 ngat thi a1=1 ,roi tinh vantoc,hien thi { vantoc=((float)(60*soxung)/(0.01*100)); //Tinh van toc a=vantoc/1000; //chia lay phan nguyen b=(int)(vantoc-1000*a)/100; //chia lay phan nguyen c=(int)(vantoc-1000*a-100*b)/10; //chia lay phan nguyen d=(int)vantoc%10; //chia lay phan du ///////////////////toi phan hien thi LCD///////////////////////////// lcd_gotoxy(3,3); //den vi tri hang 3 cot 3 lcd_putc(a+48); //in ra a lcd_gotoxy(3,4); //den vi tri hang 3 cot 4 lcd_putc(b+48); //in ra b lcd_gotoxy(3,5); //den vi tri hang 3 cot 5 lcd_putc(c+48); //in ra c lcd_gotoxy(3,6); //den vi tri hang 3 cot 6 lcd_putc(d+48); //in ra d lcd_gotoxy(4,3); //den vi tri hang 4 cot 3 lcd_putc("vong/phut"); //in ra "vong/phut" lcd_gotoxy(2,2); //den vi tri hang 2 cot 2 lcd_putc("toc do dc"); //in ra "toc do dc" delay_ms(5); // tmr0if=0;tmr1if=0; //Xoa co tran cua Timer0 va Timer1 } } } thay đổi nội dung bởi: namqn, 19-11-2008 lúc 10:32 PM. |
19-11-2008, 10:33 PM | #7 | |
Trưởng lão PIC bang
|
Trích:
Thân,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
|
20-11-2008, 01:56 AM | #8 |
Đệ tử 5 túi
Tham gia ngày: Oct 2008
Bài gửi: 95
: |
Code:
LCDD.C //// //// Driver for common LCD modules //// //// //// //// lcd_init() Must be called before any other function. //// //// //// //// lcd_putc(c) Will display c on the next position of the LCD. //// //// The following have special meaning: //// //// \f Clear display //// //// \n Go to start of second line //// //// \b Move back one position //// //// //// //// lcd_gotoxy(x,y) Set write position on LCD (upper left is 1,1) //// //// //// //// lcd_getc(x,y) Returns character at position x,y on LCD //// //// //// /////////////////////////////////////////////////////////////////////////// //// (C) Copyright 1996,2007 Custom Computer Services //// //// This source code may only be used by licensed users of the CCS C //// //// compiler. This source code may only be distributed to other //// //// licensed users of the CCS C compiler. No other use, reproduction //// //// or distribution is permitted without written permission. //// //// Derivative programs created using this software in object code //// //// form are not restricted in any way. //// /////////////////////////////////////////////////////////////////////////// // As defined in the following structure the pin connection is as follows: // D0 enable // D1 rs // D2 rw // D4 D4 // D5 D5 // D6 D6 // D7 D7 // // LCD pins D0-D3 are not used and PIC D3 is not used. // Un-comment the following define to use port B // #define use_portb_lcd TRUE struct lcd_pin_map { // This structure is overlayed BOOLEAN enable; // on to an I/O port to gain BOOLEAN rs; // access to the LCD pins. BOOLEAN rw; // The bits are allocated from BOOLEAN unused; // low order up. ENABLE will int data : 4; // be pin B0. } lcd; #if defined use_portb_lcd //#locate lcd = getenv("sfr:PORTB") // This puts the entire structure over the port #ifdef __pch__ #locate lcd = 0xf81 #else #locate lcd = 6 #endif #define set_tris_lcd(x) set_tris_b(x) #else //#locate lcd = getenv("sfr:PORTD") // This puts the entire structure over the port #ifdef __pch__ #locate lcd = 0xf83 #else #locate lcd = 8 #endif #define set_tris_lcd(x) set_tris_d(x) #endif #ifndef lcd_type #define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines #endif #define lcd_line_two 0x40 // LCD RAM address for the second line BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6}; // These bytes need to be sent to the LCD // to start it up. // The following are used for setting // the I/O port direction register. struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in BYTE lcd_read_byte() { BYTE low,high; set_tris_lcd(LCD_READ); lcd.rw = 1; delay_cycles(1); lcd.enable = 1; delay_cycles(1); high = lcd.data; lcd.enable = 0; delay_cycles(1); lcd.enable = 1; delay_us(1); low = lcd.data; lcd.enable = 0; set_tris_lcd(LCD_WRITE); return( (high<<4) | low); } 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; while ( bit_test(lcd_read_byte(),7) ) ; 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_lcd(LCD_WRITE); 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[i]); } void lcd_gotoxy( BYTE x, BYTE y) { BYTE address; if(y!=1) address=lcd_line_two; 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(2); break; case '\n' : lcd_gotoxy(1,2); break; case '\b' : lcd_send_byte(0,0x10); break; default : lcd_send_byte(1,c); break; } } char lcd_getc( BYTE x, BYTE y) { char value; lcd_gotoxy(x,y); while ( bit_test(lcd_read_byte(),7) ); // wait until busy flag is low lcd.rs=1; value = lcd_read_byte(); lcd.rs=0; return(value); } thay đổi nội dung bởi: namqn, 20-11-2008 lúc 02:47 AM. |
20-11-2008, 02:55 AM | #9 | |
Trưởng lão PIC bang
|
Trích:
File "lcd.c" được CCS C tạo ra có phải nằm trong thư mục của project mà bạn đang biên dịch? Bạn nên chú ý phân biệt 2 cách viết #include <lcd.c> và #include "lcd.c". Các file "lcd_4bit.c" và "lcd_lib_4bit.c" có thể là thư viện của một trình biên dịch nào đó, cũng có thể là do người dùng tự tạo ra. Thân,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
|
20-11-2008, 06:46 PM | #10 |
Đệ tử 5 túi
Tham gia ngày: Oct 2008
Bài gửi: 95
: |
#include <lcd.c>đây là file mình khai báo lúc đầu.Mình chưa rõ chỗ này: "< Bạn nên chú ý phân biệt 2 cách viết #include <lcd.c> và #include "lcd.c".>"lắm mong bạn chỉ bảo thêm.
File "lcd.c" được CCS C tạo ra đúng là nằm trong thư mục của project đang biên dịch. |
20-11-2008, 07:18 PM | #11 | |
Trưởng lão PIC bang
|
Trích:
Về chỗ bạn chưa rõ, bạn đọc tài liệu hướng dẫn của CCS C, mục nói về #include. Link download ở đây: http://www.ccsinfo.com/downloads/ccs_c_manual.pdf. Nếu dùng #include <lcd.c> thì thư mục của project sẽ được tìm kiếm sau cùng (theo tài liệu hướng dẫn của CCS C), do đó nếu một trong những thư mục được CCS C dùng để tìm kiếm tập tin gộp (đọc tài liệu hướng dẫn để biết chúng được thiết lập ở đâu) cũng có một tập tin tên là "lcd.c" thì CCS C sẽ dùng tập tin đó, chứ không phải tập tin vừa được tạo trong thư mục của project đang biên dịch. Và hiện thời, chúng ta chưa biết nội dung của tập tin (nếu có) đó. Thân,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
|
20-11-2008, 10:17 PM | #12 |
Đệ tử 5 túi
Tham gia ngày: Oct 2008
Bài gửi: 95
: |
các bạn cho mình hỏi là "khi mở CCS lên,vào chọn projiectwizard,rồi chọn loại Pic,có cần chọn luôn các thông số khác như timer,Lcd,...) luôn không hay là cứ Ok rồi viết chương trình của mình.
|
20-11-2008, 11:24 PM | #13 |
Đệ tử 5 túi
Tham gia ngày: Oct 2008
Bài gửi: 95
: |
Bạn à ,sao mình nghe nói là #include<lcd.c> dùng để khai báo các hàm hay chương trình con cho LCD
|
20-11-2008, 11:44 PM | #14 |
Đệ tử 5 túi
Tham gia ngày: Oct 2008
Bài gửi: 95
: |
Pic6F877A
các bạn cho mình hỏi :#byte PORTC = 0x07 có ý nghĩa là gán giá trị 0x07 vào biến PORTC chứ đâu phải định nghĩa PORTC ở địa chỉ 0x07.vậy #BYTE portB=0xC6 thì hiểu thế nào?0xC6 đâu phải địa chỉ của portB |
20-11-2008, 11:59 PM | #15 |
Đệ tử 5 túi
Tham gia ngày: Oct 2008
Bài gửi: 95
: |
vậy là mình bỏ dòng này đi phải không bạn#include <lcd.c>
|
|
|