PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) (http://www.picvietnam.com/forum/forumdisplay.php?f=12)
-   -   CCS C for PIC16F877A (http://www.picvietnam.com/forum/showthread.php?t=357)

HL2 28-06-2007 01:54 PM

Tuyệt vời, cảm ơn các bác nhiều lắm. Cảm ơn bác nhh đã khởi xướng ra chuyên mục này để anh em có cơ hội trao đổi kinh nghiệm, học hỏi.

anh_gioi 28-06-2007 07:58 PM

thay dổi tốc độ LED ngoài
 
Trích:

Nguyên văn bởi nhh (Post 2261)
Còn đây là ứng dụng ngắt ngoài trên RB4 đến RB7 để thay đổi kiểu cũng như tốc độ chớp nháy mấy con led chỉ để....ngắm cho vui mắt !

Ấn sw1, led1 nhấp nháy với delay 250ms
Ấn sw2, led1,2 nhấp nháy với delay 200ms
Ấn sw3, led1,2,3 nhấp nháy với delay 150ms
Ấn sw4, led1,2,3,4 nhấp nháy với delay 100ms
[code]//************************************************** ***************************
// Author : nhh
// Date : 03/04/06
// Hardware: PIC16F877A
//************************************************** ***************************
#include <16F877A.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#use fast_io(b)
#byte portb=0x06
#byte intcon=0x000B
#bit RB4=portb.4
#bit RB5=portb.5
#bit RB6=portb.6
#bit RB7=portb.7
#bit RBIF=intcon.0 //dinh nghia co ngat RB
#bit RBIE=intcon.3 //dinh nghia bit cho phep ngat RB
int led=0,speed;
// Chuong trinh ngat
#int_RB
void ngat_RB()
{
if((RBIF)&&(RBIE))
{
//Kiem tra sw1
{
if(RB4==0)
{
led=0b00000001; //led1 sang
speed=250;
}
}
//Kiem tra sw2
{
if(RB5==0)
{
led=0b00000011; //led1,2 sang
speed=200;
}
}
//Kiem tra sw3
{
if(RB6==0)
{
led=0b00000111; //led1,2,3 sang
speed=150;
}
}
//Kiem tra sw4
{
if(RB7==0)
{
led=0b00001111; //led1,2,3,4 sang
speed=100;
}
}
RBIF=0; //Xoa co ngat RB
}
}
// Chuong trinh chinh
main()
{
set_tris_b(0b11110000);
portb=0b00001111;
enable_interrupts(global);
enable_interrupts(int_RB);
ext_int_edge(H_to_L);
while(true)
{
portb=led;
delay_ms(speed);
portb=0;
delay_ms(speed);
}
}

http://www.freewebtown.com/nhhao/PIC...gngatngoai.gif

các bác ơi kiểm tra hộ em nhé.
em viết lại bài này ,thông báo không có lỗi gì,nhưng khi mô phỏng proteus thì không nhấp nháy dc.các bác kiểm tra hộ em phát


//thay doi toc do nhap nhay LED theo cac bit vao RB4-RB7
//RB0-RB3 bit ra

//khai bao cong vao ra
#use fast_io(b)
#byte portb = 0x06
#byte intcon = 0x000B
#bit RB4 = portB.4
#bit RB5 = portB.5
#bit RB6 = portB.6
#bit RB7 = portB.7
#bit RBIF = intcon.0 //dinh nghia ham ngat RB
#bit RBIE = intcon.3 //dinh nghia bit ngat RB
int LED = 0,speed;

//tao ham ngat
#int_ext
void ngat_RB(){
IF((RBIE)&&(RBIF)){
if(RB4==0){
LED = 0x01;//den 1 sang
speed = 500;
}
if(RB5==0){
LED = 0x03;//den 1 va 2 sang
speed = 300;
}
if(RB6==0){
LED = 0x07;//den 1 2 3 sang
speed = 200;
}
if(RB7 ==0){
LED = 0x0f;
speed = 50;
}
RBIF = 0;
}
}

//ham chinh

void main(){

set_tris_b(0b11110000); //dinh nghia cong vao ra
portb = 0x00; //bit cao thap
enable_interrupts(int_ext);
ext_int_edge(H_to_L);
enable_interrupts(global);
while(true){
portB = LED;
delay_ms(speed);
portB = 0;
delay_ms(speed);
}
}

NBC 28-06-2007 09:16 PM

Ghi và đọc bộ nhớ ngoài
 
1 Attachment(s)
Đây là đoạn chương trình có chức năng đọc giá trị ADC, sau đó ghi vào RAM ngoài, rồi đọc từ RAM ngoài để xử lí.
Có một vấn đề là khi tôi xóa dòng
output_high( PIN_D7 );
ở cuối hàm if thì các hàm này không thực thi được. Bác nào biết xin chỉ giúp tại sao.

anh_gioi 28-06-2007 10:16 PM

Trích:

Nguyên văn bởi nhh (Post 2386)
Mạch quét 16 phím, hiện kết quả lên led 7 đoạn.
Code:

//*****************************************************************************
// Author  : nhh
// Date    : 03/04/06
// Hardware: PIC16F877A
//*****************************************************************************
#include <16F877A.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#use fast_io(b)
#use fast_io(c)
#byte portb = 0x06
#byte portc = 0x07
#bit RB0 = 0x06.0
#bit RB1 = 0x06.1
#bit RB2 = 0x06.2
#bit RB3 = 0x06.3
#bit RB4 = 0x06.4
#bit RB5 = 0x06.5
#bit RB6 = 0x06.6
#bit RB7 = 0x06.7
#bit RBIF=intcon.0 //dinh nghia co ngat RB
#bit RBIE=intcon.3 //dinh nghia bit cho phep ngat RB
int a;
const unsigned char dig[]={0b00111111,0b00000110, 0b01011011,0b01001111,\
0b01100110,0b01101101,0b01111101,0b00000111,0b01111111,0b01101111,0b01110111,\
0b01111100,0b00111001,0b01011110,0b11111001,0b11110001};
                  // ma hoa digital duoi dang mang
// Chuong trinh ngat
#int_RB
void ngat_RB()
{
if((RBIF)&&(RBIE))
  {
        {
        if(RB4&&RB0)
        a=dig[0];
        }
        {
        if(RB4&&RB1)
        a=dig[4];
        }
        {
        if(RB4&&RB2)
        a=dig[8];
        }
        {
        if(RB4&&RB3)
        a=dig[12];
        }
//.......
        {
        if(RB5&&RB0)
        a=dig[1];
        }
        {
        if(RB5&&RB1)
        a=dig[5];
        }
        {
        if(RB5&&RB2)
        a=dig[9];
        }
        {
        if(RB5&&RB3)
        a=dig[13];
        }
//........
          {
        if(RB6&&RB0)
        a=dig[2];
        }
        {
        if(RB6&&RB1)
        a=dig[6];
        }
        {
        if(RB6&&RB2)
        a=dig[10];
        }
        {
        if(RB6&&RB3)
        a=dig[14];
        }
//........
          {
        if(RB7&&RB0)
        a=dig[3];
        }
        {
        if(RB7&&RB1)
        a=dig[7];
        }
        {
        if(RB7&&RB2)
        a=dig[11];
        }
        {
        if(RB7&&RB3)
        a=dig[15];
        }
  RBIF=0; //Xoa co ngat RB
  }
}
// Chuong trinh chinh
main()
{
set_tris_b(0b11110000);
set_tris_c(0);
enable_interrupts(global);
enable_interrupts(int_RB);
ext_int_edge(H_to_L);
portb=0;
portc=0;
while(true)
  {
  portb=1;
  portb=2;
  portb=4;
  portb=8;
  portc=a;
  }
}

http://www.freewebtown.com/nhhao/PIC/Giaimabanphim.gif

portb=1;
portb=2;
portb=4;
portb=8;
portc=a;
lệnh gán này không biết có ý nghĩa gì nhỉ?
thank!

anh_gioi 28-06-2007 11:53 PM

mình đánh lại chương trình trên ,CCS thông báo không có lỗi gì nhưng khi mô phỏng không chạy được.
mong mọi người tìm ra chỗ sai hộ mình!
thank!

Code:

#include "C:\Documents and Settings\Administrator\Desktop\thu\giai ma ban phim\giai ma ban phim.h"

#fuses NOWDT,PUT,HS,NOPROTECT
#use delay(clock=4000000)
//giai ma ban phim
#use fast_io(b)
#use fast_io(c)
#byte portb = 0x06
#byte portc = 0x07
#byte intcon = 0x000B
#bit RB0 = portB.0
#bit RB1 = portB.1
#bit RB2 = portB.2
#bit RB3 = portB.3
#bit RB4 = portB.4
#bit RB5 = portB.5
#bit RB6 = portB.6
#bit RB7 = portB.7
#bit RBIF = intcon.0 //dinh nghia ham ngat cong RB
#bit RBIE = intcon.3 //dinh nghia bit ngat RB
int a;
const unsigned char digital[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f\
                                0x77,0x7c,0x39,0x5e,0x79,0x71};
     
//tao ham ngat
#int_ext
void ngat_RB(){
                    IF((RBIF)&&(RBIE)){
                                            if(RB4&&RB0)
                                            { a = digital[0];}
                                           
                                            if(RB5&&RB0) 
                                            {a = digital[1];}
                                           
                                            if(RB6&&RB0)
                                            { a = digital[2];}
                                           
                                            if(RB7&&RB0)
                                            {a = digital[3];}
                                            ////
                                            if(RB4&&RB1)
                                            { a = digital[4];}
                                             
                                            if(RB5&&RB1) 
                                            {a = digital[5];}
                                           
                                            if(RB6&&RB1) 
                                            {a = digital[6];}
                                           
                                            if(RB7&&RB1)
                                            {a = digital[7];}
                                            ////
                                            if(RB4&&RB2)
                                            {a = digital[8];}
                                           
                                            if(RB5&&RB2) 
                                            {a = digital[9];}
                                           
                                            if(RB6&&RB2)
                                            {a = digital[10];}
                                           
                                            if(RB7&&RB2)
                                            {a = digital[11];}
                                            RBIF =0; //xoa co ngat                                         
}
}
                                                                     
                   
                   
  //tao ham chinh
  void main(){
                    set_tris_b(0xf0);
                    set_tris_c(0x00);
                    portb = 0;
                    portc = 0;
                    enable_interrupts(int_ext); //ngat toan bo
                    ext_int_edge(H_to_L);
                    enable_interrupts(global);
                    while(true){
                              portb = 1;
                              portb = 2;
                              portb = 4;
                              portb = 8;
                              portc = a;
                    }
                        }


namqn 29-06-2007 03:46 AM

Trích:

Nguyên văn bởi anh_gioi (Post 9666)
portb=1;
portb=2;
portb=4;
portb=8;
portc=a;
lệnh gán này không biết có ý nghĩa gì nhỉ?
thank!

Lần lượt cấp điện cho từng cột bàn phím, nếu có cột nào có phím nhấn thì nó sẽ tạo ngắt. Quét xong các cột bàn phím thì xuất giá trị của a ra LED 7 đoạn 1 lần, sau đó tiếp tục vòng lặp (cấp điện từng cột bàn phím, rồi xuất ra LED).

Thân,

nhh 29-06-2007 11:55 AM

Trích:

Nguyên văn bởi anh_gioi (Post 9669)
mình đánh lại chương trình trên ,CCS thông báo không có lỗi gì nhưng khi mô phỏng không chạy được.
mong mọi người tìm ra chỗ sai hộ mình!
thank!

#include "C:\Documents and Settings\Administrator\Desktop\thu\giai ma ban phim\giai ma ban phim.h"

#fuses NOWDT,PUT,HS,NOPROTECT
#use delay(clock=4000000)
...

Ở đây có cả giải thuật và code, đã test trên mạch thật. Bạn tham khảo thêm:
http://www.picvietnam.com/forum/showthread.php?t=839

anh_gioi 29-06-2007 12:43 PM

cam on anh rất nhiều !

anh_gioi 29-06-2007 01:49 PM

Trích:

Nguyên văn bởi namqn (Post 9671)
Lần lượt cấp điện cho từng cột bàn phím, nếu có cột nào có phím nhấn thì nó sẽ tạo ngắt. Quét xong các cột bàn phím thì xuất giá trị của a ra LED 7 đoạn 1 lần, sau đó tiếp tục vòng lặp (cấp điện từng cột bàn phím, rồi xuất ra LED).

Thân,

anh có thể nói rõ hơn được không a? số: 1,2,4,6,8 nó mặc định cho cổng đấy a?

anh_gioi 30-06-2007 01:44 AM

dịch
 
tui dốt tiếng anh quá, mọi người có thể dịch những từ dưới ra tiếng việt được ko? thanhk!
#FUSES NOWDT
#FUSES XT
#FUSES NOPUT
#FUSES NOPROTECT
#FUSES BROWNOUT
#FUSES LVP
#FUSES NOCPD
#FUSES NOWRT
#FUSES NODEBUG

namqn 30-06-2007 02:01 AM

Trích:

Nguyên văn bởi anh_gioi (Post 9680)
anh có thể nói rõ hơn được không a? số: 1,2,4,6,8 nó mặc định cho cổng đấy a?

- Xuất 1 ra PORTA thì chỉ có bit 0 (tức là chân RA0) ở mức 1, các bit (chân) khác là 0.
- Xuất 2 ra PORTA thì chỉ có bit 1 (tức là chân RA1) ở mức 1, các bit (chân) khác là 0.
- Xuất 4 ra PORTA thì chỉ có bit 2 (tức là chân RA2) ở mức 1, các bit (chân) khác là 0.
- Xuất 8 ra PORTA thì chỉ có bit 3 (tức là chân RA3) ở mức 1, các bit (chân) khác là 0.

Bạn nhìn vào sơ đồ mạch của nhh sẽ thấy các chân RA0 .. RA3 nối với các cột của bàn phím.

Thân,

anh_gioi 30-06-2007 02:13 AM

cám ơn anh lần nữa nha
anh có thể dịch cho em masy nghĩa của từ trên kia được ko ạ.

namqn 30-06-2007 02:14 AM

Trích:

Nguyên văn bởi anh_gioi (Post 9693)
tui dốt tiếng anh quá, mọi người có thể dịch những từ dưới ra tiếng việt được ko? thanhk!
#FUSES NOWDT
#FUSES XT
#FUSES NOPUT
#FUSES NOPROTECT
#FUSES BROWNOUT
#FUSES LVP
#FUSES NOCPD
#FUSES NOWRT
#FUSES NODEBUG

Đây là những tên viết tắt đã được định nghĩa sẵn bởi trình biên dịch (thường thông qua tập tin include .h). Tôi không dịch (vì những từ đó là viết tắt) mà sẽ giải thích:

NOWDT - Không dùng watchdog timer (cái này không nên dịch ra)
XT - Dùng mức XT (mức công suất trung bình) cho bộ dao động với thạch anh ngoài
NOPUT - Không dùng power up timer (làm trễ khi bật nguồn)
NOPROTECT - Không bảo vệ code (không cấm đọc nội dung flash)
BROWNOUT - Dùng chức năng bảo vệ chống thấp áp
LVP - Cho phép chế độ nạp chương trình ở điện áp thấp
NOCPD - Không bảo vệ EEPROM dữ liệu (không cấm đọc nội dung EEPROM)
NOWRT - Không cấm ghi vào flash
NODEBUG - Không dành riêng các chân RB6 và RB7 cho debug

Thân,

dvnccbmacbt 30-06-2007 11:50 AM

Hỏi về ADC!
 
Đây là chưong trinh :
Code:

#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#device 16F877*=16 ADC=8
#use delay(clock=10000000)
#use fast_io(b)
int8 adc;
main()
{set_tris_b(0);
setup_adc(adc_clock_internal);
setup_adc_ports(AN0);
set_adc_channel(0);
delay_ms(10);
while(true)
{
adc=read_adc();
output_B(adc);
}
}

Còn đây là mạch :
http://img412.imageshack.us/img412/3863/up001lm7.jpg

sau khi chạy thì tất cả các led đều sáng.Em không hiểu tại sao. Do sai ở mạch hay do chương trình.
http://img412.imageshack.us/img412/4703/up002qa2.jpg

Có bác nào giúp em với

nhh 30-06-2007 05:04 PM

http://i82.photobucket.com/albums/j257/nhhao/ADC.gif
Giữa biến trở và tụ C5 của bạn cần kéo xuống đất, nếu ko ngõ ra biến trở luôn ở mức cao 5V nên portB của bạn 8 đèn luôn sáng.

Thành thật cáo lỗi vì nhầm lẫn ngớ ngẩn này!


Múi giờ GMT. Hiện tại là 09:31 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam