📄 keyscan119.c
字号:
//**************************************************************/
/*键盘源程序,源文件名KEYSCAN.c。使用MPLAB C18 编译器。*/
//使用PIC18F6527高性能单片机
//**************************************************************/
//#include <pic18fxx20.h> /* head file*/
#include <p18f6527.h> //PIC18F452 head file
/*********************DEFINE****************************/
//RA0低压检测报警,RA2 光耦OPEN,RA3 光耦CLOSE,RA4 光耦LOCK
//RA5 SW17 R, RA1不知做什么
#define low_voltage PORTAbits.RA0
#define pos_open PORTAbits.RA2
#define pos_close PORTAbits.RA3
#define pos_lock PORTAbits.RA4
#define key_R PORTAbits.RA5
//RB0 SW3 OPEN/CLO, RB1 SW2 D , RB3 SW4 N
//RB4 指纹开关, RB2 键盘开关
//RB5 外部强行闯入 , RB6 仿真,RB7 仿真
#define key_open_close PORTBbits.RB0
#define key_D PORTBbits.RB1
#define key_N PORTBbits.RB3
#define outkey_finger PORTBbits.RB4
#define outkey_keyboard PORTBbits.RB2
#define force_in PORTBbits.RB5
//OUT RC0 让dsp重置 删除已有指纹 /reset
//OUT RC1 spi开始(猜测) spiss
//OUT RC2 外盖打开 从sleep恢复 /pwr_on
//IN/OUT RC3 spi clock sck
//IN RC4 master in slave out miso
#define dsp_reset PORTCbits.RC0
#define dsp_spiss PORTCbits.RC1
#define dsp_pwr_on PORTCbits.RC2
#define dsp_sck PORTCbits.RC3
#define dsp_miso PORTCbits.RC4
#define dsp_mosi PORTCbits.RC5
//IN RD0 成功标志 录入或登入成功标志
//OUT RD7 MOT-
#define dsp_succes PORTDbits.RD0
#define mot_down PORTDbits.RD7
#define confim_key 9
//RE0 VCC_IO 接通 与VCC_6V 高有效
//RE7 VCC_IO2 接通 与VCC_6V 高有效
//RE2 KID电源 接通 与VCC_6V
//RE1 MOT+
//RE3 BUZZ声音控制 没有用到
//RE4 键盘面板灯
//RE5 键盘蓝色灯
//RE6 下拉了 没有用
#define vcc_io PORTEbits.RE0
#define vcc_io2 PORTEbits.RE7
#define vcc_kid PORTEbits.RE2
#define mot_up PORTEbits.RE1
//#define buzz2 PORTEbits.RE3
#define keyboard_red PORTEbits.RE5
#define keyboard_blue PORTEbits.RE4
//RG0 buzz声音控制,RG1 指纹RED, RG2 指纹BLUE
#define buzz PORTGbits.RG0
#define finger_red PORTGbits.RG1
#define finger_blue PORTGbits.RG2
//*********************DEFINE*********************//
void initialize_io(void); //初始化i/o口
void initialize(void); //初始化其他寄存器
void initialize_eeprom(void); //初始化eeprom
void delay(int delaytime); //延时
char key_scan(void); //键盘扫描
char keyserve(void); //键盘辨别
char epprom_read(int epprom_r_addr); //读epprom
void epprom_write(int epprom_w_addr,int epprom_w_data); //写epprom
void sound_buzzer(int sound); //发声
void key_stop(void); //判断键盘是否松开
void mot_move_open(void); //驱动电机开门
void mot_move_close(void); //驱动电机关门
char password_confirm(void); //密码验证
char password_input(void); //密码输入
void sleep_prepare(void); //sleep准备,低功耗设置
void finger_confirm(void); //指纹确认
void finger_input(void); //指纹输入
void finger_del(void); //指纹删除
void force_in_alarm(void);
void interrupt_handler_high(void); //高级中断
void interrupt_handler_low(void);
//全局变量设置
char current_key; //当前得到按下去的key
int current_epprom; //当前从epprom中得到的参数
int current_password[9]; //当前password
int sleep_cycle=0; //设置睡眠时间
int password_confirm_times=0; //设置错误次数
char sound_enable=1; //
///* Set configuration bits for use with ICD2 / PICDEM2 PLUS Demo Board:*/
//#pragma romdata CONFIG
//_CONFIG_DECL(_CONFIG1H_DEFAULT,// & HS,
//_CONFIG2L_DEFAULT,
//_CONFIG2H_DEFAULT ,//& _WDT_OFF_2H,
//_CONFIG3H_DEFAULT,
//_CONFIG4L_DEFAULT ,//& _LVP_OFF_4L,
//_CONFIG5L_DEFAULT,
//_CONFIG5H_DEFAULT,
//_CONFIG6L_DEFAULT,
//_CONFIG6H_DEFAULT,
//_CONFIG7L_DEFAULT,
//_CONFIG7H_DEFAULT);
//#pragma romdata
//high_vector_section AT 0x8,
#pragma code high_vector_section=0x8
void high_vector (void)
{
_asm
GOTO interrupt_handler_high
_endasm
}
#pragma code
//low_vector_section AT 0x18
#pragma code low_vector_section=0x18
void
low_vector (void)
{
_asm
GOTO interrupt_handler_low
_endasm
}
#pragma code
void main(void)
{
initialize ();
initialize_io ();
initialize_eeprom();
INTCONbits.GIE=1; //高优先级中断允许
INTCONbits.PEIE=1; //低优先级中断允许
while(1)
;
}
char key_scan(void) //扫描键盘输入的一个字符,返回值
{
/* RF4 COL0 input
RF5 COL1
RF6 COL2
RF7 COL3
RF3 ROW0 output
RF1 ROW1
RF2 ROW2
*/
int i,j;
PORTFbits.RF1 = 1;
PORTFbits.RF2 = 1;
PORTFbits.RF3 = 1;
// for(i=0;i<10000000;i++)
while(outkey_keyboard)
{
if(PORTFbits.RF4||PORTFbits.RF5||
PORTFbits.RF6||PORTFbits.RF7)
{
delay(10000);
if(PORTFbits.RF4||PORTFbits.RF5||
PORTFbits.RF6||PORTFbits.RF7)
{
current_key=keyserve();
PORTFbits.RF1 = 0;
PORTFbits.RF2 = 0;
PORTFbits.RF3 = 0;
return(1);
}
else
{
delay(100);
PORTFbits.RF1 = 0;
PORTFbits.RF2 = 0;
PORTFbits.RF3 = 0;
}
}
else
delay(100);
}
return(0);
}
char keyserve(void)
{
char keyserve_key;
PORTFbits.RF1 = 0;
PORTFbits.RF2 = 0;
PORTFbits.RF3 = 1;
if(PORTFbits.RF4 == 1)
{
keyserve_key=1;
key_stop();
}
else if(PORTFbits.RF5 == 1)
{
keyserve_key=4;
key_stop();
}
else if(PORTFbits.RF6 == 1)
{
keyserve_key=7;
key_stop();
}
else if(PORTFbits.RF7 == 1)
{
keyserve_key=10;
key_stop();
} //error;
PORTFbits.RF1 = 1;
PORTFbits.RF2 = 0;
PORTFbits.RF3 = 0;
if(PORTFbits.RF4 == 1)
{
keyserve_key=2;
key_stop();
}
else if(PORTFbits.RF5 == 1)
{
keyserve_key=5;
key_stop();
}
else if(PORTFbits.RF6 == 1)
{
keyserve_key=8;
key_stop();
}
else if(PORTFbits.RF7 == 1)
{
keyserve_key=0;
key_stop();
}
PORTFbits.RF1 = 0;
PORTFbits.RF2 = 1;
PORTFbits.RF3 = 0;
if(PORTFbits.RF4 == 1)
{
keyserve_key=3;
key_stop();
}
if(PORTFbits.RF5 == 1)
{
keyserve_key=6;
key_stop();
}
if(PORTFbits.RF6 == 1)
{
keyserve_key=9;
key_stop();
}
if(PORTFbits.RF7 == 1)
{
keyserve_key=20;
key_stop();
}
return(keyserve_key);
}
void key_stop()
{
while(1)
{
if(PORTFbits.RF4||PORTFbits.RF5||
PORTFbits.RF6||PORTFbits.RF7)
delay(100);
else
{
delay(10000);
if(PORTFbits.RF4||PORTFbits.RF5||
PORTFbits.RF6||PORTFbits.RF7)
delay(100);
else
break;
}
}
}
char epprom_read(int epprom_r_addr)
{
EEADRH = 0; //Upper bits of Data Memory Address to write
EEADR = epprom_r_addr; //Lower bits of Data Memory Address to write
EECON1bits.EEPGD = 0; //Point to DATA memory
EECON1bits.CFGS = 0; // Access EEPROM
EECON1bits.RD = 1;; //EEPROM Read
return(EEDATA);
}
void epprom_write(int epprom_w_addr,int epprom_w_data)
{
EEADRH = 0; //Upper bits of Data Memory Address to write
EEADR = epprom_w_addr; //Lower bits of Data Memory Address to write
EEDATA = epprom_w_data; //Data Memory Value to write
EECON1bits.EEPGD = 0; //Point to DATA memory
EECON1bits.CFGS = 0; // Access EEPROM
EECON1bits.WREN = 1; // Enable writes
INTCONbits.GIE = 0; // Disable Interrupts
INTCONbits.PEIE=0;
EECON2 = 0x55; //Write 55h
EECON2 = 0xAA; //Write 0AAh
EECON1bits.WR = 1 ; //Set WR bit to begin write
INTCONbits.GIE = 1; //Enable Interrupts
INTCONbits.PEIE=1;
while (!PIR2bits.EEIF) // WRITE step #8
;
PIR2bits.EEIF = 0; // WRITE step #9
EECON1bits.WREN = 0; //Disable writes on write complete (EEIF set)
}
void sound_buzzer(int sound)
{
unsigned char fre_repeat,s_max,s_min;
int i,j;
//同一频率重复次数,最高频率,最低频率,循环变量i,j
vcc_io2 = 1; //buzz and dsp
fre_repeat= sound; //同一频率循环4次
s_max=0x93; //声音最高频率
s_min=0x47; //声音最低频率
if(sound==0)
sound=1;
if(sound_enable)
for(i=s_max-s_min;i>0;i--) //输出最高频率与最低频率内的每一个频率的声音
{
for(j=fre_repeat;j>0;j--) //每个声音循环4次
{
buzz=1; //输出声音
delay(s_min+i); //延长一段时间
buzz=0; //关闭声音
delay(s_min+i); //延长一段时间
}
}
}
void mot_move_open()
{
//判断是否打开到位
int i;
if(pos_open == 0&&pos_lock==0) //没有到位
{
for(i=0;i<10;i++)
{
if(pos_open == 0 )
{
vcc_kid=1; //kid 电源打开
mot_down=1; //反转
mot_up = 0; //正转
sound_buzzer(4);
delay(100000); //需要调整的时间
}
}
if(pos_open == 0) //没有到位报警
{
for(i=0;i<3;i++)
sound_buzzer(10);
}
}
sound_buzzer(2);
sound_buzzer(1);
mot_down=0; //反转
mot_up=0; //正转
vcc_kid=0;
}
void mot_move_close()
{
//判断是否到位
int i;
if(pos_close == 0&&pos_lock==0) //没有到位
{
for(i=0;i<10;i++)
{
if(pos_close == 0 )
{
vcc_kid=1; //kid 电源打开
mot_down=0; //反转
mot_up = 1; //正转
sound_buzzer(4);
delay(100000);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -