![]()  | 
| 
	 | 
| 		
			
			 | 
		#1 | 
| 
			
			
			
			 Đệ tử 5 túi 
			
		
			
				
			
			
			Tham gia ngày: Sep 2006 
				
				
				
					Bài gửi: 101
 
				
				
				:  | 
	
	
	
	
		
		
		
		 Đầu tiên là thử quét phím bằng timer0 (chưa thử bấm nhanh hay bấm lấu) 
		
	
		
		
		
		
		
	
	Code: 
	#include <16F877A.h>
#include <def_877a.h>
#device *=16 adc=10
#FUSES NOWDT, XT, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#use fast_io (b)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=9)
#define OK PIN_B6
#define Cancel PIN_B7
#define OK_PRESSED  !input(OK)
#include <lcd_lib_4bit.c>
   int8 count;
   char phim;
   int8 isr_count;
#int_TIMER0
void interrupt_timer0()
{
   if(OK_PRESSED)
   {
      isr_count++;
      if(isr_count==81)
      {
         isr_count==0;
         disable_interrupts(GLOBAL);
         disable_interrupts(INT_TIMER0);
      }
   }
   else
   {
      disable_interrupts(GLOBAL);
      disable_interrupts(INT_TIMER0);
   }
}
//-----------------------------------------------------------------
void main(void)
{
   output_b(0xC0);
   set_tris_a(0xC0);
   set_tris_b(0xC1);
   port_b_pullups (TRUE);
   LCD_init();
   delay_ms(500);
   LCD_putcmd(0x80);
   Printf(LCD_putchar,"Hi ev'body");   //Hien thi man hinh 1
   LCD_putcmd(0xC0);
   Printf(LCD_putchar,"Khoi tao...");
   if(OK_PRESSED)
   {           //enable timer0
      enable_interrupts(INT_TIMER0);
      enable_interrupts(GLOBAL);
   }
   if(isr_count==0)
   {
      LCD_putcmd(0x01);    //xoa man hinh
      LCD_putcmd(0x80);
      Printf(LCD_putchar,"Enter Pressed");  //Hien thi man hinh 2
   }
}
 | 
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#2 | 
| 
			
			
			
			 Trưởng lão PIC bang 
			
		
			
			
								
		
	 | 
	
	
	
	
		
		
		
		 - Biến isr_count chưa được khởi tạo trong main(), nên rất có thể nó mang giá trị 0 khi thực thi main(). Do đó lệnh xuất ra LCD chuỗi "Enter Pressed" có thể được thực thi. 
		
	
		
		
		
		
			- main() không có vòng lặp chính, dẫn đến chạy hết các lệnh trong main() thì sẽ chạy tiếp các lệnh trong flash, giả thiết chúng đều là 3FFFh, tức là lệnh addlw 0xff, thì PIC sẽ chạy đến ô nhớ cuối cùng của flash chương trình, sau đó PC sẽ trở về 0000h, và PIC lại chạy chương trình như vừa bị reset (không hoàn toàn giống như reset bằng MCLR). - Timer0 chưa được khởi tạo, do đó hành vi là không xác định trước. Thân, 
				__________________ 
		
		
		
		
	
	Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263  | 
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
![]()  | 
	
	
		
  | 
	
		
  |