//==================================================================
// 文件名称: main.c
// 版 本: 1.01.01
// 日 期: 2013708
// 注 释: C8051F330,自定义PS2小键盘
//
//
// I/O定义:
// ioKEYCOL = P0.0~P0.3; 键盘扫描列输入
// ioKEYROW = P1.0~P1.5 键盘扫描列行输出
// ioKEYCLK = P0^4; PS2键盘时钟信号
// ioKEYDATA = P0^5; PS2键盘数据信号
// 定时器的分配:
// 定时器1:配置方式1。定时频率系统时钟/4。
// 功能说明:
// 一. 扫描自定义键盘
// 二. 输出PS2信号
//
//==================================================================
#include "c8051f330.h"
#include "define.h"
//#include <intrins.h>
#include "system.h"
#include <intrins.h>
bit b30MS; // 30毫秒标志
bit bPS2END; // PS2波形输出完成标志
bit bPS2FLAG; // 有键盘数据要输出
unsigned char cPS2STEP; // PS2波形输出步长
unsigned char cPS2Data; // PS2波形输出数据
unsigned char cPS2Data0; // PS2波形输出数据
unsigned char cPS2Data1; // PS2波形输出数据
unsigned char cPS2Data2; // PS2波形输出数据
unsigned char cKeybuf0; // 扫描的键值
unsigned char cKeybuf1; // 扫描的键值
unsigned char cKeybuf2; // 扫描的键值
unsigned char code key_col[] = // 键盘扫描
{
0xf,
0xf,
0xf,
0xf,
0xf,
0xf,
0xf,
0x3,
0xf,
0xf,
0xf,
0x2,
0xf,
0x1,
0x0,
0xf,
};
/*
unsigned char code key_Map1[] =
{
0x00,0x2E,
0x00,0x25,
0xE0,0x69,
0x00,0x36,
0x00,0x1E,
0x00,0x16,
0x00,0x09,
0x00,0x26,
0x00,0x79,
0x00,0x45,
0xE0,0x7A,
0x00,0x7B,
0x00,0x3E,
0x00,0x3D,
0xE0,0x7D,
0x00,0x46,
0xE0,0x72,
0xE0,0x6B,
0x00,0x5A,
0xE0,0x74,
0xE0,0x75,
0x00,0x66,
0x00,0x76,
0x00,0x0D,
};
unsigned char code keyThreeByte_Map[] =
{
0x00,0xF0,0x2E,
0x00,0xF0,0x25,
0xE0,0xF0,0x69,
0x00,0xF0,0x36,
0x00,0xF0,0x1E,
0x00,0xF0,0x16,
0x00,0xF0,0x09,
0x00,0xF0,0x26,
0x00,0xF0,0x79,
0x00,0xF0,0x45,
0xE0,0xF0,0x7A,
0x00,0xF0,0x7B,
0x00,0xF0,0x3E,
0x00,0xF0,0x3D,
0xE0,0xF0,0x7D,
0x00,0xF0,0x46,
0xE0,0xF0,0x72,
0xE0,0xF0,0x6B,
0x00,0xF0,0x5A,
0xE0,0xF0,0x74,
0xE0,0xF0,0x75,
0x00,0xF0,0x66,
0x00,0xF0,0x76,
0x00,0xF0,0x0D,
};
*/
unsigned char code key_Map1[] =
{
0x00,0x16,
0x00,0x1E,
0x00,0x26,
0x00,0x09,
0x00,0x25,
0x00,0x2E,
0x00,0x36,
0xE0,0x69,
0x00,0x3D,
0x00,0x3E,
0x00,0x46,
0xE0,0x7D,
0x00,0x45,
0x00,0x79,
0x00,0x7B,
0xE0,0x7A,
0x00,0x66,
0xE0,0x75,
0x00,0x0D,
0x00,0x76,
0xE0,0x6B,
0xE0,0x72,
0xE0,0x74,
0x00,0x5A,
};
unsigned char code keyThreeByte_Map[] =
{
0x00,0xF0,0x16,
0x00,0xF0,0x1E,
0x00,0xF0,0x26,
0x00,0xF0,0x09,
0x00,0xF0,0x25,
0x00,0xF0,0x2E,
0x00,0xF0,0x36,
0xE0,0xF0,0x69,
0x00,0xF0,0x3D,
0x00,0xF0,0x3E,
0x00,0xF0,0x46,
0xE0,0xF0,0x7D,
0x00,0xF0,0x45,
0x00,0xF0,0x79,
0x00,0xF0,0x7B,
0xE0,0xF0,0x7A,
0x00,0xF0,0x66,
0xE0,0xF0,0x75,
0x00,0xF0,0x0D,
0x00,0xF0,0x76,
0xE0,0xF0,0x6B,
0xE0,0xF0,0x72,
0xE0,0xF0,0x74,
0x00,0xF0,0x5A,
};
//==================================================================
// 函数名称: void main(void)
// 函数用途: 主程序
// 输入参数:
// 输出参数:
// 注 释:
//==================================================================
void main(void)
{
PCA0MD &= ~0x40; // 禁止看门狗定时器
Sysclk_Init(); // 配置系统时钟
SysTimer_Init(); // 定时器初始化
SysPort_Init(); // 端口配置
EA = 1;
b30MS = 1; // 打开全局中断
bPS2FLAG = 0;
cPS2Data0 =0;
cPS2Data1 =0;
cPS2Data2 =0;
while(1)
{
// SysDelay_50us();
// bval = ioKEYDATA;
// ioKEYDATA = ~bval;
// ioKEYCLK = bval;
// 进入低功耗
PCON |= 0x01; // 空闲方式
PCON = PCON;
}
}
void INT0_ISR(void) interrupt 0
{
}
void Timer0_ISR(void) interrupt 1
{
}
void INT1_ISR(void) interrupt 2
{
}
void keyscan(void)
{
unsigned char cROW,cCOL,tmp1,tmp2,tmp3,i;
P1 = (P1 & 0xc0);
for (i=10;i>0;i--)
tmp2 = P0 & 0x0f;
P1 = (P1 & 0xc0) | 0x3f;
for (i=10;i>0;i--)
if(tmp2 == 0x0f)
{
cKeybuf2 = cKeybuf1;
cKeybuf1 = cKeybuf0;
cKeybuf0 = 0;
}
else
{
tmp1 = 0x3e; //tem1 用来设置P1口的输出
cROW = 0;
for (tmp3=0;tmp3<6;tmp3++) //row check
{
P1 = (P1 & 0xc0) | tmp1; //使P1.0~p1.5中有一个为0
for (i=10;i>0;i--)
tmp2 = P0 & 0x0f;
if(tmp2 != 0x0f)
{
cCOL = key_col[tmp2];
cKeybuf2 = cKeybuf1;
cKeybuf1 = cKeybuf0;
cKeybuf0 = (cROW << 2) + cCOL + 1;
return;
}
tmp1 = ((tmp1<<1) +1) & 0x3f;
cROW ++;
}
}
}
void keydata(void)
{
if((cPS2Data0 !=0) || (cPS2Data1 !=0) || (cPS2Data2 !=0))
{
bPS2FLAG =1;
return;
}
if(cKeybuf0 == cKeybuf1)
{
if(cKeybuf1 != cKeybuf2)
{
if(cKeybuf0 != 0)
{
bPS2FLAG =1;
cPS2Data0 = key_Map1[cKeybuf0 + cKeybuf0 -1];
cPS2Data1 = key_Map1[cKeybuf0 + cKeybuf0 -2];
}
else
{
bPS2FLAG = 1;
cPS2Data0 = keyThreeByte_Map[cKeybuf0 + cKeybuf0 + cKeybuf0 -1];
cPS2Data1 = keyThreeByte_Map[cKeybuf0 + cKeybuf0 + cKeybuf0 -2];
cPS2Data2 = keyThreeByte_Map[cKeybuf0 + cKeybuf0 + cKeybuf0 -3];
}
}
else
{
// if(cKeybuf0 == 0) return;
// bPS2FLAG =1;
// cPS2Data0 = key_Map1[cKeybuf0 + cKeybuf0 -1];
// cPS2Data1 = key_Map1[cKeybuf0 + cKeybuf0 -2];
}
}
}
void TIMER1_ISR(void) interrupt 3 using 2
{
unsigned char temp_bit;
bit flag_check=1;
if(b30MS)
{
//设置定时器30ms中断
TH1 = def30msdelay >> 8;
TL1 = def30msdelay;
//扫描键盘
// P0=~P0;
keyscan();
keydata();
if(bPS2FLAG)
{
cPS2STEP = 0;
bPS2FLAG =0;
b30MS = 0;
bPS2END = 0;
if(cPS2Data2 != 0)
{
cPS2Data = cPS2Data2;
cPS2Data2 = 0;
}
else if(cPS2Data1 != 0)
{
cPS2Data = cPS2Data1;
cPS2Data1 = 0;
}
else if(cPS2Data0 != 0)
{
cPS2Data = cPS2Data0;
cPS2Data0 = 0;
}
//设置定时器33us(30KHz)中断
TH1 = def33usdelay >> 8;
TL1 = def33usdelay;
}
/* else
{
//设置定时器30ms中断
TH1 = def30msdelay >> 8;
TL1 = def30msdelay;
}
*/ }
else
{
TH1 = def33usdelay >> 8; //
TL1 = def33usdelay;
//输出PS2键盘值
if(bPS2END)
{
//设置定时器30ms中断
TH1 = def30msdelay >> 8;
TL1 = def30msdelay;
b30MS = 1;
ioKEYCLK = 1; //PS2键盘时钟信号
ioKEYDATA = 1; //PS2键盘数据信号
}
else
{
switch(cPS2STEP)
{
case 0:
ioKEYDATA = 0;
break;
case 1: //s
case 3: //0
case 5: //1
case 7: //2
case 9: //3
case 11: //4
case 13: //5
case 15: //6
case 17: //7
case 19: // po
case 21: // stop
ioKEYCLK = 0;
break;
case 2:
case 4:
case 6:
case 8:
case 10:
case 12:
case 14:
case 16:
ioKEYCLK = 1; //PS2键盘时钟信号
temp_bit = cPS2Data & 0x01;
ioKEYDATA = temp_bit; //PS2键盘数据信号
if(temp_bit==0x01)
{
flag_check=!flag_check;
}
cPS2Data=cPS2Data >> 1;
break;
case 18:
ioKEYCLK =1;
ioKEYDATA = flag_check; //奇偶校验位
break;
case 20:
ioKEYCLK =1;
ioKEYDATA = 1; // stop
break;
case 22:
ioKEYCLK = 1;
bPS2END = 1;
// #pragma ASM
// LJMP 0x00000000;
// #pragma ENDASM
break;
}
cPS2STEP++;
if(cPS2STEP>22)
{
TH1 = def30msdelay >> 8;
TL1 = def30msdelay;
ioKEYCLK = 1; //PS2键盘�
key_ps2.rar_C8051F330 key_单片机ps2通信
版权申诉
87 浏览量
2022-09-20
20:51:06
上传
评论
收藏 39KB RAR 举报
小贝德罗
- 粉丝: 71
- 资源: 1万+
最新资源
- FaceFusionSharp OnnxRuntime版 视频换脸.rar
- 上市公司澄清公告数据集.xlsx
- 基于Matlab实现的基于车辆运动学,实现低速度下的MPC轨迹跟踪(高分项目)
- 安卓Android社团管理App+源代码+文档说明+数据库(高分项目).zip
- 基于安卓Android的社团管理App+sql数据库(高分毕设项目).zip
- 通用性I2C接口的应用之驱动SHT20(N32G45XVL-STB)
- 基于Python+BERT+词典开发的医药知识图谱自动问答系统实现+源代码+文档说明+使用教程+数据.zip
- 基于yolov8对6种水果数据集的目标检测实现【数据+代码+训练好的权重】
- ѧ�����˿α�_23252202222.xls
- UVa12227/LA4618 Wormholes
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈