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

📄 keyboard.c

📁 采用C51语言完成基于74HC595的串口键盘与LED指示灯单元设计
💻 C
字号:
#include <reg51.h>

#define CHECK_KEY_DOWN 	0	   //处在检测按键压下阶段标志
#define CHECK_KEY_UP   	1	   //处在检测按键抬起阶段标志
#define KEY_UP			0	   //按键抬起标志
#define KEY_DOWN		1	   //按键压下标志

sbit _p33 = P3^3;
sbit _p34 = P3^4;
sbit _p35 = P3^5;
sbit _p36 = P3^6;

char data_out;
char _key_status = CHECK_KEY_DOWN; //按键检测状态(初值为检测压下阶段)
char _key_idx = 0;				   //按键序号

void _delay_1ns() {
}

void _p34_plus() {				   //发生移位脉冲,SH_CP
    _p34 = 0;
    _delay_1ns();
    _p34 = 1;
    _delay_1ns();
    _p34 = 0;
}

void _p35_plus() {				   //发生锁存脉冲,ST_CP
    _p35 = 0;
    _delay_1ns();
    _p35 = 1;
    _delay_1ns();
    _p35 = 0;
}

void serial_output(unsigned char out) {	 //通过595串行输出数据
    char i = 0;
    for (i = 7; i >= 0 ; i--) {
        _p33 = (out >> i)& 0x01;		//将数据移到最低位后由P33送出,DS信号
        _p34_plus();
    }
    _p35_plus();
}

char _check_key(unsigned char _key_idx) { //检查按键状态

	serial_output((~(0x01<<_key_idx))&0x0f);	  //将待查按键键码转换成扫描码后输出
	if (_p36 == 0) {					  //根据P36状态决定返回值
		return KEY_DOWN;
	} else {
		return KEY_UP;
	}
}

char get_key(void) {							//获取键值
	char result = -1;							//无键按下时键值为-1
	if (_key_status == CHECK_KEY_DOWN) {		//如果当前处于检查压下阶段,进行以下操作
		if (_check_key(_key_idx) == KEY_DOWN) {	//判断当前扫描键的状态,若为压下标志则
			_key_status = CHECK_KEY_UP;			//将检查阶段标志设置为抬起
		} else {								//否则,将检查阶段标志设置为压下
			_key_status = CHECK_KEY_DOWN;			
			_key_idx++;						    //判断是否4个按键已经轮流扫描一遍
			if (_key_idx == 4) {
				_key_idx = 0;					//是,则将待扫描按键号设为0
			}
		}
	} else if (_key_status == CHECK_KEY_UP) {	//如果当前处于检查抬起阶段,进行以下操作
		if (_check_key(_key_idx) == KEY_UP) {	//判断当前扫描键的状态,若为抬起标志则
			result = _key_idx;					//键值输出
			_key_status = CHECK_KEY_DOWN;		//按键检查阶段标志改为压下
			if (++_key_idx == 4) {				//判断是否4个按键已经轮流扫描一遍
				_key_idx = 0;					//是,则将待扫描按键号设为0
			}
		} else {
			_key_status = CHECK_KEY_UP;			
		}
	}
	return result;
}

⌨️ 快捷键说明

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