PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và PIC

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 14-02-2011, 09:08 AM   #1
kiemkhach10
Đệ tử 5 túi
 
Tham gia ngày: Jan 2010
Bài gửi: 114
:
cách tiết kiệm chân vdk(quái dị và độc đáo của bác BINH ANH)

với cách mắc này thì cách bắt phím như thế nào nhỉ các bác?( bắt các phím đơn và bắt nhiều phím một lúc)
cám ơn các bác!
Hình Kèm Theo
File Type: jpg machhay.jpg (136.6 KB, 24 lần tải)
kiemkhach10 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 14-02-2011, 11:24 AM   #2
hoc_picpicpic
Đệ tử 6 túi
 
Tham gia ngày: Feb 2009
Bài gửi: 127
:
Trích:
Nguyên văn bởi kiemkhach10 View Post
với cách mắc này thì cách bắt phím như thế nào nhỉ các bác?( bắt các phím đơn và bắt nhiều phím một lúc)
cám ơn các bác!
mình ý kiến thế này xem có đúng ko nhé.

khi thực hiện quét 4 led 7 thanh thì fai mất 4 chân để điều khiển Q1,Q2,Q3,Q4 .
giả sử Q1,Q2,Q3,Q4 được điều khiển bởi RB1,RB2,RB3,RB4 . còn chỗ con trở R5(Keyboard out 1port) được nối với RB5 .

để phát hiện phím đc nhấn thì thực hiện như sau :

Cho RB1=1 đọc RB5 nếu RB5 = 1 -> phím S1 đc nhấn .Đồng thời xuất tín hiệu ra led
Cho RB2=1 đọc RB5 nếu RB5 = 1 -> phím S2 đc nhấn .Đồng thời xuất tín hiệu ra led
Cho RB3=1 đọc RB5 nếu RB5 = 1 -> phím S3 đc nhấn .Đồng thời xuất tín hiệu ra led
Cho RB4=1 đọc RB5 nếu RB5 = 1 -> phím S4 đc nhấn .Đồng thời xuất tín hiệu ra led
hoc_picpicpic vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 14-02-2011, 12:35 PM   #3
kiemkhach10
Đệ tử 5 túi
 
Tham gia ngày: Jan 2010
Bài gửi: 114
:
Trích:
Nguyên văn bởi hoc_picpicpic View Post
mình ý kiến thế này xem có đúng ko nhé.

khi thực hiện quét 4 led 7 thanh thì fai mất 4 chân để điều khiển Q1,Q2,Q3,Q4 .
giả sử Q1,Q2,Q3,Q4 được điều khiển bởi RB1,RB2,RB3,RB4 . còn chỗ con trở R5(Keyboard out 1port) được nối với RB5 .

để phát hiện phím đc nhấn thì thực hiện như sau :

Cho RB1=1 đọc RB5 nếu RB5 = 1 -> phím S1 đc nhấn .Đồng thời xuất tín hiệu ra led
Cho RB2=1 đọc RB5 nếu RB5 = 1 -> phím S2 đc nhấn .Đồng thời xuất tín hiệu ra led
Cho RB3=1 đọc RB5 nếu RB5 = 1 -> phím S3 đc nhấn .Đồng thời xuất tín hiệu ra led
Cho RB4=1 đọc RB5 nếu RB5 = 1 -> phím S4 đc nhấn .Đồng thời xuất tín hiệu ra led
đúng là như vậy đấy.nhưng có một vấn đề là tốc độ quét LED(Q1,Q2,Q3,Q4) là rất nhanh.nên
giả sử(RB1=1,RB5=1=> phím s1 được bấm.nhưng khoảng mấy microgiay sau đó lại quét đến RB1=1,RB5=1=> s1 lại được bấm) do đó phím sẽ bị trôi rất nhiều,có bạn nào có cách chống trôi phím hay phuơng pháp nào khác để giải quyết vấn đề này ko?
cám ơn nhiều!
kiemkhach10 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 14-02-2011, 01:05 PM   #4
hoc_picpicpic
Đệ tử 6 túi
 
Tham gia ngày: Feb 2009
Bài gửi: 127
:
tốc độ quet càng cao thì phím càng nhậy, còn vấn đề trôi như bạn nói thì giải quyết = cách lập trình phát hiện theo sườn lên giống như bạn lập trình ngắt ngoài xảy ra khi có sườn lên(ring edge),nhưng khác 1 chút là ngắt ngoài đc phát hiện = phần cứng có sẵn trong pic còn ở đây bạn phải viết chương trình thay cho phần cứng đó

thay đổi nội dung bởi: hoc_picpicpic, 14-02-2011 lúc 01:21 PM.
hoc_picpicpic vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 14-02-2011, 02:34 PM   #5
kiemkhach10
Đệ tử 5 túi
 
Tham gia ngày: Jan 2010
Bài gửi: 114
:
Trích:
Nguyên văn bởi hoc_picpicpic View Post
tốc độ quet càng cao thì phím càng nhậy, còn vấn đề trôi như bạn nói thì giải quyết = cách lập trình phát hiện theo sườn lên giống như bạn lập trình ngắt ngoài xảy ra khi có sườn lên(ring edge),nhưng khác 1 chút là ngắt ngoài đc phát hiện = phần cứng có sẵn trong pic còn ở đây bạn phải viết chương trình thay cho phần cứng đó
bạn có thể chỉ giúp mình cách lập trình để chống trôi phím đươc ko?
cái này mình chưa làm bao giờ lên mình ko bít.(có thể port đoạn code quét phím thì càng tốt)
cám ơn bạn nhiều!
kiemkhach10 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-02-2011, 01:23 PM   #6
hoc_picpicpic
Đệ tử 6 túi
 
Tham gia ngày: Feb 2009
Bài gửi: 127
:
int1 bt1=0; // bien toan cuc

if( (RB5==1) && (RB1==1) )
{
if( bt1 == 0 )
{
bt1 = 1;

// code thực hiện phím nhấn ở đây

};
}
else
{
bt1 = 0;
}
hoc_picpicpic vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-02-2011, 05:50 PM   #7
kiemkhach10
Đệ tử 5 túi
 
Tham gia ngày: Jan 2010
Bài gửi: 114
:
Trích:
Nguyên văn bởi hoc_picpicpic View Post
int1 bt1=0; // bien toan cuc

if( (RB5==1) && (RB1==1) )
{
if( bt1 == 0 )
{
bt1 = 1;

// code thực hiện phím nhấn ở đây

};
}
else
{
bt1 = 0;
}
cám ơn bạn nhưng mình làm theo cách của bạn ko được.vì theo mình nghĩ đây là quét phím do đó phím =0 và bằng 1 liên tục khi quét LED 7 thanh
bạn xem co cách nào khác ko?
cám ơn!
kiemkhach10 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-02-2011, 05:23 PM   #8
NTL22
Nhập môn đệ tử
 
Tham gia ngày: Feb 2011
Bài gửi: 4
:
chao ban.ban cho minh hoi.
dung pic16f877 thiet ke plc co 16 dau vao so va 16 dau ra so
mong ban giup do nhe
NTL22 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 18-02-2011, 03:36 PM   #9
nhanh0112
Đệ tử 4 túi
 
Tham gia ngày: May 2007
Bài gửi: 81
:
Thumbs up

Trích:
Nguyên văn bởi kiemkhach10 View Post
với cách mắc này thì cách bắt phím như thế nào nhỉ các bác?( bắt các phím đơn và bắt nhiều phím một lúc)
cám ơn các bác!
Mình viết lại đoạn code lấy từ trang chaokhun và có chỉnh sửa một chút nhé
Nếu bạn sử dụng thì chỉnh sửa lại cho phù hợp (ở đây mình chỉ viết dưới dạng thuật toán)
Code:
key[]=-1//xoa mang key[] ve -1
for(i=0;i<4;i++)  /* 4-DIGIT scanning */
    {
    position = digit;
    bus_led = buffer[i];//data_led
    delay_ms(5)
    bus_led = off;
    /*phan lay ma phim*/
    if (RB5==1)
        key[i] = 1; //cac phim dc bam se dc set len 1 trong mang key
        
    digit<<=1;
    }
    
if (key[] != -1)//kiem tra mang key[i], co cai nao khac -1 thi thuc hien
    {
    if(flag1== 0)
      	{
        flag1=1;
        delay = 50;//thiet lap thoi gian delay phim
        for(i=0;i<4;i++)
            {
            switch(key[i])
              {
              case (0): /* key position 0*/
              break;
              case (1): /* key position 1*/
              break;
              case (2): /* key position 2*/
              break;
              case (3): /* key position 3*/
              break;
              }
            }
        }
    }
if (flag1 !=0)//sau khi bam nut thi delay phim
    {
    delay--;
    if(delay==0)flag1=0;
    }
tham khảo http://www.kmitl.ac.th/~kswichit/clock/clock.htm

thay đổi nội dung bởi: nhanh0112, 18-02-2011 lúc 03:49 PM.
nhanh0112 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 18-02-2011, 09:41 PM   #10
kiemkhach10
Đệ tử 5 túi
 
Tham gia ngày: Jan 2010
Bài gửi: 114
:
Trích:
Nguyên văn bởi nhanh0112 View Post
Mình viết lại đoạn code lấy từ trang chaokhun và có chỉnh sửa một chút nhé
Nếu bạn sử dụng thì chỉnh sửa lại cho phù hợp (ở đây mình chỉ viết dưới dạng thuật toán)
Code:
key[]=-1//xoa mang key[] ve -1
for(i=0;i<4;i++)  /* 4-DIGIT scanning */
    {
    position = digit;
    bus_led = buffer[i];//data_led
    delay_ms(5)
    bus_led = off;
    /*phan lay ma phim*/
    if (RB5==1)
        key[i] = 1; //cac phim dc bam se dc set len 1 trong mang key
        
    digit<<=1;
    }
    
if (key[] != -1)//kiem tra mang key[i], co cai nao khac -1 thi thuc hien
    {
    if(flag1== 0)
      	{
        flag1=1;
        delay = 50;//thiet lap thoi gian delay phim
        for(i=0;i<4;i++)
            {
            switch(key[i])
              {
              case (0): /* key position 0*/
              break;
              case (1): /* key position 1*/
              break;
              case (2): /* key position 2*/
              break;
              case (3): /* key position 3*/
              break;
              }
            }
        }
    }
if (flag1 !=0)//sau khi bam nut thi delay phim
    {
    delay--;
    if(delay==0)flag1=0;
    }
tham khảo http://www.kmitl.ac.th/~kswichit/clock/clock.htm
cám ơn bạn rất nhiều,mình đã tìm cái này liên tục gần 2 tháng nay rùi mệt mỏi vô cùng.
bạn có thể để lại yahoo hoặc mail để có gì thì mình trao đổi được ko?
p/s:theo mình hiểu thì mảng key[]={0,1,2,3}
thế dòng lệnh này mình ko hiểu lém:key[]=-1//xoa mang key[] ve -1
giá trị của mảng =-1 khi nào?
cám ơn!

thay đổi nội dung bởi: kiemkhach10, 18-02-2011 lúc 09:52 PM.
kiemkhach10 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 18-02-2011, 11:01 PM   #11
nhanh0112
Đệ tử 4 túi
 
Tham gia ngày: May 2007
Bài gửi: 81
:
Trích:
Nguyên văn bởi kiemkhach10 View Post
cám ơn bạn rất nhiều,mình đã tìm cái này liên tục gần 2 tháng nay rùi mệt mỏi vô cùng.
bạn có thể để lại yahoo hoặc mail để có gì thì mình trao đổi được ko?
p/s:theo mình hiểu thì mảng key[]={0,1,2,3}
thế dòng lệnh này mình ko hiểu lém:key[]=-1//xoa mang key[] ve -1
giá trị của mảng =-1 khi nào?
cám ơn!
Cái đoạn đó mình viết hơi vắn tắt quá. Nghĩa là bạn phải xóa các giá trị nó đã lưu từ lần trước đó đi. viết đầy đủ sẽ là:
Code:
for(i=0;i<4;i++)
    {
    k[i]=-1;
    }
Thực tế bạn có thể thiết lập bằng giá trị ban đầu là 0 cũng đc. Giá trị này dùng để xác định xem nút có đc bấm không (đc bấm thì khác 0 và ngược lại).
Bạn có thể khai báo mảng key[] theo kiểu:
Code:
unsigned int8 key[4]; //mảng key với 4 phần tử
như bình thường thôi.
YM/Email của mình là nhanh0112@yahoo.com
nhanh0112 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 21-03-2011, 12:38 PM   #12
mini_2440
Đệ tử 1 túi
 
Tham gia ngày: Mar 2011
Bài gửi: 21
:
Cảm ơn bạn nhiều nhé, mình đang rất cần
mini_2440 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 09:01 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam