/*-----------------------------------------------
说明:此程序使用标准PS2键盘输入,LCD1602液晶屏输出显示。此样例仅作测试使用
晶振使用12M或者11.0592M,本键盘使用部分字母和数字测试,其他按键不能使用,用
户可以自行扩展。由于开发板和程序的各种参数,程序中没有使用奇偶校验,不保证没有
误码,校验程序请自行添加。
-------------------------------------------------*/
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include "scancodes.h"
#include "ps2.h"
#include "1602.h"
sbit Key_Data = P3^3 ; //定义Keyboard引脚
sbit Key_CLK = P3^2; //使用中断
bit BF=0;
bit Shift; //定义上档键标志
bit Key_UP; //定义通码断码标志
unsigned char KeyV;
unsigned char IntNum;
unsigned char DisNum;
/*-----------------------------------------------
外部中断读入信息
-----------------------------------------------*/
void Keyboard_out(void) interrupt 0
{
if ((IntNum > 0) && (IntNum < 9))
{
KeyV = KeyV >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
if (Key_Data)
KeyV = KeyV | 0x80; //当键盘数据线为1时到最高位
}
IntNum++;
while (!Key_CLK); //等待PS/2CLK拉高
if (IntNum > 10)
{
IntNum = 0; //当中断11次后表示一帧数据收完,清变量准备下一次接收
BF = 1; //标识有字符输入完了
EA = 0; //关中断等显示完后再开中断
}
}
/*-----------------------------------------------
解码信息
注意:如SHIFT+G为12H 34H F0H 34H F0H 12H
也就是说shift的通码+G的通码+shift的断码+G的断码
-----------------------------------------------*/
void Decode(unsigned char ScanCode) //
{
unsigned char TempCyc,Val;
if (!Key_UP) //当键盘按下时
{
switch (ScanCode)
{
case 0xF0 : // 当收到0xF0,Key_UP置1表示断码开始
Key_UP = 1;
break;
case 0x12 : // 左 SHIFT
Shift = 1;
break;
case 0x59 : // 右 SHIFT
Shift = 1;
break;
default:
if(!Shift) //如果SHIFT没按下
{
for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
if (UnShifted[TempCyc][0] == ScanCode)
{
Val= UnShifted[TempCyc][1];
LCD_Write_Char(DisNum%16,DisNum/16,Val);
DisNum++;
if(DisNum==33)
{
LCD_Clear(); //清屏
DisNum=0; //重头写数据
}
}
}
else //按下SHIFT
{
for(TempCyc = 0; (Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
if (Shifted[TempCyc][0] == ScanCode)
{
Val= Shifted[TempCyc][1];
LCD_Write_Char(DisNum%16,DisNum/16,Val);
DisNum++;
if(DisNum==33)
{
LCD_Clear(); //清屏
DisNum=0; //重头写数据
}
}
}
break;
}
}
else
{
Key_UP = 0;
switch (ScanCode) //当键松开时不处理判码,如G 34H F0H 34H 那么第二个34H不会被处理
{
case 0x12 : // 左 SHIFT
Shift = 0;
break;
case 0x59 : // 右 SHIFT
Shift = 0;
break;
}
}
BF = 0; //标识字符处理完了
}
/*-----------------------------------------------
ps2初始化(实际初始化外部中断)
-----------------------------------------------*/
void PS2_Init(void)
{
IT1 = 0; //设外部中断1为低电平触发
EA = 1; //外部中断开
EX0 = 1; //开中断
}
/*-----------------------------------------------
读取键盘值
-----------------------------------------------*/
void Read_KeyBoard(void)
{
if (BF)
Decode(KeyV);
else
EA = 1; //开中断
}
没有合适的资源?快使用搜索试试~ 我知道了~
单片机 127-PS2键盘输入1602液晶显示(C语言).rar
共25个文件
h:4个
obj:4个
c:4个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 186 浏览量
2023-04-11
11:49:36
上传
评论
收藏 31KB RAR 举报
温馨提示
免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者或出版方,资料版权归原作者或出版方所有,本人不对所涉及的版权问题或内容负法律责任。如有侵权,请举报或通知本人删除。
资源推荐
资源详情
资源评论
收起资源包目录
单片机 127-PS2键盘输入1602液晶显示(C语言).rar (25个子文件)
127-PS2键盘输入1602液晶显示
ps2键盘1602显示.Opt 1KB
ps2.c 4KB
obj
1602.lst 6KB
ps2键盘1602显示.hex 3KB
ps2键盘1602显示 14KB
ps2键盘1602显示.plg 193B
ps2.obj 6KB
delay.lst 2KB
main.lst 2KB
delay.obj 1KB
1602.obj 6KB
ps2键盘1602显示.m51 16KB
ps2.lst 8KB
main.obj 3KB
ps2键盘1602显示.uv2 2KB
ps2.h 242B
ps2键盘1602显示.plg 193B
1602.c 3KB
ps2键盘1602显示_Opt.Bak 1KB
delay.h 654B
delay.c 738B
ps2键盘11602显示.plg 194B
scancodes.h 2KB
1602.h 769B
main.c 618B
共 25 条
- 1
资源评论
荣华富贵8
- 粉丝: 150
- 资源: 7649
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功