1. Chương trình điều khiển các led đơn nối với PORTB nhấp nháy
//Chuong trinh dieu khien cac led don noi voi PORTB nhap nhay
#include "16f877a.h" //file dinh nghia cac thanh ghi, cac hang so cua PIC
#fuses NOLVP, NOWDT //ko nap chuong trinh o dien the thap, khong su dung
#use delay(clock=4Mhz) //khai bao su dung tan so thach anh 4Mhz
void main(void) //bat dau chuong trinh chinh
{
set_tris_B(0x0); //xac lap PORT B la dau ra (thanh ghi TRISB)
//TRISB=0x0: dau ra, TRISB=0b11111111 dau vao
while(true)
{
output_B(0); //xuat ra cac chan cua PORTB muc 0
delay_ms(100); //tre mot khoang thoi gian de quan sat
output_B(0xff); //xuat muc 1 ra cac chan cua PORTB
delay_ms(100); //tre mot khoang thoi gian de quan sat
}
}
2.Chương trình điều khiển các led đơn nối với PORTB sáng dần
//sang dan bat dau tu RB0 den RB7
#include "16F877A.h"
#FUSES HS, NOWDT, NOLVP
//HS: su dung thach anh tan so cao >4Mhz
//NOWDT: khong su dung Watchdog
//NOLVP: khong su dung nap dien ap thap
#use delay(clock=4Mhz) //su dung thach anh tan so 12Mhz
void main(void)
{
unsigned int8 x=0; //khai bao bien x 8bit, khong dau
set_tris_B(0); //xac lap PORTB la dau ra
while(true)
{
x=0;
output_B(0); //tat het cac led noi voi PORTB
delay_ms(200); //tre mot khoang thoi gian de quan sat
lap:
x<<=1; //dich trai bien x mot bit
x|=1; //hoac muc bit bien x voi gia tri 1 (dua bit so 0 len
//muc 1
output_B(x); //xuat gia tri cua x ra portb
delay_ms(200);
if(x!=0xff) goto lap; //kiem tra neu x<>=0xff thi lap lai
}
}
3. Chương trình điều khiển led 7 đoạn nối với PORTB hiển thị số từ 0-9
#include "16f877a.h"
#fuses HS,NOLVP, NOWDT
#use delay(clock=4Mhz)
const char ma7d[10]={0xc0, 0xf9,
0xa4, 0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void main()
{
char i=0;
set_tris_B(0);
while(true)
{
for(i=0;i<10;i++)
{
output_B(ma7d[i]);
delay_ms(200);
}
}
}
4. Chương trình điều khiển 2 led 7 đoạn nối song song với PORTB hiển thị số từ 0-
99
#include <16f877A.h>
#fuses NOWDT,PUT,HS,NOPROTECT,NOLVP
#use delay(clock=4Mhz)
#use fast_io(b)
const int8 ma7doan[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
void hienthi(int8 so)
{
int8 i, hc,hdv;
hc=so/10;
hdv=so%10;
for(i=0;i<50;i++)
{
//hien thi so hang don vi
output_high(pin_a1);
output_b(ma7doan[hdv]);
output_low(pin_a0);
delay_ms(10);
//hien thi so hang chuc
output_high(pin_a0);
output_b(ma7doan[hc]);
output_low(pin_a1);
delay_ms(10);
}
}
void main()
{
int8 count=0;
set_tris_b(0x00); //xac lap PORTB la dau ra
set_tris_a(0x0); //xac lap PORTA la dau ra
while(true)
{
hienthi(count);
count++;
if(count==100) count=0;
}
}
5. Chương trình đếm xung ngoài đưa tới chân RA4 hiển thị số đếm từ 0-200 trên
các led đơn nối với PORTC sử dụng timer0 với chức năng counter
/*chuong trinh dem xung ngoai dua toi chan RA4 hien thi so dem
tren cac led don noi voi PORTC*/
#include "16F877A.h"
#fuses NOWDT, NOLVP, HS
#bit TRISA4 =0x85.4
void main(void)
{
char x=0;
set_tris_C(0); //xac lap PORTC la dau ra
TRISA4=1; //xac lap RA4 la dau vao
output_C(0xff);
/*xac lap timer0 lam chuc nang counter, dem xung tai suon
xuong, khong su dung bo chia tan*/
setup_timer_0(T0_EXT_H_TO_L|T0_DIV_1);
set_timer0(0); //xac lap so dem ban dau
//cho counter
while(true)
{
x=get_timer0(); //doc so dem cua counter
output_C(x); //xuat gia tri doc duoc ra PORTC
if(x>=201) set_timer0(0);
}
}
6. Chương trình đếm xung ngoài đưa tới chân RA4 hiển thị số đếm từ 0-99 trên 2
led 7 đoạn (anode chung) nối song song với PORTB. Chân RA0 và RA1 lần lượt
quét led hàng đơn vị và hàng chục
/*chuong trinh dem xung ngoai dua toi chan RA4 su dung counter0
cac chan a,b, ,f cua 2 led 7 doan (anode chung)noi song song
voi RB0,RB1 RB6
chan RA0 quet led hang don vi, RA1 quet led hang chuc
xung dua vao chan RA4*/
#include "16F877A.h"
#fuses NOWDT, NOLVP, XT
#use delay(clock=4Mhz)
//tich cuc muc thap
const char ma7doan[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void hienthi(int8 chuc,int8 dv);
void main(void)
{
int8 x=0,chuc,dv;
set_tris_B(0); //xac lap PORTB la dau ra
output_drive(pin_A0); //xac lap RA0 la dau ra
output_drive(pin_A1); //xac lap RA1 la dau ra
output_float (pin_A4); //xac lap RA4 la dau vao
output_B(0xff); //tat het cac led (led anode chung)
setup_timer_0(T0_EXT_H_TO_L|T0_DIV_1); //xac lap cho timer0 la
bo dem xung ngoai
set_timer0(0); //xac lap cho timer0 dem xung tu 0
while(true)
{
x=get_timer0(); //doc gia tri hien tai cua timer0
chuc=x/10;
dv=x%10;
hienthi(chuc,dv);
if(x>=100) set_timer0(0);
}
}
void hienthi(int8 chuc,int8 dv)
{
output_B(ma7doan[chuc]); //giai ma hang chuc va xuat ra portB
output_low(pin_A1); //cho led hang chuc dan
delay_ms(2);
output_high(pin_A1); //cam led hang chuc
output_B(ma7doan[dv]); //giai ma hang don vi va xuat ra portc
output_low(pin_A0); //cho led hang don vi dan
delay_ms(2);
output_high(pin_A0); //cam led hang don vi dan
}
7 Chương trình tạo xung vuông có chu kỳ T=0.01 giây, độ rỗng 50%, sử dụng thạch
anh tần số 4Mhz
//Chu thich:
//Chuong trinh su dung timer0
//De tao thoi gian 0.05 giay timer can dem duoc (4*10^6/4)*0.05=5*10^4 so dem
//Goi so dem trong 1 lan tran la x
//So lan tran la y
//Chia tan z thi x*y*z=50.000
//Chon z=16, x=125 thi y=25
//============================================================
#include "16f877a.h"
#fuses NOWDT, NOLVP, XT, NOPROTECT
#bit TMR0IF = 0x0b.2
void main(void)
{
unsigned int8 y=0;
output_drive(PIN_B0); //xac lap RB0 la dau ra
setup_timer_0(T0_internal|T0_DIV_16);//timer0 chuc nang timer, chia tan 16
set_timer0(-125); //xac lap so dem ban dau cua timer
while(true)
{
if(TMR0IF==1)
{
TMR0IF=0;
set_timer0(-125);
y++;
if(y==25)
{
y=0;
output_toggle(PIN_B0);
}
}
}
}
8 Chương trình đếm giây từ 0-59 hiển thị trên 2 led 7 đoạn nối song song với
PORTC, chân RB0 và RB1 quét led. Tần số thạch anh sử dụng 4Mhz
//Chu thich:
// Chuong trinh su dung timer0
// De tao thoi gian 1 giay timer tuong duong voi 10^6 chu ky may
// Goi so dem trong 1 lan tran la x
// So lan tran la y
// Chia tan z thi x*y*z=1.000.000 chu ky may
// Chon z=64, x=125 thi y=125
//============================================================
#include "16f877a.h"
#use delay(clock=4Mhz)
//khai bao bang ma
const char
ma7doan[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//tich cuc muc
thap
char lantran=0,giay=0;
//chuong trinh phuc vu ngat timer0
#int_TIMER0
void ngat_timer0(void)
{
lantran++;
set_timer0(-125);
if(lantran==125)
{
lantran=0;
giay++;
if(giay==60) giay=0;
}
}
//chuong trinh chinh
void main(void)
{
//xac lap timer0
setup_timer_0(T0_internal|T0_DIV_64);
set_timer0(-125);
//cho phep ngat timer0 dem tran
enable_interrupts(Global);
enable_interrupts(int_timer0);
clear_interrupt(int_timer0);
//xac lap cho PORTC va PIN_B0,PIN_B1 la dau ra
set_tris_c(0);
output_drive(pin_B0);
output_drive(pin_B1);
while(true)
{
output_C(ma7doan[giay/10]);
output_high(PIN_B0);
output_low(PIN_B1);
delay_ms(20);
output_high(PIN_B1);
output_C(ma7doan[giay%10]);
output_low(PIN_B0);
delay_ms(20);
output_high(PIN_B0);
}
}
9 Chương trình đếm xung ngoài đưa tới chân RB0 (chân ngắt ngoài) hiển thị số đếm
từ 0-99 trên các led đơn nối với PORTC
/*Chuong trinh dem xung ngoai dua toi chan RB0(chan ngat ngoai). Hien thi so dem
tu 0-99 tren cac led don noi voi cong C*/
#include "16f877a.h"
#include "def_16F877a.h"
static char i=0;
/*chuong trinh con phuc vu ngat ngoai*/
#int_EXT
void EXT_isr(void)
{
i++;
}
/*chuong trinh chinh*/
void main(void)
{
set_tris_C(0); //xac lap portc la dau ra
output_float(PIN_B0); //xac lap chan RB0 la dau vao
enable_interrupts(GLOBAL); //cho phep ngat
enable_interrupts(INT_EXT); //cho phep ngat ngoai
ext_int_edge(INT_EXT,H_TO_L);
while(true)
{
output_c(i);
if (i==100 ) i=0;
}
}
10 Chương trình đếm xung ngoài đưa tới chân RC0/T1CKI (chân đầu vào timer1)
hiển thị số đếm từ 0-200 trên các led đơn nối với PORTB sử dụng timer1 với chức
năng counter
//Chu thich:
//chuong trinh su dung timer1 voi chuc nang counter dem xung ngoai
//============================================================
#include "16f877a.h"
#fuses NOWDT, NOLVP, HS
void main(void)
{
int16 i=0;
//xac lap cho PORTB la dau ra
set_tris_B(0);
output_B(0);
/*Su dung timer1: chuc nang counter (TMR1CS=1)
Chia tan 1 (T1CKPS1:T1CKPS0=00)
Cho phep hoat dong TMR1ON=1*/
setup_timer_1(T1_external|T1_DIV_BY_1);
set_timer1(0); //xac lap so dem ban dau cua timer1
while(true)
{
i=get_timer1();
if(i==200)
{
set_timer1(0);
i=0;
}
output_B(i);
}
}
11- Cảnh báo nhiệt độ hiển thị lên led7 đoạn
#INCLUDE <16F877A.H>
#FUSES NOWDT,NOPROTECT,NOLVP,XT,PUT
#DEVICE 16F877*=16 ADC=10
#USE DELAY(CLOCK=4000000)
#USE FAST_IO(E)
#BYTE PORTE=0X09
#USE FAST_IO(B)
#BYTE PORTB=0X06
#BIT RE0=PORTE.0
#BIT RE1=PORTE.1
#use fast_io(d)
#byte portd=0x08
#bit rd0=portd.0
INT X,i,CHUC,DONVI;
INT A[10]={192,249,164,176,153,146,130,248,128,144};
void DOC_ADC();
void HIENTHI();
//============
VOID MAIN()
{ SET_TRIS_E(0);
SET_TRIS_B(0);
SET_TRIS_D(0);
WHILE(1)
while (1)
{
DOC_ADC();
X=READ_ADC();
if (X>=40)//nhiet 20 do > canh bao
{X=X*0.4883;
HIENTHI();
RD0=1;
}
else
{
X=X*0.4883;
HIENTHI();
RD0=0;
}
}
}
void DOC_ADC()
{
SETUP_ADC(ADC_CLOCK_DIV_2);// CHON TAN SO CHUYEN DOI
SETUP_ADC_PORTS(AN0);//CHON SO NGO VAO
SET_ADC_CHANNEL(0);// CHON NGO VAO CU THE
DELAY_US(800);// TAO TRE
}
void HIENTHI()
{ CHUC=X/10;
DONVI=X%10;
RE0=0; RE1=1;
PORTB=A[DONVI];
DELAY_MS(10);
RE0=1; RE1=0;
PORTB=A[CHUC];
DELAY_MS(10);
}
12- Cảnh báo nhiệt độ hiển thị lên LCD >20* đèn sáng
#INCLUDE <16F877A.H>
#FUSES NOWDT,NOPROTECT,NOLVP,XT,PUT
#DEVICE 16F877A*=16 ADC=10
#USE DELAY(CLOCK=4000000)
#USE FAST_IO(A)
#BYTE PORTA=0x05
#USE FAST_IO(B)
#BYTE PORTB=0x06
#USE FAST_IO(D)
#BYTE PORTD=0x08
#BIT RS=PORTD.0
#BIT RW=PORTD.1
#BIT E=PORTD.2
#bit rd3=PORTD.3
INT X,CHUC,DONVI,TRAM,k;
INT A[10]={48,49,50,51,52,53,54,55,56,57};
VOID KHOITAO();
VOID HIENTHI();
VOID DOC_ADC();
void bentrong();
VOID MAIN()
{
SET_TRIS_B(0);
SET_TRIS_D(0B000);
PORTB=0X01;
KHOITAO();
PORTB=0X0C;
KHOITAO();
PORTB=0X38;
KHOITAO();
PORTB='T';// neu viet chu thi de? chu~ o trong da'u '' //vd : 'T'
HIENTHI();
PORTB=0X52;// su dung bang ma ascii 52_hex tuong duong voi chu~ "R"
HIENTHI();
PORTB=0X41;
HIENTHI();
PORTB=0X4E;
HIENTHI();
PORTB=0X20;
HIENTHI();
PORTB=0X43;
HIENTHI();
PORTB=0X4F;
HIENTHI();
PORTB=0X4E;
HIENTHI();
PORTB=0X47;
HIENTHI();
PORTB=0X20;
HIENTHI();
PORTB=0X4C;
HIENTHI();
PORTB=0X4F;
HIENTHI();
PORTB=0X43;
HIENTHI();
WHILE(1)
{
DOC_ADC();
X=READ_ADC();
if(X>40)
{ X=X*0.4883;
bentrong();
rd3=1;
}
else
{ X=X*0.4883;
bentrong();
rd3=0;
}
}
}
//==============================
VOID KHOITAO()
{ E=1; //TAO XUNG KICH
RS=0; //BUS NOI THANH GHI IR
RW=0; //CHE DO GHI DU LIEU
E=0; //TAO XUNG KICH
DELAY_MS(3);
}
//==============================
VOID HIENTHI()
{ E=1;
RS=1; //BUS NOI THANH GHI DR
RW=0;
E=0;
DELAY_MS(3);
}
//==============================
void DOC_ADC()
{
SETUP_ADC(ADC_CLOCK_INTERNAL);
SETUP_ADC_PORTS(AN0);
SET_ADC_CHANNEL(0);
DELAY_US(800);
}
//==============================
void bentrong()
{ TRAM=X/100;
CHUC=X%100/10;
DONVI=X%10;
PORTB=0XC0;
KHOITAO();
PORTB=0X4E;
HIENTHI();
PORTB=0X48;
HIENTHI();
PORTB=0X49;
HIENTHI();
PORTB=0X45;
HIENTHI();
PORTB=0X54;
HIENTHI();
PORTB=0X20;
HIENTHI();
PORTB=0X44;
HIENTHI();
PORTB=0X4F;
HIENTHI();
PORTB=0X3A;
HIENTHI();
PORTB=0X20;
HIENTHI();
PORTB=A[TRAM];
HIENTHI();
PORTB=A[CHUC];
HIENTHI();
PORTB=A[DONVI];
HIENTHI();
PORTB=223;
HIENTHI();
PORTB=0X43;
HIENTHI();
}
13-Ngắt ngoài
#include <16f877a.h>
#FUSES NOWDT, HS, NOPUT,NOPROTECT, NODEBUG, NOBROWNOUT,
NOLVP, NOCPD
#use delay(clock=40000000)
int
led7doan[10]={0b11000000,0b11111001,0b10100100,0b10110000,0b10011001,0b10
010010,
0b10000010,0b11111000,0b10000000,0b10010000};// ma led ung voi cac chan theo
tuan tu
int a=0;
#int_ext
void ngat_ngoai()
{
a=a+1;
if (a>9)
{
a=0;
}
output_C(led7doan[a]);
}
void main()
{
ext_int_edge( H_TO_L );
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
while(true)
{
if (a==0)
{
output_C(led7doan[0]);
output_D(0b10101010);
}
else
if (a==1)
{
output_C(led7doan[1]);
output_D(0b00001111);
}
else if (a==2)
{
output_C(led7doan[2]);
output_D(0b11110000);
}
else if (a==3)
{
output_C(led7doan[3]);
output_D(0b10101010);
}
else if (a==4)
{
output_C(led7doan[4]);
output_D(0b01010101);
}
else if (a==5)
{
output_C(led7doan[5]);
output_D(0b11100111);
}
else if(a==6)
{
output_C(led7doan[6]);
output_D(0b11000011);
}
else if(a==7)
{
output_C(led7doan[7]);
output_D(0b10000001);
}
else if(a==8)
{
output_C(led7doan[8]);
output_D(0b11111111);
}
else if(a==9)
{
output_C(led7doan[9]);
output_D(0b00110011);
}
else
{
output_C(0xFF);
output_D(0b00000000);
}
;
}
}
14-Ngắt timer 0
#include <16F877A.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#use fast_io(b)
#byte portb=0x06
#define led pin_B0
int16 count;
int8 a;
//Chuong trinh ngat TMR0
#int_timer0
void interrupt_timer0()
{
if(count==2000)// 500us*2000=1s
{// sau 1s count lai =0 va dich sang trai 1 bit, led2_RB1 sang
count=0;
a=a<<1; // dich trai a 1bit
}
if(a==256)
{//den khi led 8_led cuoi cung sang thi quay lai led 0 sang, sau 1s count lai =0
a=1;
count=0;
}
count++;
}
//Chuong trinh chinh
main()
{
set_tris_b(0);
enable_interrupts(global);
enable_interrupts(int_timer0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
set_timer0(6); // 2*(256-6)us= 500us
count=0;
a=1; // led1_RB0 sang
while(true)
{
portb=a; // hien thi led tren portb
}
}
15-Ngắt RB1
#include <16f877a.h>
#fuses nowdt,noprotect,noput,xt,put
#use delay (clock=4000000)
#use fast_io(B)
#USE FAST_IO(D)
#Byte portB=0x06
#BYTE PORTD=0X08
INT I,J;
INT
A[10]={0b00111111,0b00000110,0b01011011,0b01001111,0b01100110,0b01101101,
0b01111101,0b00000111,0b011111111,0b01101111}; //bang ma led 7 doan loai
anode chung
// NGAT RB0
#int_ext
VOID NGAT_RB0()
{
I=4 ; //tac dong portb.0 , nhan nut led se bat dau tu so 4
}
// Chuong trinh chinh
VOID MAIN()
{ set_tris_b(0b00000001);
set_tris_d(0);
enable_interrupts(global);
enable_interrupts(int_ext);
ext_int_edge(H_to_L);
while(true)
{
IF(I<=9) // chay tu 0 >9
{ PORTD=A[I];
I++;
DELAY_MS(100);
}
else
i=0; // toi 9 nhay ve 0
}
}