📄 keyboard451.c
字号:
/*******************************************************************************
* 标题: 蓝海微芯LJD-SY-5100单片机开发系统演示程序 *
* 文件: keyboard451.c *
* 日期: 2006-7-22 *
* 版本: 1.0 *
* 作者: Pillar *
********************************************************************************
* 描述: *
* 键盘管理 *
* *
********************************************************************************
* 【版权】 Copyright(C) belongs to 天宇蓝翔科技有限公司 All Rights Reserved *
* 【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息! *
*******************************************************************************/
#include <keyboard451.h>
BYTE ch451_key; // 存放键盘中断中读取的键值
BOOL renew_key_id;
//*************************************************
void ch451_init() //初始化
{
P1 = 0x60;
ch451_din =0;
ch451_dclk=1; //先低后高,选择4线输入
ch451_din =1;
ch451_load=1;
ch451_dout=1;
IT1=0; //设置低电平触发
IE1=0; //清中断标志
PX1=1; //设置中断1为高优先级
EX1=1; //开外部中断1
//ch451_write(0x201); //451 reset
ch451_write(0x402); //set keyboard mode
}
//*****************************************************
//used in num key
BYTE get_num_address_from_key_value(BYTE key_value) //读键值
{
switch (key_value){
case ZONGQING_KEY: //6
return 5;
case DANQING_KEY: //7
return 6;
case HUIZONG_KEY: //8
return 7;
case ZIDONG_KEY: //9
return 8;
case JIUCUO_KEY: //
return 'e';
case ZONGZHONG_KEY: //
return 1;
case CHAXUN_KEY: //
return 2;
case ZOUZHI_KEY: //
return 3;
case BEIGUANG_KEY:
return 4;
case CUNRU_KEY: //
return 'f';
case GUILING_KEY: //0
return 0;
case ZONGCI_KEY: //1
return 9;
case LEIBIE_KEY: //2
return 'a';
case SHEPI_KEY: //3
return 'b';
case RIQI_KEY: //4
return 'c';
case SHIJIAN_KEY: //5
return 'd';
case GUANJI_KEY: //5
return 'g';
default :
return 17;
}
}
void ch451_write(WORD command)
{
BYTE i;
WORD tem;
tem = command;
EX1=0; //禁止键盘中断
//tem1 = command&0xff;
ch451_load=0; //命令开始
for(i=0;i<12;i++){ //送入12位数据,低位在前
ch451_din = (tem &1);
ch451_dclk=0;
tem = (tem >> 1);
ch451_dclk =1; //上升沿有效
}
ch451_load =1; //加载数据
EX1=1;
}
//*************************************************
//输入命令子程序,MCU从451读一字节
BYTE ch451_read()
{
BYTE i;
BYTE command,keycode; //定义命令字,和数据存储器
EX1=0; //关中段
command=0x07; //输入读451命令字
ch451_load=0;
for(i=0;i<4;i++){
ch451_din=command&1; //送入最低位
ch451_dclk=0;
command>>=1; //往右移一位
ch451_dclk=1; //产生时钟上升沿锁通知CH451输入位数据
}
ch451_load=1; //产生加载上升沿通知CH451处理命令数据
keycode=0; //清除keycode
for(i=0;i<7;i++){
keycode<<=1; //数据移入keycode,高位在前,低位在后
keycode|=ch451_dout; //从高到低读入451的数据
ch451_dclk=0; //产生时钟下升沿通知CH451输出下一位
ch451_dclk=1;
}
IE1=0; //清中断标志
EX1=1;
return(keycode); //反回键值
}
//*************************************************
//中断子程序 使用中断2,寄存器组1
void ch451_inter(void) interrupt 2 using 1
{
BYTE i,keycode;
BYTE command;
EX1 = 0; //关中断
command=0x07; //读取键值命令的高4位0111B
ch451_load=0; //命令开始
for(i=0;i<4;i++){
ch451_din=command&1; //低位在前,高位在后
ch451_dclk=0;
command>>=1; //右移一位
ch451_dclk=1; //产生时钟上升沿锁通知CH451输入位数据
}
ch451_load=1; //产生加载上升沿通知CH451处理命令数据
keycode=0; //清除keycode
for(i=0;i<7;i++){
keycode<<=1; //数据作移一位,高位在前,低位在后
keycode|=ch451_dout; //从高到低读入451的数据
ch451_dclk=0; //产生时钟下升沿通知CH451输出下一位
ch451_dclk=1;
}
ch451_key=keycode; //保存上次的键值
renew_key_id = 1;
EX1 = 1; //开中断
IE1 = 0; //清中断标志,可由cpu自动进行
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -