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

📄 keypad.c

📁 keypad controlling using PIC16F877 by C
💻 C
字号:
//=====================================================================//
//PORTB output/input port for KEYPAD
//-------------------------------------------------------------------------------------------------------//
//RB7 RB6	RB5	RB4	RB3	RB2	RB1	RB0
// 1	   1	 1	 1	 0	 0	 0	 0		
//MSB set as output, LSB set as input
//=====================================================================//

#include <pic1687x.h>
#include <string.h>
#include "stdio.h"
#define	LCD_STROBE ((LCD_EN = 1),(LCD_EN=0))
static bit LCD_RS @ ((unsigned)&PORTC*8+6);	// LCD Register select
static bit LCD_EN @ ((unsigned)&PORTC*8+7);	// LCD Enable
#define XTAL_FREQ 20MHZ 
#define MHZ *1000			     		// number of kHz in a MHz 
#define KHZ *1			        		// number of kHz in a kHz 
/****************************************************************/

char userKey[4] = {'1', '2', '3', '4'};//default pin for keypad

unsigned char checkPIN();
int checkKEY();
void modifyPIN();
//void resetPIN();

void lcd_write(unsigned char c);
void lcd_puts(const char * s);
void lcd_init(void);
void lcd_clear(void);
void lcd_goto(unsigned char pos);
void init();
void DelayMs(unsigned char cnt);
void DelayS(unsigned char cnt);
void DelayUs(unsigned char x);

void main()
{
	init();
	
	//initialise LCD
	lcd_init();
	
	//clear the display
	lcd_clear();
	RC5 = 0;
	//display welcome msg
	lcd_goto(0);	
	lcd_puts("welcome to home!");
        DelayS(1);
while(1){
        lcd_goto(0);	
	lcd_puts("Test!");
	
	if (checkKEY())
                      RC5 = 1;
	else RC5 = 0;		
		
        }
}

		
/********************Initialization********************************/
//to set the port I/O
void init()
{
	TRISA = 0b00000000;			/*PORTA for output*/
	TRISB = 0b11110000;			/*PORTB <7:4>: input; <3:0>: output*/
	TRISC = 0b00001111;			/*PORTC <3:0>:input; <4: 7>: output*/
	TRISD = 0b00000000;			/*PORTD for output*/
	TRISE = 0b00000000;			/*PORTE  for output*/
	
	//define all output port to 0V
	PORTA = 0x00;
	PORTB = 0x00;
	PORTC = 0x00;
	PORTD = 0x00;
	PORTE = 0x00;
	ADCON1 =0x07;//A as digital
}
/****************************************************************/

/*******************check wat key pressed**************************/
int checkKEY()
{
	int key= 0;

	PORTB=0x01;
	if(RB4 ==1)
	{
		//key = '1';
		while(RB4 == 1){};
		return 1;
	}
	if(RB5 == 1)
	{
		//key='2';
		while(RB5 == 1){};
		return 1;
	}
	if(RB6 ==1)
	{
		//key='3';
		while(RB6 == 1){};
		return 1;
	}
	if(RB7 ==1)
	{
		//key='A';
		while(RB7 == 1){};
		return 1;
	}
	
	PORTB=0x02;
	if(RB4 ==1)
	{
		//key='4';
		while(RB4 == 1){};
		return 1;
	}
	if(RB5 ==1)
	{
		//key='5';
		while(RB5 == 1){};
		return 1;
	}
	if(RB6 ==1)
	{
		//key='6';
		while(RB6 == 1){};
		return 1;
	}
	if(RB7 ==1)
	{
		//key='B';
		while(RB7 == 1){};
		return 1;
	}
	
	PORTB=0b00000100;
	if(RB4 ==1)
	{
		//key='7';
		while(RB4 == 1){};
		return 1;
	}
	if(RB5 ==1)
	{
		//key='8';
		while(RB5 == 1){};
		return 1;
	}
	if(RB6 ==1)
	{
		//key='9';
		while(RB6 == 1){};
		return 1;
	}
	if(RB7 ==1)
	{
		key='C';
		while(RB7 == 1){};
		return 1;
	}
	
	PORTB=0b00001000;
	if(RB4 ==1)
	{
		//key='*';
		while(RB4 == 1){};
		return 1;
	}
	if(RB5 ==1)
	{
		//key='0';
		while(RB5 == 1){};
		return 1;
	}
	if(RB6 ==1)
	{
		//key='#';
		while(RB6 == 1){};
		return 1;
	}
	if(RB7 ==1)
	{
		//key='D';
		while(RB7 == 1){};
		return 1;
	}
	return key;
}
/*****************************************************************/


/********************Delays***************************************/
void DelayMs(unsigned char cnt)
{
#if	XTAL_FREQ <= 2MHZ
	do {
		DelayUs(996);
	} while(--cnt);
#endif

#if    XTAL_FREQ > 2MHZ	
	unsigned char	i;
	do {
		i = 4;
		do {
			DelayUs(250);
		} while(--i);
	} while(--cnt);
#endif
}
void DelayS(unsigned char cnt)
{
	int i, j;
	for (i=0; i<cnt; i++)
	{
		for (j=0; j<5; j++)
			DelayMs(200);
	}
}
void DelayUs(unsigned char x)
{
     unsigned char count,_dcnt;
     for(count=0;count<x;count++)
     {
         _dcnt= ((XTAL_FREQ)/(8MHZ));     //-- 1us worth of delay
         while(--_dcnt !=0);
    }
 }
/****************************************************************/

/*********************LCD functions********************************/
void lcd_write(unsigned char c) //write a byte to LCD in 8-bit mode
{
	PORTD = c;
	LCD_STROBE;
	DelayUs(40);
}

void lcd_puts(const char * s)	// separate into characters for writing to LCD
{
	LCD_RS = 1;
	while(*s)
		lcd_write(*s++);
}

void lcd_init(void)
{
	LCD_RS = 0;		    // write control bytes
	DelayMs(15);		// power on delay
	LCD_STROBE;
	DelayMs(5);
	LCD_STROBE;
	DelayUs(100);
	LCD_STROBE;
	DelayMs(5);
	LCD_STROBE;
	DelayUs(40);
	lcd_write(0x38);	//set 8 bit mode, 2 lines, 5x7 font
	lcd_write(0x08);	// display off
	lcd_write(0x0F);	// display on, blink cursor on
	lcd_write(0x06);	// cursor-shift-right entry mode
}

void lcd_clear(void)		//clear display, home cursor
{
	LCD_RS = 0;
	lcd_write(0x01);
	DelayMs(2);
}

void lcd_goto(unsigned char pos)	//goto row 2 if pos=40
{
	LCD_RS = 0;
	lcd_write(0x80+pos);
}
/****************************************************************/

⌨️ 快捷键说明

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