⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 key.c

📁 基于PIC16F877A PORTB端口高低电平变化的键盘中断程序
💻 C
字号:
#include <pic.h> 
#define portbit(address,bits) ((unsigned)(&address)*8 + (bits)) 
#define BUSY 0x80 
#define WRITE_DATA 0xff 
#define delay_data 0xff 
#define COMMAND 0x00 
#define LCD_CLEAR 0x01 
#define portdata PORTC 
#define firstline 0x80 
#define secondline 0xc0 

volatile bit E  @ portbit(PORTE,2); 
volatile bit RW @ portbit(PORTE,1); 
volatile bit RS @ portbit(PORTE,0); 
const unsigned char table[10] = {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
volatile unsigned char temp;
volatile unsigned char data;

#pragma interrupt_level 1
void delay(void)
{ 
  unsigned int i;
   for (i = 6553; -- i;)
    {
      } 
}  

unsigned char lcd_busy(void) 
{ 
  unsigned char temp; 
   
  portdata = 0xff; 
  RS = 0; 
  RW = 1; 
  E = 1; 
  TRISC = 0xff; 
  temp = portdata; 
  TRISC = 0x00; 
  E = 0; 
  return (temp); 
} 

void lcd_command_writedata(unsigned char check,unsigned char data) 
{ 
  if (check == COMMAND) 
  { 
   RS = 0; 
   } 
  else 
  { 
   RS = 1; 
  } 
  RW = 0; 
  portdata = data; 
  E = 1; 
  E = 0; 
  while (lcd_busy() & BUSY); 
} 

void lcd_disp(unsigned char address,unsigned char disp_data) 
{ 
  lcd_command_writedata(COMMAND,address);
  lcd_command_writedata(WRITE_DATA,disp_data);
  }

void lcd_init(void) 
{ 
  lcd_command_writedata(COMMAND,LCD_CLEAR); 
  lcd_command_writedata(COMMAND,0x38); 
  lcd_command_writedata(COMMAND,0x0e); 
  lcd_command_writedata(COMMAND,0x06); 
} 

void system_init(void) 
{ 
  delay(); 
  INTCON = 0x00; 
  ADCON1 = 0x07;
  TRISC = 0x00; 
  TRISE = 0x00; 
 } 

void rb_init(void)
 {
   TRISB = 0xf0;
   OPTION = 0x7f;
   RBIF = 0;
   PORTB = 0x00;
   RBIE = 1;
   PORTB = PORTB;
   }

void key_serve(void)
 {
   PORTB = 0xfb;
   if (RB4 == 0)  temp = 5;
   if (RB5 == 0)  temp = 6;
   PORTB = 0xf7;
   if (RB4 == 0)  temp = 7;
   if (RB5 == 0)  temp = 8;
   PORTB = 0x00;
   }


    
void main(void) 
{ 
 delay(); 
 system_init(); 
 rb_init();
 lcd_init();
 TMR2ON = 1;
 ei();
 while(1)
   {
     if (temp != 0)
    {
     data = table[temp];
     lcd_disp(0x85,data);
     lcd_disp(0xcf,0xfe);
     temp = 0;
     }
    }
  }

#pragma interrupt_level 1
void interrupt rb_interrupt(void)
 {
  delay();
  if((RB4 == 0) || (RB5 == 0))
   { 
     key_serve();
   }
  PORTB = PORTB;
  RBIF = 0;
}
   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -