View Single Post
Old 18-10-2013, 12:23 AM   #3
lilean
Nhập môn đệ tử
 
Tham gia ngày: Sep 2006
Bài gửi: 1
:
Mình chỉ sửa phần code nội dung thôi nhé, lâu ko làm Pic nên ko nhớ các flag bạn bật đã đúng chưa.
Theo mình hiểu thì ý bạn là:
- Khi nhấn nút RB0 rồi thả tay thì led7 sẽ đếm tiến từ biến đếm hiện tại tăng lên +1 và nếu đã tới 9 thì sẽ quay về 0
- Khi nhấn nút RC0 thì sẽ đếm lùi từ biến hiện tại giảm đi 1. và nếu đã đến 0 thì chuyển về 9.
Nếu mình hiểu ý bạn muốn như trên là đúng thì code sẽ thế này :


Trích:
Nguyên văn bởi linhnguyen93nb View Post
em xin đượ mô tả nguyên lý làm việc của nó như sau:
mạch em dùng 2 nút nhấn 1 nút nhân RB0 khi nhấn vào thì led 7 đoạn đếm số từ 0-9.
còn khi nhấn RC0 thì led 7 đoạn giảm xuống từ 9-0.
khi nhấn 1 trong 2 công tắc thi led chân RA0 sẽ sáng trong khoảng 5s rồi tắt.
em lập trình nó như sau:
anh chị coi sửa lại giùm em cái. em mới vào nghề nên phần này hơi kém.

#include <16f877a.h>
#fuses HS, NOWDT, NOPROTECT, NOLVP, NOBROWNOUT
#use delay(clock=1200000)
#use fast_io(b)
#use fast_io(d)
#use fast_io(c)
#byte portd=0x08
#byte portb=0x06
#byte portc=0x07
#bit dk=portb.0
#bit dk1=portc.0
unsigned char x = 0; // hạn chế dùng biến loại int nếu ko cần thiết
void hien(unsigned char z);
void khong_lam_viec();
void main()
{
set_tris_b(0b00000001);
set_tris_c(0b00000001);
set_tris_d(0b00000000);
unsigned char i =0, j = 0; // biến chạy

while(1)
{
if(dk==0)
{
if (++i >= 10) // đợi 10 chu kỳ code để loại bớt nhiễu nút ấn
{
i = 10; // giới hạn i để tránh tràn bít
}
}
else
if ( dk == 1)
{ if (i >=10)
{
if ( ++x > 9) // tăng biến giá trị tới 9 thì cho về 0
x = 0;

}
i = 0;
}
// nút ấn lùi
if(dk1==0)
{
if (++j >= 10) // đợi 10 chu kỳ code để loại bớt nhiễu nút ấn
{
j = 10; // giới hạn j để tránh tràn bít
}
}
else
if ( dk1 == 1)
{ if (j >=10)
{
if ( x >= 1 ) // tăng biến giá trị tới 9 thì cho về 0
x--
else x = 9;
}
j = 0;
}
hien(x);
}
}
void hien(unsigned char z)
{
switch(z)
{
case 0: {portd=0x3F; break;}
case 1: {portd=0x06; break;}
case 2: {portd=0x5B; break;}
case 3: {portd=0x4F; break;}
case 4: {portd=0x66; break;}
case 5: {portd=0x6D; break;}
case 6: {portd=0x7D; break;}
case 7: {portd=0x07; break;}
case 8: {portd=0x7F; break;}
case 9: {portd=0x6F; break;}
default: break;
}
delay_ms(5);
}
void khong_lam_viec(unsigned char z)
{
while(1)
{
hien(z);
}
}
mạch mô phỏng của nó:
https://mega.co.nz/#!Ap0VFayK!WIp4AG...umvZv69W9UW1wo
lilean vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn