📄 key.c
字号:
/*----------------------------- Program Overview -------------------------------
Device Name: AT89S52
ROM: 8 K bytes
RAM: 512 bytes
Chip Basic Functions: 40pin, 32I/O, 16 bit Timer *3, 8 bit UART *1, Eight Interrupt Sources
4.0V to 5.5V Operating Range, OSC 11.0592 MHz (0.9216 us)
Complier: keil C 750
Simulator: keil C 750
Programmer:
File Name: key.c
File Functtion: key function
Copyright: XIAZHAOJUN
First Version Finished Date: 2007.11.6
Others:
------------------------------- Modified Note ----------------------------------
Old Version:
New Version:
New CheckSum:
Modifier:
Modified Date:
Modified Causation:
Modified Mean:
-------------------------------------------------------------------------------*/
//----------------------------- Include ----------------------------------------
#include <reg52.h>
//#include <stdio.h>
#include<intrins.h>
#include<com.h>
#include<lcm.h>
#include<fbuzz.h>
#include<cmain.h>
//----------------------------- SFR Definition ---------------------------------
//----------------------------- Macro Definition -------------------------------
#define uchar unsigned char
#define uint unsigned int
//----------------------------- Constant Definition ----------------------------
//----------------------------- Variable Definition ----------------------------
unsigned char data key_io;
unsigned char data keyflag;
unsigned char data keyedge_old;
// unsigned char keydat;
unsigned char data keyasic;
unsigned char data keytabdat;
//----------------------------- Bit Definition ---------------------------------
unsigned char bdata keyedge;
//sbit flag = keyedge^7;
sbit b_off_fg = keyedge^6; // off
sbit b_on_fg = keyedge^5; // on
sbit b_stop_fg = keyedge^4; // stop
sbit b_right_fg = keyedge^3; // right
sbit b_left_fg = keyedge^2; // left
sbit b_down_fg = keyedge^1; // down
sbit b_up_fg = keyedge^0; // up
/*----------------------------- Subroutine -------------------------------------
Name: key_initial
Function:
Entry:
Exit:
Caution:
-------------------------------------------------------------------------------*/
void key_initial(void){
keyedge=0x00;
keyflag=0x00;
keyedge_old=0x00;
key_io=0x00;
// keydat=0x00;
keyasic=0x00;
}
/*----------------------------- Subroutine -------------------------------------
Name: Key_Det_col
Function: read io
Entry:
Exit:
Caution:
-------------------------------------------------------------------------------*/
uchar Key_Det_col(uchar keycol){
uchar keyio_dat;
P1=(~keycol);
_nop_();
_nop_();
keyio_dat=(~P1);
return(keyio_dat);
}
/*----------------------------- Subroutine -------------------------------------
Name: Key_Detect
Function:
Entry: key_io
Exit: keyflag,keyedge_old,keyedge
Caution:
-------------------------------------------------------------------------------*/
void Key_Detect(void){
static unsigned char state=2;
unsigned char keybuf;
state++;
if(state>2)
state=0x00;
if(state<2)
keybuf=Key_Det_col(state+1);
switch (state){
case 0:
key_io&=0xf0; //first cow
key_io|=(keybuf>>4);
break;
case 1: //second cow
key_io&=0x0f;
keybuf&=0x70;
key_io|=keybuf;
break;
case 2:
keybuf=keyflag&key_io;
//方式0 限制新的按建的检测,必须等旧的按建松开,
//才去检测新的按建,更新为 方式1 ,可以解决这个问题。
//方式0
// if(keybuf==0){
// keyflag=key_io;
// keyedge_old=0x00;
// }
// else {
// keyedge|=(keybuf&(~keyedge_old));
// keyedge_old=keybuf;
// }
//方式1
keyflag=key_io;
keyedge|=(keybuf&(~keyedge_old));
keyedge_old=keybuf;
break;
}
}
/*----------------------------- Subroutine -------------------------------------
Name: key_doout
Function: get out key ,and set send flag, clear timer
Entry:
Exit:
Caution:
-------------------------------------------------------------------------------*/
void key_out_pro(void){
// unsigned char i;
keyedge&=0x7f;
if(keyedge!=0){
fbuzz_en();
comcmd=Write_COM_DATA;
b_send_fg=1;
b_disp=1;
lcm_md=0x03;
//keyright
if(b_right_fg){
keytabdat=0x04;
comdata&=0xf0;
comdata|=0x04;
}
//keyleft
if(b_left_fg){
keytabdat=0x03;
comdata&=0xf0;
comdata|=0x03;
}
//keydown
if(b_down_fg){
keytabdat=0x02;
comdata&=0xf0;
comdata|=0x02;
}
//keyup
if(b_up_fg){
keytabdat=0x01;
comdata&=0xf0;
comdata|=0x01;
}
//keystop
if(b_stop_fg){
keytabdat=0x00;
comdata&=0xf0;
}
//keyon
if(b_on_fg){
keytabdat=0x06;
comdata&=0x0f;
comdata|=0x10;
}
//keyoff
if(b_off_fg){
keytabdat=0x05;
comdata&=0x0f;
}
keyedge=0x00;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -