📄 keypad.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 + -