Hệ vi xử lý code 16f877

Sơ đồ mạch nguyên lý trên Proteus

/**
   @uthor //nvtienanh.info
   @brief Demo Keypad and LCD PIC16F877
*/
#include 
#device *=16 adc=10 
#fuses hs, nowdt, noprotect, nolvp, put, brownout
#use delay[clock=20000000]
#include 
#include 
#include 
#include 

// 4-Bits Interface
void main[]
{
  unsigned char line1[16], line2[16];
  char Key = 'n';       // Variable to store pressed key value
  InitKeypad[];       // Initialize Keypad pins
  LCD_Init[];
  delay_ms[10];
  sprintf[line1," DEMO KEYPAD   "];
  sprintf[line2," nvtienanh.com "];
  LCD_Gotoxy[0,0];
  LCD_Puts[line1];
  LCD_Gotoxy[1,0];
  LCD_Puts[line2];
 while[TRUE]
 {
     Key = GetKey[];
     LCD_Clear[];
     LCD_Gotoxy[0,0];
     LCD_PutChar[Key];
     LCD_Gotoxy[1,0];
     LCD_Puts[line2];
     //delay_ms[500];
 }  
}

#define _LCD_

#define LCD_RS PIN_D1                        
#define LCD_RW PIN_D2
#define LCD_EN PIN_D0
#define LCD_D4 PIN_D4                 
#define LCD_D5 PIN_D5
#define LCD_D6 PIN_D6
#define LCD_D7 PIN_D7 

#endif

#ifndef __KEYPAD_H
#define __KEYPAD_H

// Define pins
#define RowA      PIN_B0
#define RowB      PIN_B1
#define RowC      PIN_B2
#define RowD      PIN_B3
#define C1        PIN_B4
#define C2        PIN_B5
#define C3        PIN_B6
#define C4        PIN_B7

#define Keypad_PORT         PORTB
#define Keypad_PORT_Dir      TRISB

// Function declarations
void InitKeypad[void];
char GetKey[void];

#endif

/**
   @uthor //bmshop.vn
   @brief LCD functions
*/
 void LCD_Enable[void]
{
 output_high[LCD_EN];
 delay_us[3];
 output_low[LCD_EN];
 delay_us[50]; 
}

//Ham Gui 4 Bit Du Lieu Ra LCD
 void LCD_Send4Bit[ unsigned char Data ]
{
 output_bit[LCD_D4,Data&0x01];
 output_bit[LCD_D5,[Data>>1]&1];
 output_bit[LCD_D6,[Data>>2]&1];
 output_bit[LCD_D7,[Data>>3]&1];
}

// Ham Gui 1 Lenh Cho LCD
 void LCD_SendCommand [unsigned char command ]
{
LCD_Send4Bit  [ command >>4 ];/* Gui 4 bit cao */
LCD_Enable [] ;
LCD_Send4Bit  [ command  ];   /* Gui 4 bit thap*/
LCD_Enable [] ;
}

void LCD_Init [void]
{

output_low[LCD_RS];
output_low[LCD_RW];
delay_ms[20];

LCD_Send4Bit[0x03];
LCD_Enable[];
delay_ms[10];

LCD_Send4Bit[0x03];
LCD_Enable[];
delay_ms[10];

LCD_Send4Bit[0x03];
LCD_Enable[];
delay_ms[10];

LCD_Send4Bit[0x02];
LCD_Enable[];
delay_ms[10];

LCD_SendCommand[ 0x28 ];      // giao thuc 4 bit, hien thi 2 hang, ki tu 5x8   
                                 //Function Set: 8-bit, 1 Line, 5x7 Dots   0x30
                                 //Function Set: 8-bit, 2 Line, 5x7 Dots   0x38
                                 //Function Set: 4-bit, 1 Line, 5x7 Dots   0x20
                                 //Function Set: 4-bit, 2 Line, 5x7 Dots   0x28

LCD_SendCommand[ 0x0C];    //Display on Cursor on: 0x0E   0x0F 
                               //Display on Cursor off: 0x0C
                               //Display on Cursor blinking: 0x0F
LCD_SendCommand[ 0x06 ];   // tang ID, khong dich khung hinh         Entry Mode

LCD_SendCommand[ 0x01 ];   //  Clear Display  [also clear DDRAM content]

}
 
void LCD_PutChar [ unsigned char Data ]
{
 output_high[LCD_RS];
 LCD_SendCommand[ Data ];
 output_low[LCD_RS];
}

void LCD_Puts [char *s]
{
   while [*s]
   {
      LCD_PutChar[*s];
      s++;
   }
}
void LCD_Clear[]
{
  LCD_SendCommand[0x01];  
  delay_ms[10];
}
void LCD_Gotoxy[unsigned char row, unsigned char col]
{
  unsigned char address;
  if[!row]
  address = [0x80 + col];
  else
  address = [0xC0 + col];
  delay_us[500];
  LCD_SendCommand[address];
  delay_us[50];
}

#include "Keypad.h"

// Function name: InitKeypad
void InitKeypad[void]
{
   output_b[0x00];   // Set Keypad port pin values zero
   set_tris_b[0xF0];   // Last 4 pins input, First 4 pins output
   port_b_pullups [0x7F];// Enable weak internal pull up on input pins
}

// Function name: READ_SWITCHES
// Scan all the keypad keys to detect any pressed key.
char READ_SWITCHES[void]   
{   
   output_low[RowA]; output_high[RowB]; output_high[RowC]; output_high[RowD];    //Test Row A

   if [input_state[C1] == 0] { delay_ms[250]; while [input_state[C1]==0]; return '7'; }
   if [input_state[C2] == 0] { delay_ms[250]; while [input_state[C2]==0]; return '8'; }
   if [input_state[C3] == 0] { delay_ms[250]; while [input_state[C3]==0]; return '9'; }
   if [input_state[C4] == 0] { delay_ms[250]; while [input_state[C4]==0]; return '/'; }

   //RowA = 1; RowB = 0; RowC = 1; RowD = 1;    //Test Row B
   output_high[RowA]; output_low[RowB]; output_high[RowC]; output_high[RowD];

   if [input_state[C1] == 0] { delay_ms[250]; while [input_state[C1]==0]; return '4'; }
   if [input_state[C2] == 0] { delay_ms[250]; while [input_state[C2]==0]; return '5'; }
   if [input_state[C3] == 0] { delay_ms[250]; while [input_state[C3]==0]; return '6'; }
   if [input_state[C4] == 0] { delay_ms[250]; while [input_state[C4]==0]; return 'x'; }
   
  // RowA = 1; RowB = 1; RowC = 0; RowD = 1;    //Test Row C
   output_high[RowA]; output_high[RowB]; output_low[RowC]; output_high[RowD];

   if [input_state[C1] == 0] { delay_ms[250]; while [input_state[C1]==0]; return '1'; }
   if [input_state[C2] == 0] { delay_ms[250]; while [input_state[C2]==0]; return '2'; }
   if [input_state[C3] == 0] { delay_ms[250]; while [input_state[C3]==0]; return '3'; }
   if [input_state[C4] == 0] { delay_ms[250]; while [input_state[C4]==0]; return '-'; }
   
   //RowA = 1; RowB = 1; RowC = 1; RowD = 0;    //Test Row D
   output_high[RowA]; output_high[RowB]; output_high[RowC]; output_low[RowD];

   if [input_state[C1] == 0] { delay_ms[250]; while [input_state[C1]==0]; return 'C'; }
   if [input_state[C2] == 0] { delay_ms[250]; while [input_state[C2]==0]; return '0'; }
   if [input_state[C3] == 0] { delay_ms[250]; while [input_state[C3]==0]; return '='; }
   if [input_state[C4] == 0] { delay_ms[250]; while [input_state[C4]==0]; return '+'; }

   return 'n';              // Means no key has been pressed
}

// Function name: GetKey
// Read pressed key value from keypad and return its value
char GetKey[void]               // Get key from user
{
   char key = 'n';              // Assume no key pressed

   while[key=='n']              // Wait untill a key is pressed
      key = READ_SWITCHES[];   // Scan the keys again and again

   return key;                  //when key pressed then return its value
}

Chủ Đề