PDA

View Full Version : lập trình cho pic bằng ngôn ngữ C


dacthuong
11-03-2010, 12:11 AM
Chào tất cả các bạn.
Mình đang học lập trình pic, mình đang tập viết một chương trình cho led 7 đoạn nhưng chưa chạy được. Mong các bạn giúp đỡ mình nhé.
Cảm ơn các bạn nhiều!
Đây là chương trình xuất led 7 đoạn ra portb, Các bạn xem có sai chỗ nào sửa dùm mình nhé.


#include<16f877A.h>
#fuses NOWDT,PUT,HS,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use fast_io(b)


const unsigned char ma7doan[10]={0xC0,0xF9,0xA4,0xB0,0x99,
0x92,0x82,0xF8,0x80,0x90};
int8 donvi; // khai bao kieu du lieu
int16 mdonvi;

void main()
{set_tris_B(0x00);
//xuat port b
while(1)
{for(donvi=0;donvi<10;donvi++);
{mdonvi=ma7doan[donvi]; // lay ma led
output_B(mdonvi);
delay_ms(100);
}
}

}

trai_xq
11-03-2010, 09:18 AM
Chào tất cả các bạn.
Mình đang học lập trình pic, mình đang tập viết một chương trình cho led 7 đoạn nhưng chưa chạy được. Mong các bạn giúp đỡ mình nhé.
Cảm ơn các bạn nhiều!
Đây là chương trình xuất led 7 đoạn ra portb, Các bạn xem có sai chỗ nào sửa dùm mình nhé.


#include<16f877A.h>
#fuses NOWDT,PUT,HS,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use fast_io(b)


const unsigned char ma7doan[10]={0xC0,0xF9,0xA4,0xB0,0x99,
0x92,0x82,0xF8,0x80,0x90};
int8 donvi; // khai bao kieu du lieu
int16 mdonvi;

void main()
{set_tris_B(0x00);
//xuat port b
while(1)
{for(donvi=0;donvi<10;donvi++);
{mdonvi=ma7doan[donvi]; // lay ma led
output_B(mdonvi);
delay_ms(100);
}
}

}

Cách lập trình của bạn rất đơn giản. Bạn sai ở chổ
while(1)
{for(donvi=0;donvi<10;donvi++);
{mdonvi=ma7doan[donvi]; // lay ma led
output_B(mdonvi);
delay_ms(100);
}
}
trong vòng for nếu bạn đặt dấu ; nghĩa là đoạn chương trình dưới sẽ không thực hiện theo vòng for đó. Cho nên ban bỏ dấu ; đó đi. Ngoài ra chương trình của bạn là dùng led7seg anot chung, catot điều khiển.

#include<16f877A.h>
#fuses NOWDT,PUT,HS,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use fast_io(b)


const unsigned char ma7doan[10]={0xC0,0xF9,0xA4,0xB0,0x99,
0x92,0x82,0xF8,0x80,0x90};
int8 donvi; // khai bao kieu du lieu
int16 mdonvi;

void main()
{set_tris_B(0x00);
//xuat port b
while(1)
{for(donvi=0;donvi<10;donvi++)
{mdonvi=ma7doan[donvi]; // lay ma led
output_B(mdonvi);
delay_ms(100);
}
}

}

dacthuong
12-03-2010, 10:02 AM
Chào các bạn. Mình gõ lại bài thầy làm nhưng khi cho mô phỏng thì mạch chạy không đúng( bài này dùng quét led). Mong các bạn sửa chỗ sai dùm mình với.
Cảm ơn các bạn nhiều!

#include<16f877A.h>
#fuses NOWDT,PUT,HS,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use fast_io(b)
#use fast_io(d)

const unsigned char ma7doan[10]={0xC0,0xF9,0xA4,0xB0,0x99,
0x92,0x82,0xF8,0x80,0x90};
int8 donvi,dem,chuc,i; // khai bao kieu du lieu
unsigned char mdonvi,mchuc;

void div_bcd(int tam)
{chuc=tam/10;
donvi=tam%10;
mchuc=ma7doan[chuc];
}

void hienthi()
{for(i=0;i<250;i++)
{output_b(mdonvi);
output_d(0xfe);
delay_ms(1);

output_b(mchuc);
output_d(0xfd);
delay_ms(1);
}
}

void main()
{set_tris_b(0x00);
set_tris_d(0x00);
while(1)
{for(dem=0;dem<100;dem++)
{div_bcd(dem);
hienthi();
}
}
}

trai_xq
12-03-2010, 06:46 PM
Chào các bạn. Mình gõ lại bài thầy làm nhưng khi cho mô phỏng thì mạch chạy không đúng( bài này dùng quét led). Mong các bạn sửa chỗ sai dùm mình với.
Cảm ơn các bạn nhiều!

#include<16f877A.h>
#fuses NOWDT,PUT,HS,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use fast_io(b)
#use fast_io(d)

const unsigned char ma7doan[10]={0xC0,0xF9,0xA4,0xB0,0x99,
0x92,0x82,0xF8,0x80,0x90};
int8 donvi,dem,chuc,i; // khai bao kieu du lieu
unsigned char mdonvi,mchuc;

void div_bcd(int tam)
{chuc=tam/10;
donvi=tam%10;
mchuc=ma7doan[chuc];
}

void hienthi()
{for(i=0;i<250;i++)
{output_b(mdonvi);
output_d(0xfe);
delay_ms(1);

output_b(mchuc);
output_d(0xfd);
delay_ms(1);
}
}

void main()
{set_tris_b(0x00);
set_tris_d(0x00);
while(1)
{for(dem=0;dem<100;dem++)
{div_bcd(dem);
hienthi();
}
}
}

Bài lập trình của bạn sai ở hàm hiển thị. Tuy nhiên lập trình như vậy còn lủng cũng quá. Tôi sửa bài của bạn lại như thế này:

#include <16f877A.h>
#fuses NOWDT,PUT,HS,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use fast_io(b)
#use fast_io(d)
byte const ma7doan[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x9 0};
void hienthi(int so)
{
int hc,hdv;
hc=so/10;
hdv=so%10;
//hien thi so hang chuc
output_low(pin_a4);//cho chan a4 xuong muc thap--->>>qua transitor(PNP)--->>>>tich cuc led hang chuc
output_high(pin_a5);//cho chan a4 len muc cao--->>>qua transitor(PNP)--->>>>khoa led hang don vi
output_b(ma7doan[hc]);//hien thi so hangf chuc da chuyen doi BCD
delay_ms(100);//thay doi tuy theo ban chon thach anh
//hien thi so hang don vi
output_high(pin_a4);
output_low(pin_a5);
output_b(ma7doan[hdv]);
delay_ms(100);
}

void main()
{
int8 count=0;
int8 i;
set_tris_b(0x00);
//set_tris_a(0x00);
while(1)
{
for(i=0;i<2;i++)//vong for de lap hien thi, de tao thoi` gian tre
{
hienthi(count);
count++;
if(count==10) count=0; //reset lai
}
}
}

chú ý: bài này led hàng chuc được nối với RA4, led hàng đơn vị nối với RA5 qua transitor loại pnp(tíc cực múc 0). port b nói với led7seg

ichitea606
27-11-2010, 09:05 AM
bạn TRAI_XQ ơi cho mình hỏi cái này nha
mình đang viết đo hiển thị nhiệt độ trên LCD nhưng cần thêm 2 nút nhấn tăng giảm đễ hiển thị nhiệt độ trên LCD vỉ đó là nhiệt độ cài đặt để báo cháy. nhưng không biết làm sao để nhấn nút tăng giảm dc mong bạn chỉ giúp

ichitea606
27-11-2010, 10:06 AM
và đây là code chỉnh nút tăng vì toàn bộ truong trình thì dài quá. Nếu xong ai quan tâm mình post toàn bộ
#include <16F877A.h>
#include <DEF_16F877A.h>
#device *=16 adc=8
#fuses NOWDT,NOPROTECT,NOLVP,HS,NOPUT,NODEBUG, NOBROWNOUT,NOCPD, NOWRT
#use delay(clock=20000000)
#define RS RB0
#define RW RB1
#define E RB2
#define LED RB3

#define LCD PORTC
#define TANG rd0

unsigned char CD[]="N_DO BAO:";
unsigned char so[]="0123456789";
int8 I,CHUC,DV,BIEN;

void CONTROL(void)
{
RS = 0;
RW = 0;
E = 1;
E = 0;
delay_ms(1);
}

void WRITE(void)
{
RS = 1;
RW = 0;
E = 1;
E = 0;
delay_ms(1);
}

// KHOI TAO LCD

void main(void)
{
set_tris_B(0);
set_tris_C(0);
set_tris_D(0xff);

delay_ms(100);

LCD = 0x38;
CONTROL();
LCD = 0x0C;
CONTROL();

WHILE(TRUE)

{
bien=0;
delay_ms(10);

if(tang==0)
{
delay_ms(50);

while(tang==0)
{
CONTINUE ;
};
bien++;
}
CHUC=BIEN/10;
DV =BIEN%10;

LCD = 0xC0;
CONTROL();

i=0;
while (i<=8)
{
LCD = CD[i];
WRITE();
i++;
}
LCD = 0xCA;
CONTROL();
LCD = so[chuc];
WRITE();
LCD = so[dv];
WRITE();
}

}