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)
-   -   xin hỏi ý tưởng viết code này (http://www.picvietnam.com/forum/showthread.php?t=10600)

levuphuong 11-08-2011 02:10 PM

xin hỏi ý tưởng viết code này
 
tình hình là em mới tập tành với code,đang tính viết cái cơ bản thôi
là led sẽ sáng từ b0 chay den b7 rồi b7 giữ yên mức sáng rồi,tiếp tục sáng từ b0 đến b6
em nói hơi khó hiểu xin mấy bác xin cái clip này
http://www.youtube.com/watch?v=EqxfLwzG7no
Em viết dùng pow tren math.h nên code nặng quá ram hết 21%,rom 37% năng hơi lâu không biết có bị ảnh hưởng pic 16f877a ko
Em nghĩ là chắc có cách viết khác đơn giản hơn,Bác nào biết xin chỉ giúp
Sẵn tiện các bác cho hỏi làm sao để khi mình nhấn buton nào đó C0 chẳng hạn thì led chạy ngược lại.
xin cám ơn rất nhiều.
Code:

#include<16F877A.h>
#include <math.h>
#fuses NOWDT,PUT,HS,NOPROTECT
#use delay(clock=10000000)
#use fast_io(b)
#byte portb=0x6
void main()
{
int8 c=0 ;
int8 b=0 ;
int8 a=1;
set_tris_b(0);
while(true)
{
portb=a ;
delay_ms(100) ;
if(a<128)
{
a=a*2 ;

}
if(a==128||a==192||a==224||a==240||a==248||a==252||a==254)
{  c=a ;
 b=0 ;
}
if(a>=128)
{
a=c+pow(2,b) ;
b++;
}
if(a==255)
{
a=1;
b=0;
}



}
}


tdm 11-08-2011 09:35 PM

Trích:

Nguyên văn bởi levuphuong (Post 48096)
tình hình là em mới tập tành với code,đang tính viết cái cơ bản thôi
là led sẽ sáng từ b0 chay den b7 rồi b7 giữ yên mức sáng rồi,tiếp tục sáng từ b0 đến b6
em nói hơi khó hiểu xin mấy bác xin cái clip này
http://www.youtube.com/watch?v=EqxfLwzG7no
Em viết dùng pow tren math.h nên code nặng quá ram hết 21%,rom 37% năng hơi lâu không biết có bị ảnh hưởng pic 16f877a ko
Em nghĩ là chắc có cách viết khác đơn giản hơn,Bác nào biết xin chỉ giúp
Sẵn tiện các bác cho hỏi làm sao để khi mình nhấn buton nào đó C0 chẳng hạn thì led chạy ngược lại.
xin cám ơn rất nhiều.
Code:

#include<16F877A.h>
#include <math.h>
#fuses NOWDT,PUT,HS,NOPROTECT
#use delay(clock=10000000)
#use fast_io(b)
#byte portb=0x6
void main()
{
int8 c=0 ;
int8 b=0 ;
int8 a=1;
set_tris_b(0);
while(true)
{
portb=a ;
delay_ms(100) ;
if(a<128)
{
a=a*2 ;

}
if(a==128||a==192||a==224||a==240||a==248||a==252||a==254)
{  c=a ;
 b=0 ;
}
if(a>=128)
{
a=c+pow(2,b) ;
b++;
}
if(a==255)
{
a=1;
b=0;
}



}
}


đơn giản là tạo bảng tra:
Code:

#include <16f877a.h>
#device *=16 ADC=8
#fuses NOWDT,PUT,HS,NOPROTECT
#use delay(clock=20000000)
int8 i,bien;
const unsigned char ma_led[]= {
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,
0x81,0x82,0x84,0x88,0x90,0xA0,0xC0,0xC1,
0xC2,0xC4,0xC8,0xD0,0xE0,0xE1,0xE2,0xE4,
0xE8,0xF0,0xF1,0xF2,0xF4,0xF8,0xF9,0xFA,
0xFC,0xFD,0xFE,0xFF,0x00};
main()
{
set_tris_b(0x00);
while(1)
{
for(bien=0;bien<=36;bien++)
{
output_b(ma_led[bien]);
Delay_ms(100);
}

}
}


levuphuong 11-08-2011 11:53 PM

hay quá.cám ơn bác rất nhiều vậy vấn đề chạy ngược lai thì tương tự rồi
Em viết code cứ suy nghĩ qui luật nó thế nào nhức đầu quá,sau này chắc dụng mảng như thế dễ hơn :)

levuphuong 13-08-2011 06:58 PM

Mình có thêm thắc mắc về ngắt ngoài nên mình hỏi trong đây luôn sợ lập topic nhiều quá không tốt
Code:

#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 RBIF=intcon.0 //dinh nghia co ngat RB
#bit RBIE=intcon.3 //dinh nghia bit cho phep ngat RB
int8 a=0;
int8 i,bien;
const unsigned char ma_ledthuan[]= {
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,
0x81,0x82,0x84,0x88,0x90,0xA0,0xC0,0xC1,
0xC2,0xC4,0xC8,0xD0,0xE0,0xE1,0xE2,0xE4,
0xE8,0xF0,0xF1,0xF2,0xF4,0xF8,0xF9,0xFA,
0xFC,0xFD,0xFE,0xFF,0x00};
const unsigned char ma_lednguoc[]= {
0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,
0x81,0x41,0x21,0x11,0x09,0x05,0x03,0x83,
0x43,0x23,0x13,0x0b,0x07,0x87,0x47,0x27,
0x17,0x0f,0x8f,0x4f,0x2f,0x1f,0x9f,0x5f,
0x3f,0xbf,0x7f,0xFF,0x00};

// Chuong trinh ngat
#int_RB
void ngat_RB()
{
if((RBIF)&&(RBIE))
  {
      //Kiem tra sw1
      {
      if(RB4==1)
        {
        a++ ;
      }
      //Kiem tra sw2
     
  RBIF=0; //Xoa co ngat RB
  }
}
}
// Chuong trinh chinh
void main()
{
set_tris_b(0b11110000);
portb=0b11110000;
enable_interrupts(global);
enable_interrupts(int_RB);
ext_int_edge(H_to_L);
while(true)
  {
  if(a%2==0)
  {
  for(bien=0;bien<=36;bien++)
{
output_d(ma_ledthuan[bien]);
Delay_ms(200);
}
  }
  else
  {
for(bien=0;bien<=36;bien++)
{
output_d(ma_lednguoc[bien]) ;
delay_ms(200) ;

}
  }
}
}

Xin hỏi là sao mà khi mình nhấn nút ấy thì led không chạy ngược tức thời mà nó phải đợi hết vòng lập for đang chạy(tức là led phải chạy hết cái xuôi hay ngược rồi nó mới thay đổi)
Có cách nào làm cho nó thay đổi tức thời khi
Hòi thêm cái dòng này nghĩa là j vậy
if((RBIF)&&(RBIE)) ;
Xin cám ơn
ah thì ra là nó hết ngắt sẽ trả về nơi trước khi nó ngắt.hay là mình đặt điều kiên trong for rồi break nhỉ.Nhưng làm như thế không thấy phát huy tác dụng của ngắt nhỉ.
Các bác giúp em vớ

tdm 13-08-2011 09:45 PM

Trích:

Nguyên văn bởi levuphuong (Post 48232)
Mình có thêm thắc mắc về ngắt ngoài nên mình hỏi trong đây luôn sợ lập topic nhiều quá không tốt
Code:

#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 RBIF=intcon.0 //dinh nghia co ngat RB
#bit RBIE=intcon.3 //dinh nghia bit cho phep ngat RB
int8 a=0;
int8 i,bien;
const unsigned char ma_ledthuan[]= {
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,
0x81,0x82,0x84,0x88,0x90,0xA0,0xC0,0xC1,
0xC2,0xC4,0xC8,0xD0,0xE0,0xE1,0xE2,0xE4,
0xE8,0xF0,0xF1,0xF2,0xF4,0xF8,0xF9,0xFA,
0xFC,0xFD,0xFE,0xFF,0x00};
const unsigned char ma_lednguoc[]= {
0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,
0x81,0x41,0x21,0x11,0x09,0x05,0x03,0x83,
0x43,0x23,0x13,0x0b,0x07,0x87,0x47,0x27,
0x17,0x0f,0x8f,0x4f,0x2f,0x1f,0x9f,0x5f,
0x3f,0xbf,0x7f,0xFF,0x00};

// Chuong trinh ngat
#int_RB
void ngat_RB()
{
if((RBIF)&&(RBIE))
  {
      //Kiem tra sw1
      {
      if(RB4==1)
        {
        a++ ;
      }
      //Kiem tra sw2
     
  RBIF=0; //Xoa co ngat RB
  }
}
}
// Chuong trinh chinh
void main()
{
set_tris_b(0b11110000);
portb=0b11110000;
enable_interrupts(global);
enable_interrupts(int_RB);
ext_int_edge(H_to_L);
while(true)
  {
  if(a%2==0)
  {
  for(bien=0;bien<=36;bien++)
{
output_d(ma_ledthuan[bien]);
Delay_ms(200);
}
  }
  else
  {
for(bien=0;bien<=36;bien++)
{
output_d(ma_lednguoc[bien]) ;
delay_ms(200) ;

}
  }
}
}

Xin hỏi là sao mà khi mình nhấn nút ấy thì led không chạy ngược tức thời mà nó phải đợi hết vòng lập for đang chạy(tức là led phải chạy hết cái xuôi hay ngược rồi nó mới thay đổi)
Có cách nào làm cho nó thay đổi tức thời khi
Hòi thêm cái dòng này nghĩa là j vậy
if((RBIF)&&(RBIE)) ;
Xin cám ơn
ah thì ra là nó hết ngắt sẽ trả về nơi trước khi nó ngắt.hay là mình đặt điều kiên trong for rồi break nhỉ.Nhưng làm như thế không thấy phát huy tác dụng của ngắt nhỉ.
Các bác giúp em vớ

trong hàm ngắt thêm một biến phát hiện ngắt.
trong vòng lặp for kiểm tra biến đó nếu phát hiện có ngắt thì kết thúc vòng lặp for.

levuphuong 15-08-2011 12:39 PM

Code:

#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 RBIF=intcon.0 //dinh nghia co ngat RB
#bit RBIE=intcon.3 //dinh nghia bit cho phep ngat RB
int8 a=0;
int8 bien;
const unsigned char ma_ledthuan[]= {
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,
0x81,0x82,0x84,0x88,0x90,0xA0,0xC0,0xC1,
0xC2,0xC4,0xC8,0xD0,0xE0,0xE1,0xE2,0xE4,
0xE8,0xF0,0xF1,0xF2,0xF4,0xF8,0xF9,0xFA,
0xFC,0xFD,0xFE,0xFF,0x00};
const unsigned char ma_lednguoc[]= {
0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,
0x81,0x41,0x21,0x11,0x09,0x05,0x03,0x83,
0x43,0x23,0x13,0x0b,0x07,0x87,0x47,0x27,
0x17,0x0f,0x8f,0x4f,0x2f,0x1f,0x9f,0x5f,
0x3f,0xbf,0x7f,0xFF,0x00};

// Chuong trinh ngat
#int_RB
void ngat_RB()
{
if((RBIF)&&(RBIE))
  {
      //Kiem tra sw1
      {
      if(RB4==1)
        {
        a++ ;
            // thêm delay_ms(10) thì nó không chạy dc
      }
      //Kiem tra sw2
     
  RBIF=0; //Xoa co ngat RB
  }
}
}
// Chuong trinh chinh
void main()
{
set_tris_b(0b11110000);
portb=0b11110000;
enable_interrupts(global);
enable_interrupts(int_RB);
ext_int_edge(H_to_L);
while(true)
  {
  if(a%2==0)
  {
  for(bien=0;bien<=36;bien++)
{
if(a%2==1)
bien=37;
output_d(ma_ledthuan[bien]);
Delay_ms(200);
}
  }
  else
  {
for(bien=0;bien<=36;bien++)
{
if(a%2==0)
bien=37;
output_d(ma_lednguoc[bien]) ;
delay_ms(200) ;

}
  }
}
}

mình đã sửa lại và chạy rồi nhưng khi nhấn 5 cái có 1 cái hok ăn.xem trên diễn đàn th2i là do hiện tuong rung phím.Mình thử thêm delay vào ben trong ngắt .sau dò phím thì nó lại bi warning và code hok chạy luôn
Nó báo sẽ không ngắt khi chay hàm delay_ms
Các bác giúp em với

tdm 15-08-2011 01:35 PM

Trích:

Nguyên văn bởi levuphuong (Post 48314)
Code:

#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 RBIF=intcon.0 //dinh nghia co ngat RB
#bit RBIE=intcon.3 //dinh nghia bit cho phep ngat RB
int8 a=0;
int8 bien;
const unsigned char ma_ledthuan[]= {
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,
0x81,0x82,0x84,0x88,0x90,0xA0,0xC0,0xC1,
0xC2,0xC4,0xC8,0xD0,0xE0,0xE1,0xE2,0xE4,
0xE8,0xF0,0xF1,0xF2,0xF4,0xF8,0xF9,0xFA,
0xFC,0xFD,0xFE,0xFF,0x00};
const unsigned char ma_lednguoc[]= {
0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,
0x81,0x41,0x21,0x11,0x09,0x05,0x03,0x83,
0x43,0x23,0x13,0x0b,0x07,0x87,0x47,0x27,
0x17,0x0f,0x8f,0x4f,0x2f,0x1f,0x9f,0x5f,
0x3f,0xbf,0x7f,0xFF,0x00};

// Chuong trinh ngat
#int_RB
void ngat_RB()
{
if((RBIF)&&(RBIE))
  {
      //Kiem tra sw1
      {
      if(RB4==1)
        {
        a++ ;
            // thêm delay_ms(10) thì nó không chạy dc
      }
      //Kiem tra sw2
     
  RBIF=0; //Xoa co ngat RB
  }
}
}
// Chuong trinh chinh
void main()
{
set_tris_b(0b11110000);
portb=0b11110000;
enable_interrupts(global);
enable_interrupts(int_RB);
ext_int_edge(H_to_L);
while(true)
  {
  if(a%2==0)
  {
  for(bien=0;bien<=36;bien++)
{
if(a%2==1)
bien=37;
output_d(ma_ledthuan[bien]);
Delay_ms(200);
}
  }
  else
  {
for(bien=0;bien<=36;bien++)
{
if(a%2==0)
bien=37;
output_d(ma_lednguoc[bien]) ;
delay_ms(200) ;

}
  }
}
}

mình đã sửa lại và chạy rồi nhưng khi nhấn 5 cái có 1 cái hok ăn.xem trên diễn đàn th2i là do hiện tuong rung phím.Mình thử thêm delay vào ben trong ngắt .sau dò phím thì nó lại bi warning và code hok chạy luôn
Nó báo sẽ không ngắt khi chay hàm delay_ms
Các bác giúp em với

vẫn chạy bt,mô phỏng proteus không cần chống rung .nhấn phím thì giữ một chút nhé .

Code:

#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 RBIF=intcon.0 //dinh nghia co ngat RB
#bit RBIE=intcon.3 //dinh nghia bit cho phep ngat RB
int8 a=0;
int8 bien;
const unsigned char ma_ledthuan[]= {
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,
0x81,0x82,0x84,0x88,0x90,0xA0,0xC0,0xC1,
0xC2,0xC4,0xC8,0xD0,0xE0,0xE1,0xE2,0xE4,
0xE8,0xF0,0xF1,0xF2,0xF4,0xF8,0xF9,0xFA,
0xFC,0xFD,0xFE,0xFF,0x00};
const unsigned char ma_lednguoc[]= {
0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,
0x81,0x41,0x21,0x11,0x09,0x05,0x03,0x83,
0x43,0x23,0x13,0x0b,0x07,0x87,0x47,0x27,
0x17,0x0f,0x8f,0x4f,0x2f,0x1f,0x9f,0x5f,
0x3f,0xbf,0x7f,0xFF,0x00};

// Chuong trinh ngat
#int_RB
void ngat_RB()
{
if((RBIF)&&(RBIE))
  {

      if(RB4==1)
        {
       
        a++ ;
      delay_ms(10) ;//thi? no? không cha?y dc
      }
}
}
// Chuong trinh chinh
void main()
{
set_tris_b(0b11110000);
portb=0b11110000;
enable_interrupts(global);
enable_interrupts(int_RB);
ext_int_edge(H_to_L);
while(true)
  {
  if(a%2==0)
  {
  for(bien=0;bien<=36;bien++)
{
if(a%2==1)
bien=37;
output_d(ma_ledthuan[bien]);
Delay_ms(200);
}
  }
  else
  {
for(bien=0;bien<=36;bien++)
{
if(a%2==0)
bien=37;
output_d(ma_lednguoc[bien]) ;
delay_ms(200) ;

}
  }
}
}


levuphuong 15-08-2011 07:59 PM

Nó báo warning nhưng vẫn nạp được nhựng chạy vẫn như cũ
Không dc như ý.Chắc tại nút cùi wa :(

levuphuong 25-08-2011 01:05 PM

hom nay em làm tiếp tới lcd nhưng sao nó hok chạy
http://www.picvietnam.com/forum//sho...0&postcount=51
làm theo code này và chan em nối
1;gnd
2;vcc
3;chia ap ra 2.5v câu vào
4,5,6 d0->d2
7.8.9.10.11.12.13.14.
15 len vcc
16 đất
nhưng sao em nạp vào nó chỉ sáng chứ hok ra chữ
em đổi xt->hs rồi dùng
#use delay(clock=12000000)
Các bác cho hỏi em làm như thế đúng chưa

levuphuong 31-08-2011 01:31 AM

Ai có mạch thật test dùm mình cái trên đi.Mình thử mấy bữa này mà không được :(

phatcddt08a 31-08-2011 10:36 AM

void ngat_RB()
{
if((RBIF)&&(RBIE))
{

if(RB4==1)
{

a++ ;
delay_ms(10) ;//thi? no? không cha?y dc
}
}
}
khong nen dung delay trong ngat ban ah ban nen dung mot vong lap while hoac for cho chong rung phim se tot hon

tdm 31-08-2011 02:30 PM

Trích:

Nguyên văn bởi levuphuong (Post 48965)
hom nay em làm tiếp tới lcd nhưng sao nó hok chạy
http://www.picvietnam.com/forum//sho...0&postcount=51
làm theo code này và chan em nối
1;gnd
2;vcc
3;chia ap ra 2.5v câu vào
4,5,6 d0->d2
7.8.9.10.11.12.13.14.
15 len vcc
16 đất
nhưng sao em nạp vào nó chỉ sáng chứ hok ra chữ
em đổi xt->hs rồi dùng
#use delay(clock=12000000)
Các bác cho hỏi em làm như thế đúng chưa

thử lại xem sao:
Code:

/*-----------------------------------------------------------------------------
* Author          : nhh
* Date            : 05/04/06
* Hardware        : PIC16F877A
* Compiler      : CCS C 3.249
* Description  : Hien thi LCD
*=============================================================================*/
#include <16F877A.h>
#include <DEFS_16F877A.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#define RS  RD0
#define RW  RD1
#define E  RD2
#define LCD PORTB

const unsigned char key[]="HELLOPICVIETNAM!";
int i = 0;

/*Ham yeu cau goi lenh dieu khien LCD*/
void comnwrt(void)
{
 RS = 0;
 RW = 0;
 E  = 1;
delay_ms(1);
 E  = 0;
 delay_ms(1);
}
/*Ham yeu cau goi du lieu hien thi len LCD*/
void datawrt(void)
{
 RS = 1;
 RW = 0;
 E  = 1;
delay_ms(1);
 E  = 0;
 delay_ms(1);
}
/*Ham main*/
void main(void)
{
 set_tris_B(0);
 set_tris_D(0);
 delay_ms(100);  //  Tao tre 100ms cho LCD khoi dong

 LCD = 0x38;      //  Hai hang, ma tran dot 5*7, 8 bit interface
 comnwrt();
 LCD = 0x0C;      //  Bat hien thi, tat con tro
 comnwrt();
 LCD = 0x86;      //  Vi tri hang 1,cot 7
 comnwrt();
 while(true)
  {
      LCD = key[i];
      datawrt();
      delay_ms(100);
      i++;
      if(i==5)              //  Hien thi xong HELLO
        {
            LCD = 0xC3;      //  Vi tri hang 2,cot 4
            comnwrt();
            delay_ms(100);
        }
      if(i==16)              //  Hien thi xong PICVIETNAM!
        {
            delay_ms(1100);
            LCD = 0x01;      //  Xoa man hinh hien thi
            comnwrt();
            delay_ms(500);
            LCD = 0x86;      //  Vi tri hang 1,cot 7
            comnwrt();
            i = 0;
        }
  }
}


levuphuong 01-09-2011 12:47 PM

mình đã thử cũng hok được chắc do mình cắm vào lcd ko tiếp xúc tốt lắm.
HOk biết có chỗ nào bán cái đồ để mình cắm lcd lên test board ko nhỉ.Mình xem trên youtube thấy cái đó

ductien88 01-09-2011 01:50 PM

Chợ giời 45k hay 50k gì đấy . Tốt nhất nên làm mạch để còn nâng cao tay nghề . :D còn luyện lâp trình thì nên mua KIt về luyện :D

levuphuong 01-09-2011 10:55 PM

cái chân câm lcd mà mắc thế á.mắc gần hơn cả testboard ? :(


Múi giờ GMT. Hiện tại là 10:28 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