![]() |
![]() |
#1 |
Đệ tử 1 túi
Tham gia ngày: Jul 2011
Bài gửi: 25
: |
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; } } } |
![]() |
![]() |
![]() |
#2 | |
Đệ tử 7 túi
Tham gia ngày: May 2005
Bài gửi: 258
: |
Trích:
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); } } }
__________________
viết chương trình cho vdk chạy ổn định là cả một vấn đề. |
|
![]() |
![]() |
![]() |
#3 |
Đệ tử 1 túi
Tham gia ngày: Jul 2011
Bài gửi: 25
: |
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 ![]() |
![]() |
![]() |
![]() |
#4 |
Đệ tử 1 túi
Tham gia ngày: Jul 2011
Bài gửi: 25
: |
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) ; } } } } 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ớ thay đổi nội dung bởi: levuphuong, 13-08-2011 lúc 08:30 PM. Lý do: biết thêm 1 điều ai cùng biết :) |
![]() |
![]() |
![]() |
#5 | |
Đệ tử 7 túi
Tham gia ngày: May 2005
Bài gửi: 258
: |
Trích:
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.
__________________
viết chương trình cho vdk chạy ổn định là cả một vấn đề. |
|
![]() |
![]() |
![]() |
#6 |
Đệ tử 1 túi
Tham gia ngày: Jul 2011
Bài gửi: 25
: |
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) ; } } } } Nó báo sẽ không ngắt khi chay hàm delay_ms Các bác giúp em với |
![]() |
![]() |
![]() |
#7 | |
Đệ tử 7 túi
Tham gia ngày: May 2005
Bài gửi: 258
: |
Trích:
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) ; } } } }
__________________
viết chương trình cho vdk chạy ổn định là cả một vấn đề. |
|
![]() |
![]() |
![]() |
#8 |
Đệ tử 1 túi
Tham gia ngày: Jul 2011
Bài gửi: 25
: |
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 ![]() |
![]() |
![]() |
![]() |
#9 |
Đệ tử 1 túi
Tham gia ngày: Jul 2011
Bài gửi: 25
: |
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 |
![]() |
![]() |
![]() |
#10 |
Đệ tử 1 túi
Tham gia ngày: Jul 2011
Bài gửi: 25
: |
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
![]() |
![]() |
![]() |
![]() |
#11 |
Đệ tử 5 túi
Tham gia ngày: Dec 2010
Bài gửi: 101
: |
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 |
![]() |
![]() |
![]() |
#12 | |
Đệ tử 7 túi
Tham gia ngày: May 2005
Bài gửi: 258
: |
Trích:
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; } } }
__________________
viết chương trình cho vdk chạy ổn định là cả một vấn đề. |
|
![]() |
![]() |
![]() |
#13 |
Đệ tử 1 túi
Tham gia ngày: Jul 2011
Bài gửi: 25
: |
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 đó |
![]() |
![]() |
![]() |
#14 |
Nhập môn đệ tử
Tham gia ngày: Jun 2011
Bài gửi: 3
: |
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ề .
![]() ![]() |
![]() |
![]() |
![]() |
#15 |
Đệ tử 1 túi
Tham gia ngày: Jul 2011
Bài gửi: 25
: |
cái chân câm lcd mà mắc thế á.mắc gần hơn cả testboard ?
![]() |
![]() |
![]() |
![]() |
|
|