Tutorial 1 button 2 mode – press releases and holding
Tutorial 1 button 2 mode – press releases and holding
(nhấn nhã và nhấn giữ)
Trong project này ta sử dung một button thực hiện 2 chế độ (1 button 2 mode).
Kết nối với vi điều khiển 16f877A: Button kết nối RB1, led 7 đoạn kết nối với portd (RD0…RD7) và portb (RB4…RB7).
Mô tả project: Khi nhấn nhả button, mỗi lần nhấn nhã led 7 đoạn tăng 1 đơn vị, tương ứng với số lần nhấn button. Khi nhấn giữ button, led 7 đoạn hiển thị số tăng dần. Bạn xem video sau bài đăng để hiểu rõ hơn.
Code tham khảo với mikroC Pro for Pic:
/* * Project name: 1 Button 2 che do * Author: http://dientudieukhien.net * Description: Neu nhan button va nha ra thi led 7 doan hien thi so lan nhan button, neu nhan giu button - hold button thi led 7 doan se dem len den khi nao nha button. * Test configuration: MCU: PIC16F877A Oscillator: HS, 08.0000 MHz SW: mikroC v8.0 */ unsigned short mask(unsigned short num) { switch (num) { case 0 : return 0xC0; case 1 : return 0xF9; case 2 : return 0xA4; case 3 : return 0xB0; case 4 : return 0x99; case 5 : return 0x92; case 6 : return 0x82; case 7 : return 0xF8; case 8 : return 0x80; case 9 : return 0x90; } //case end } unsigned short digit_no, digit10, digit1, digit; void interrupt() { if (digit_no==0) { PORTB.F7=0; PORTB.F6 = 0; // Turn off all 7seg displays PORTD = digit1; // send mask for ones digit to PORTD PORTB.F7 = 1; // turn on 1st 7 seg., turn off 2nd digit_no = 1; } else { PORTB.F6=0; PORTB.F7 = 0; // Turn off all 7seg displays PORTD = digit10; // send mask for tens digit to PORTD PORTB.F6 = 1; // turn on 2nd 7 seg., turn off 1st digit_no = 0; } TMR0 = 0; // clear TMRO INTCON = 0x20; // clear TMR0IF and set TMR0IE } void display(unsigned short i){ unsigned short digit; digit=i%10; digit1=mask(digit); //hien thi hang don vi digit=i/10; digit10=mask(digit); // hien thi hang chuc delay_ms(500); } void main() { unsigned short i,j,dem; OPTION_REG = 0x80; // Timer0 settings TMR0 = 0; INTCON = 0xA0; // Disable PEIE,INTE,RBIE,T0IE trisb=0x03; trisd=0x00; trisa=0X00; portb=0; portd=0; i=0; j=0; dem=0; display(i); for(;;){ if(Button(&portb,1,1,0)){ //Kiem tra button nhan giu hay nhan roi nha ra dem=dem+1; delay_ms(1); } if(dem==1){ //Neu nhan roi nha ra i=i+1; display(i); } if(dem>1){ //Neu nhan giu - hold button display(j); j=j+1; delay_ms(30); if(Button(&portb,1,0,1)){ i=0; j=0; delay_ms(1000); display(j); goto lap; } } lap: //Kiem tra neu buton nha ra thi resest dem. if(Button(&portb,1,0,1)){ dem=0; } } }