Ðề tài: Dùng ngắt ngoài
View Single Post
Old 12-12-2008, 12:00 AM   #5
vitechpham
Đệ tử 1 túi
 
Tham gia ngày: Oct 2007
Bài gửi: 15
:
cac pac cho hoi cach chong nhiêu cho chan ngat ngoai cua pic
code cua tui
Code:
#include <16f877a.h>
#FUSES HS,NOPROTECT,NOWDT,NOBROWNOUT,NOLVP
#use delay(clock=12000000)
#use rs232(baud=9600,parity=e,xmit=pin_c6,rcv=pin_c7)
#byte d=0x08
#locate i=0xa0
#locate g=0xa1
#locate l=0xa2
#locate p=0xa3
#locate c=0xa4
#locate m=0xa5
#locate n=0xa6
#locate v=0xa7
#locate h=0xa8
#locate f=0xa9
#bit cl=0x18.0
int8 a[21],x,q;
int8 b[21],s;
int32 w;
char r[10]={'0','1','2','3','4','5','6','7','8','9'};
void clock()
{
   output_high(pin_c5);
   delay_us(4);
   output_low(pin_c5);
   delay_us(4);
}
void lenh (int8 e)
{
   d=e;
   output_low(pin_c3);
   output_low(pin_c4);
   clock();
   delay_ms(1);
}
void dulieu (int8 e)
{
   d=e;
   output_high(pin_c3);
   output_low(pin_c4);
   clock();
   delay_ms(1);
}
void lcdinit()
{
   d=0;
   output_low(pin_c4);
   delay_ms(500);
   output_low(pin_c3);
   d=0x38;
   clock();
   lenh(0x01);
   lenh(0x0c); 
}   
int8 kiemtra(int8 a[],int8 t,int8 f)
{
   int8 k;
   t=0;
   if (bit_test(w,f)==1)
      t=1;
   for (k=0;k<=7;k++)  
      if(bit_test(a,k)==1)
         t=t+1;   
   return t;
}
void demphat()
{
   lenh(0x80);
   switch(g)
   {
      case 1:
         lenh(0x01);
         g=0;
         p=0;
         w=0;
         dulieu("   DA KET NOI");
         putc('s');
      break;
      case 7:
         x=0;
         if(n>0&& p==2&&v>l)
         {
            lenh(0xce);
            dulieu(r[s/10]);
            dulieu(r[s%10]);
            putc(r[s/10]);
            delay_ms(1);
            putc(r[s%10]);
            delay_ms(1);
            if(v >=abs(a[n]-a[n-1]))
            {
               p=3;
               v=0;   
               delay_ms(3000);
            }
            l=v;
         } 
         if(n==h && p==3)
         {
            output_high(pin_b2);
            output_high(pin_b3);
            a[0]=0;
            n=0;
            g=0;
            p=0;
            l=0;
            lenh(0x80);
            dulieu("   HOAN THANH");
            putc('h');
          }   
       break;  
       case 6:
         if(n==0)
         {  
            a[0]=f;
            g=7;
            dulieu(" DA NHAN LENH");
            lenh(0xc0);
            dulieu("VI TRI");
            putc('d');
         }
      break;
      case 5:
         if(c<=m)
         {
            putc(b[c]);
            delay_ms(1);
            c=c+1;
         }
         if(c==m+1)
         { 
            g=0;
            putc('k');
         } 
      break;
      case 4:
         if (b[0]==0 && x==0)
            g=0;
         if(b[0]>0&&x==0) 
            g=5;   
         putc('e');
      break;
      case 3:
         g=0;   
         putc('o');
      break;
      case 2:
         g=0;
         putc('z');
      break;   
      default:break;
   }
   delay_ms(1);
   if(g<5 )
      output_high(pin_b6);
}
void demthu()
{  
   q=0;
   if(g==0)
   {
      if(cl==1)
         bit_set(w,i);
      else
         bit_clear(w,i);
      q = getc();      
      if (i==0)   
         a[0]=q;   
      if (i<=h&&i>=1)
      {
         a[i]=q;
         i=i+1;
         output_high(pin_b6);
      }
   }  
   if (c==m+1 && l>=1)
   {
      if(cl==1)
         bit_set(w,b[l-1]);
      else
         bit_clear(w,b[l-1]);   
      a[b[l-1]]=getc();
      l=l-1;
      if(l==0)
      {
         p=1;
         l=0;
      }
      output_high(pin_b6);
   }  
}
#priority int_rda,int_ext,int_tbe
#int_global
#int_tbe
void phat()
{  if (input(pin_b5)==1)
      demphat();
   disable_interrupts(int_tbe);
}
#int_rda
void thu()
{  
   output_low(pin_b6);
   demthu();
   if (i==h+1)
      output_low(pin_b6);
}
#int_ext
void dongco()
{
   if (g==7)
   {  
      x=2;
      v=v+1;
      output_high(pin_b2);
      output_high(pin_b3);
      output_low(pin_b7);
      if (abs(a[n]-a[n-1])<=50 )
      {
         if (a[n]>a[n-1])
            s=a[n-1]+v;
         else
            s=a[n-1]-v;
      }
      else
      {
         if (a[n]>a[n-1])
            if (a[n-1]< v )
               s=100+a[n-1]-v;
             else
               s=a[n-1]-v;
         else
            if (a[n-1]+v>99)
               s=a[n-1]+v-100;
            else   
               s=a[n-1]+v;
      }
   }  
}
void main()
{
   int8 j;
   i=0;
   p=0;
   l=0;
   n=0;
   v=0;
   h=0;
   a[0]=0;
   b[0]=0;
   f=0;
   x=0;
   set_tris_d(0x00);
   set_tris_b(0x21);
   d=0;
   output_low(pin_b6);
   output_low(pin_b7);
   output_high(pin_b2);
   output_high(pin_b3);
   g=2;
   lcdinit();
   ext_int_edge(l_TO_H);
   enable_interrupts(global);
   enable_interrupts(int_tbe);
   enable_interrupts(int_rda);
   enable_interrupts(int_ext);
   while (true)
   {  
      if (a[0]=='p'||a[0]=='y'||a[0]=='t'||a[0]=='l')
         x=1; 
      if(i==0&&p==0&&a[0]>0)
      {  
         c=kiemtra(a[0],c,0);
         if(c%2>0)
            g=4;
         else 
         {
            if(a[0]=='s')
               g=1;
            if (x==1)
               g=3;
            if ((a[0]>'s'||a[0]<'s')&&x==0)
            {
               g=3;
               i=1;
               h=a[0];
               f=a[h];
               p=3;
            }   
         }
         a[0]=0;
      }    
      if(g==3&&x==1)
      {  
         switch (q)
         {
            case 'p':
               disable_interrupts(int_ext);
               lenh(0xc0);
               dulieu("QUAY PHAI");
               output_low(pin_b2);
               delay_ms(1000);
               output_high(pin_b3);
            break;
            case 't':
               disable_interrupts(int_ext);
               lenh(0xc0);
               dulieu("QUAY TRAI");
               output_low(pin_b3);
               delay_ms(1000);
               output_high(pin_b2);
            break;
            case 'y':
               lenh(0xc0);
               dulieu("TIEP TUC ");
               output_high(pin_b3);
               output_high(pin_b2);
               x=0;
               enable_interrupts(int_ext);
            break;
            case 'l':
               disable_interrupts(int_ext);
               lenh(0xc0);
               dulieu("DUNG     ");
               output_high(pin_b3);
               output_high(pin_b2);
            break;
         }   
      } 
      if(i==h+1)
      {
         l=0;
         for(j=1;j<=h;j++)
         {
            kiemtra(a[j],c,j);
            if(c%2!=0)
            {
               b[l]=j;
               l=l+1;
            }
         }
         if(l==0)
         {
            g=6;
            b[0]=0;
         }
         else
         {
            m=l-1;
            g=4;
         }   
         i=0;
         c=0;
      }   
      if (p==1)
      {
         for (j=0;j<=m;j++)
         {
            kiemtra(a[b[j]],c,j);
            if (c%2!=0)
            {
               b[l]=j;
               l=l+1;
            }
         }
         if(l==0)
         {
            g=6;
            b[0]=0;
         }   
         else
         {
            m=l-1;
            g=4;
         }   
         p=3;
         c=0;
      }
      if (g==7&&n<=h)
      {  
         if(p==3&& n<h)
         {  
            n=n+1;
            p=2;
         }   
         if(abs(a[n]-a[n-1])>0&& x==0)
         {
            if(abs(a[n]-a[n-1])<=50)
            {
               if(a[n]>a[n-1])
                  output_low(pin_b2);
               else
                  output_low(pin_b3);   
            }      
            else 
            {  
               if(a[n]>a[n-1])
                  output_low(pin_b3);
               else
                  output_low(pin_b2);
            }  
            output_high(pin_b7); 
         }
      }
     enable_interrupts(int_tbe);
   }
}

thay đổi nội dung bởi: namqn, 12-12-2008 lúc 12:05 AM.
vitechpham vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn