PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > RTOS và Thuật toán với PIC

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

RTOS và Thuật toán với PIC RTOS và Các thuật toán dùng cho PIC/dsPIC/PIC32
Mod: phamminhtuan

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 13-12-2006, 01:27 PM   #1
picpicpic
Đệ tử 2 túi
 
picpicpic's Avatar
 
Tham gia ngày: Jan 2006
Bài gửi: 36
:
Các câu hỏi cần trả lời, thảo luận chung về thuật toán,...

Có anh em nào viết key scan 16 phím nhấn chưa ? Giúp tớ với !
__________________
************************************************** **
The only wrong thing would be to deny what your heart truly feels!
************************************************** **
picpicpic vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-01-2007, 01:37 AM   #2
hatuan296
Làm quen với PIC
 
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: Hcm
Bài gửi: 160
:
yêu cầu chương trình như thế nào ? bạn phải nói rõ thì mới có ph­ương án viết code chứ .
hatuan296 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-01-2007, 07:41 PM   #3
nhh
Đệ tử 9 túi
 
nhh's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 174
:
Send a message via Yahoo to nhh
Key debounce

Cơ bản nhưng dùng rất nhiều !
Lúc nhấn và buông phím sẽ bị rung, gây nhiễu.
Trường hợp pull-down tương tự.
__________________
Ngày mai bắt đầu từ ngày hôm nay

Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này:
http://www.picvietnam.com/forum//showthread.php?t=1263
nhh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-01-2007, 07:46 PM   #4
nhh
Đệ tử 9 túi
 
nhh's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 174
:
Send a message via Yahoo to nhh


Nhấn INC tăng 1 đơn vị trên led.DEC giảm 1 đơn vị
Code:
#include <16F877A.h>
#include <DEFS_16F877A.h>
#fuses   NOWDT,PUT,HS,NOPROTECT,NOLVP
#use     delay(clock = 10000000)
#define  LED_PORT   PORTD
#define  led_1      0b00001110
#define  led_2      0b00001101
#define  led_3      0b00001011
/*---------------------------------------------------------------------------------------------
Khai bao cac bien toan cuc
---------------------------------------------------------------------------------------------*/
const unsigned int digit[] = {0b00000000,0b00010000,0b00100000,0b00110000,0b01000000,
                              0b01010000,0b01100000,0b01110000,0b10000000,0b10010000};
int number,led_donvi_number,led_chuc_number,led_tram_number;
/*---------------------------------------------------------------------------------------------
Khai bao nguyen mau cac ham su dung
---------------------------------------------------------------------------------------------*/
void number_to_led_number(void);
void display(int led_i,int led_number);
void led_sweep(void);
/*---------------------------------------------------------------------------------------------
 Chuong trinh chinh
---------------------------------------------------------------------------------------------*/
void main(void)
{
   set_tris_B(0x03);                  // RB0 & RB1 la input
   set_tris_D(0x00);
   PORTD = 0x00;
   while(true)
   {
        if(!bit_test(PORTB,0))
        {
           led_sweep();               // ~12ms
           while(!bit_test(PORTB,0))
           {
             led_sweep();
           }
           led_sweep();               // ~12ms
           number++;
           number_to_led_number();
        }
        if(!bit_test(PORTB,1))
        {
           led_sweep();               // ~12ms
           while(!bit_test(PORTB,1))
           {
             led_sweep();
           }
           led_sweep();               // ~12ms
           number--;
           number_to_led_number();
        }
        led_sweep();
   }
}
/*---------------------------------------------------------------------------------------------
Ham chuyen tu number sang cac so tuong ung tren led
---------------------------------------------------------------------------------------------*/
void number_to_led_number(void)
{
  led_donvi_number = number % 10;
  led_chuc_number  = (number / 10) % 10;
  led_tram_number  = number / 100;
}
/*---------------------------------------------------------------------------------------------
Ham hien thi so "number" len ledi
---------------------------------------------------------------------------------------------*/
void display(int led_i,int led_number)
{
   LED_PORT = led_i|digit[led_number];
}
/*---------------------------------------------------------------------------------------------
Ham quet led
---------------------------------------------------------------------------------------------*/
void led_sweep(void)
{
 int loop;
 for(loop = 0;loop <= 3;loop ++)
   {
       display(led_1,led_tram_number);
       delay_ms(1);
       display(led_2,led_chuc_number);
       delay_ms(1);
       display(led_3,led_donvi_number);
       delay_ms(1);
   }
 }
File Kèm Theo
File Type: rar Key_debounce.rar (24.9 KB, 473 lần tải)
__________________
Ngày mai bắt đầu từ ngày hôm nay

Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này:
http://www.picvietnam.com/forum//showthread.php?t=1263
nhh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 23-01-2007, 11:57 AM   #5
nhh
Đệ tử 9 túi
 
nhh's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 174
:
Send a message via Yahoo to nhh
Key scan

Để quét và xác định phím nào trong ma trận phím được nhấn. Việc đầu tiên là làm cách nào để xác định đúng phím được nhấn,
sau đó là chống rung phím để chương trình thực thi đúng yêu cầu. Chống rung chẳng qua là tạo một khoảng thời gian delay cần
thiết để loại bỏ việc đọc nhầm trạng thái phím bị nảy mỗi khi nhấn và thả phím. Tùy theo độ cứng của từng loại phím nhấn mà khoảng thời gian này
khác nhau, thường từ 10 - 20ms.

Có nhiều cách, dưới đây là một cách:

- Khởi tạo hàng mức 0, cột mức 1
- Kiểm tra xem cột nào xuống mức 0, nếu ko có thì lặp lại
- Tạo trễ 10ms
- Kiểm tra lại xem cột nào xuống mức 0 có còn ở mức 0 ko, nếu ko quay lại bước 2
- Set mọi hàng lên mức 1, lần lượt cho từng cột xuống mức 0, kiểm tra xem hàng nào xuống mức 0
- Đợi đến khi thả phím
-Tạo trễ 10ms
- Xác định được phim ấn, thực thi yêu cầu
__________________
Ngày mai bắt đầu từ ngày hôm nay

Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này:
http://www.picvietnam.com/forum//showthread.php?t=1263
nhh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 23-01-2007, 12:01 PM   #6
nhh
Đệ tử 9 túi
 
nhh's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 174
:
Send a message via Yahoo to nhh
Code:
/**********************************************************************************************
* Mo ta     : Nhan phim ma tran phim, 8 led portD hien so tuong ung 0-15, so nay cung duoc goi
*             len may tinh bang giao tiep RS232
*----------------------------------------------------------------------------------------------
* Phan cung : PIC16F877A, thach anh 10MHz
*             ma tran phim noi voi portB, 8 led don noi voi portD qua tro han dong 220R
*             Pic giao tiep RS232 voi may tinh
*----------------------------------------------------------------------------------------------
* Nguoi viet: nhh
* Ngay viet : 12/11/06
* Trinh dich: CCS C v3.013
***********************************************************************************************/
#include  <DEFS_16F877A.h>
#fuses    NOWDT,PUT,HS,NOPROTECT,NOLVP
#use      delay(clock = 10000000)
#use      rs232(baud = 9600,xmit = pin_C6,rcv = pin_C7)
#define   key_port PORTB
#define   key_tris TRISB
#define   led_port PORTD
#define   led_tris TRISD
/*---------------------------------------------------------------------------------------------
 Khai bao bien toan cuc
---------------------------------------------------------------------------------------------*/
const unsigned char number[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

/*---------------------------------------------------------------------------------------------
 Khai bao nguyen mau cac ham su dung
---------------------------------------------------------------------------------------------*/
void column_check(unsigned char);
void key_scan(void);

/*---------------------------------------------------------------------------------------------
 Ham kiem tra hang nao trong cot column xuong 0
---------------------------------------------------------------------------------------------*/
void column_check(unsigned char column)
{
   switch(column)
   {
      case 0:
      {
         if(!bit_test(key_port,0))
         {
            while(!bit_test(key_port,0));
            delay_ms(10);
            led_port = number[0];
            printf("%u\n\r",led_port);
         }
         if(!bit_test(key_port,1))
         {
            while(!bit_test(key_port,1));
            delay_ms(10);
            led_port = number[1];
            printf("%u\n\r",led_port);
         }
         if(!bit_test(key_port,2))
         {
            while(!bit_test(key_port,2));
            delay_ms(10);
            led_port = number[2];
            printf("%u\n\r",led_port);
         }
         if(!bit_test(key_port,3))
         {
            while(!bit_test(key_port,3));
            delay_ms(10);
            led_port = number[3];
            printf("%u\n\r",led_port);
         }
      }
         break;
      case 1:
      {
         if(!bit_test(key_port,0))
         {
            while(!bit_test(key_port,0));
            delay_ms(10);
            led_port = number[4];
            printf("%u\n\r",led_port);
         }
         if(!bit_test(key_port,1))
         {
            while(!bit_test(key_port,1));
            delay_ms(10);
            led_port = number[5];
            printf("%u\n\r",led_port);
         }
         if(!bit_test(key_port,2))
         {
            while(!bit_test(key_port,2));
            delay_ms(10);
            led_port = number[6];
            printf("%u\n\r",led_port);
         }
         if(!bit_test(key_port,3))
         {
            while(!bit_test(key_port,3));
            delay_ms(10);
            led_port = number[7];
            printf("%u\n\r",led_port);
         }
      }
         break;
      case 2:
      {
         if(!bit_test(key_port,0))
         {
            while(!bit_test(key_port,0));
            delay_ms(10);
            led_port = number[8];
            printf("%u\n\r",led_port);
         }
         if(!bit_test(key_port,1))
         {
            while(!bit_test(key_port,1));
            delay_ms(10);
            led_port = number[9];
            printf("%u\n\r",led_port);
         }
         if(!bit_test(key_port,2))
         {
            while(!bit_test(key_port,2));
            delay_ms(10);
            led_port = number[10];
            printf("%u\n\r",led_port);
         }
         if(!bit_test(key_port,3))
         {
            while(!bit_test(key_port,3));
            delay_ms(10);
            led_port = number[11];
            printf("%u\n\r",led_port);
         }
      }
         break;
      case 3:
      {
         if(!bit_test(key_port,0))
         {
            while(!bit_test(key_port,0));
            delay_ms(10);
            led_port = number[12];
            printf("%u\n\r",led_port);
         }
         if(!bit_test(key_port,1))
         {
            while(!bit_test(key_port,1));
            delay_ms(10);
            led_port = number[13];
            printf("%u\n\r",led_port);
         }
         if(!bit_test(key_port,2))
         {
            while(!bit_test(key_port,2));
            delay_ms(10);
            led_port = number[14];
            printf("%u\n\r",led_port);
         }
         if(!bit_test(key_port,3))
         {
            while(!bit_test(key_port,3));
            delay_ms(10);
            led_port = number[15];
            printf("%u\n\r",led_port);
         }
      }
         break;
   }
}

/*---------------------------------------------------------------------------------------------
 Ham quet phim
---------------------------------------------------------------------------------------------*/
void key_scan(void)
{
   int count;
   for(count = 4;count <= 7; count++)
   {
      key_tris = 0xF0;                  // cot ngo vao, hang ngo ra
      key_port = 0xF0;                  // cot muc 1, hang muc 0
      if(!bit_test(key_port,count))     // cot count xuong 0 chua?
      {
         delay_ms(10);
         if(!bit_test(key_port,count))  // kiem tra lai cot count co xuong 0 ko?
         {
            key_tris = 0x0F;            // cot ngo ra, hang ngo vao
            key_port = 0xEF;            // cot 0 xuong 0
            column_check(0);
            key_port = 0xDF;            // cot 1 xuong 0
            column_check(1);
            key_port = 0xBF;            // cot 2 xuong 0
            column_check(2);
            key_port = 0x7F;            // cot 3 xuong 0
            column_check(3);
         }
      }
   }
}

/*---------------------------------------------------------------------------------------------
 Chuong trinh chinh
---------------------------------------------------------------------------------------------*/
void main(void)
{
   led_tris = 0x00;
   led_port = 0xFF;
   while(true)
   {
      key_scan();
   }
}
File Kèm Theo
File Type: rar Key_scan.rar (9.4 KB, 401 lần tải)
__________________
Ngày mai bắt đầu từ ngày hôm nay

Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này:
http://www.picvietnam.com/forum//showthread.php?t=1263
nhh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 21-08-2007, 11:22 PM   #7
Tuấn Anh CVN
Đệ tử 1 túi
 
Tham gia ngày: Jul 2007
Bài gửi: 15
:
Mình chưa bao giờ giao tiếp với bàn phím cả nhưng còn việc chống nảy hay deal with chattering thì mình cũng làm vài lần rồi. Ở các đoạn code trên mình thấy các bạn đều sử dụng delay để chống chattering thực sự mà nói thì cách này không chính xác lắm trong mọi thời điểm. Mình đã có lần được nghe qua một người Nhật trong lúc training H8 micro đã nói về cách chống chattering dùng cho máy in đó là sử dụng biến đếm count chứ không dùng delay. Sau này khi sử dụng count thay vì dùng delay mình thấy cách của người Nhật đó thật mới là cách tốt. Các bạn hãy thử cách xây dựng một hàm đại loại như sau:

bit checkbutton ()
{
unsigned int i=0;
while (input==1)
{
i++;
if (i>=precount) {return(1);goto exit;}
else return(0);
}
i=0; return(0);
exit:{}
}

//precount là giá trị đặt trước giới hạn cho biến đếm count
//input là đầu vào. Nếu ấn nút thì là 1
//hàm checkbutton sẽ chỉ trả về giá trị 1 khi ấn nút thực sự.

thay đổi nội dung bởi: Tuấn Anh CVN, 21-08-2007 lúc 11:42 PM. Lý do: post khi chưa viết xong
Tuấn Anh CVN vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-08-2007, 03:43 PM   #8
hanhluckyly
Đệ tử 4 túi
 
hanhluckyly's Avatar
 
Tham gia ngày: Mar 2006
Bài gửi: 83
:
Cách này cũng có thể dùng để quy định nhấn nút trong một khoảng thời gian xác định trước
hanhluckyly vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-08-2007, 12:27 AM   #9
nhunamcdt1
Nhập môn đệ tử
 
Tham gia ngày: Aug 2007
Bài gửi: 2
:
hoi

Anh nào giúp em viết bằng assem với
nhunamcdt1 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-08-2007, 12:31 AM   #10
nhunamcdt1
Nhập môn đệ tử
 
Tham gia ngày: Aug 2007
Bài gửi: 2
:
Anh nào giúp em viết bằng assem nếu ấn nút ấn sẽ thực hiện 1 chương trình nào đó,không ấn thì không làm gì cả
nhunamcdt1 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 25-08-2007, 09:09 AM   #11
Jerry
Đệ tử 5 túi
 
Jerry's Avatar
 
Tham gia ngày: Sep 2006
Bài gửi: 100
:
Câu hỏi của bạn nhunamcdt1 không rõ ràng. Bạn muốn hỏi chương trình scan keypad hay chỉ đơn giản là điều khiển 1 vài phím bấm thông thường? Tôi đang viết bằng asm đây. Tôi đã làm phần scan keypad và phần điều khiển 1 vài phím bấm bằng asm, chương trình đã chạy trên mạch thực tế và thành thương phẩm. Tôi sẵn sàng giúp bạn với điều kiện bạn phải biết mình đang muốn làm gì và nói rõ câu hỏi. Tôi thường xuyên online nên bạn có thể gửi msg cho tôi tại nick YM: hiendl2k42.

Vì tôi đã từng gặp rất nhiều khó khăn trong vấn đề lập trình bằng asm mà không hỏi được ai nên tôi cũng muốn hỗ trợ các bạn trong phạm vi hiểu biết của mình, để tránh cho các bạn phải mất nhiều thời gian. Tuy nhiên các bạn cũng nên tự mình tìm hiểu và giải quyết những vấn đề nhỏ, dần dần sẽ tự giải quyết được những vấn đề lớn hơn. Nên suy nghĩ và làm trước khi hỏi.
Jerry vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 08-04-2009, 11:39 PM   #12
thaithien
Đệ tử 7 túi
 
Tham gia ngày: Aug 2007
Bài gửi: 213
:
Anh cho em xin file mà anh vẽ bằng proteus luôn đựoc không ?
thaithien vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 05-09-2009, 01:00 AM   #13
mrbean007
Đệ tử 1 túi
 
Tham gia ngày: Sep 2008
Bài gửi: 19
:
mấy a cho e hỏi tí, khi e đem mô phỏng ct wet_fim hiển thị kết wa ra led7doan thì chẳng thấy kết wa gì hết vậy, mong các a chỉ giúp dùm e
cái khung để viết code đó mấy a làm sao vậy chỉ dùm e cái( cái khung viết code giống như cảu a nhh đó)
File Kèm Theo
File Type: rar key_scan.rar (19.5 KB, 86 lần tải)
mrbean007 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-12-2010, 07:28 PM   #14
linhdang
Đệ tử 1 túi
 
Tham gia ngày: Nov 2010
Bài gửi: 11
:
ai giup toi voi?
toi dung pic 16f887 nhung toi muon ngo ra 12v thi phai lam sao
cam on nhieu
email:hoanglinh_111988@yahoo
linhdang vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 18-04-2011, 05:01 PM   #15
hangocminh1989
Đệ tử 6 túi
 
Tham gia ngày: Apr 2009
Bài gửi: 132
:
Trích:
Nguyên văn bởi linhdang View Post
ai giup toi voi?
toi dung pic 16f887 nhung toi muon ngo ra 12v thi phai lam sao
cam on nhieu
email:hoanglinh_111988@yahoo
em nhấn nhầm cảm ơn...không sao...hihi....sao bác hỏi câu hay nhỉ????em đâu có thấy con pic nào cho ra mức 12v đâu?????
bác muốn dùng điều khiển thiết bịt có điện áp cao bằng ngõ ra của pic thông thường em sài opto hoặc relay.
chúc bác suôn sẻ
hangocminh1989 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời

Ðiều Chỉnh
Xếp Bà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

Similar Threads
Ðề tài Người gửi Chuyên mục Trả lời Bài mới
Góp ý: Kỹ thuật và trình bày falleaf Đóng góp ý kiến 6 03-03-2008 09:36 PM
Hỏi về kỹ thuật bảng mechanics Cơ bản về vi điều khiển và PIC 1 05-10-2006 10:58 AM
Thuật toán với PIC falleaf dsPIC - Bộ điều khiển tín hiệu số 16-bit 3 16-02-2006 09:22 AM
Diễn đàn nhìn luộm thuộm quá noisePIC Đóng góp ý kiến 2 13-07-2005 11:58 PM
Kỹ thuật bảng falleaf Cơ bản về vi điều khiển và PIC 0 06-07-2005 05:49 PM


Múi giờ GMT. Hiện tại là 05:59 AM.


Đượ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