/*-----------------------------------------------
说明:此程序使用标准PS2键盘输入,LCD1602液晶屏输出显示。此样例仅作测试使用
晶振使用12M或者11.0592M,本键盘使用部分字母和数字测试,其他按键不能使用,用
户可以自行扩展。由于开发板和程序的各种参数,程序中没有使用奇偶校验,不保证没有
误码,校验程序请自行添加。
-------------------------------------------------*/
/*-----------------------------------------------
名称:99秒计时器
公司:上海浩豚电子科技有限公司
网站:www.doflye.cn
编写:师访
日期:2009.5
修改:无
内容:通过定时器计时
------------------------------------------------*/
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include "scancodes.h"
#include "LCD1602.h"
sbit Key_Data = P3^0 ; //定义Keyboard引脚
sbit Key_CLK =P3^2; //使用中断
bit BF;
bit Shift; //定义上档键标志
bit Key_UP; //定义通码断码标志
unsigned char KeyV;
unsigned char IntNum;
unsigned char DisNum;
/******************************************************************/
/* 函数声明 */
/******************************************************************/
void Decode(unsigned char ScanCode); //解码子程序
/******************************************************************/
/* 主函数 */
/******************************************************************/
void main()
{
IT1 = 0; //设外部中断1为低电平触发
EA = 1; //外部中断开
EX0 = 1; //开中断
InitLcd(); //初始化1602液晶屏
do
{
if (BF)
Decode(KeyV);
else
EA = 1; //开中断
}
while(1);
}
/******************************************************************/
/* 外部中断读入信息 */
/******************************************************************/
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; //关中断等显示完后再开中断
}
}
/******************************************************************/
/* 解码信息 */
/******************************************************************/
void Decode(unsigned char ScanCode) //注意:如SHIFT+G为12H 34H F0H 34H F0H 12H,也就是说shift的通码+G的通码+shift的断码+G的断码
{
unsigned char TempCyc;
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)
{
ShowChar(DisNum,UnShifted[TempCyc][1]);
DisNum++;
if(DisNum==32)
{
WriteCommand(0x01);//清屏
DisNum=0;//重头写数据
}
}
}
else //按下SHIFT
{
for(TempCyc = 0; (Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
if (Shifted[TempCyc][0] == ScanCode)
{
ShowChar(DisNum,Shifted[TempCyc][1]);
DisNum++;
if(DisNum==32)
{
WriteCommand(0x01);//清屏
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; //标识字符处理完了
}
荣华富贵8
- 粉丝: 223
- 资源: 7653
最新资源
- 永磁同步电机双矢量占空比模型预测转矩控制(MPTC)策略解析及全局最优占空比选择:仿真效果卓越,文档详解,永磁同步电机双矢量占空比模型预测转矩控制mptc,考虑全局最优占空比选择,使得全局占空比基本都
- 永磁同步电机改进型三矢量模型预测电流控制:结合q轴电流斜率与切换控制策略,混合输出三矢量和单矢量解析文档赠送,永磁同步电机改进型三矢量模型预测电流控制,参考张晓光老师的lunwenModel Pred
- SCL与CFC编写方法:实现五个电机的逆启顺停顺序控制程序,2种方法SCL编写和CFC编写5个电机逆启顺停的顺控程序 方法一:使用西门子的电机功能块和联锁块编写5个电机逆启顺停的顺控程序 方法二、使用
- 改进非洲秃鹫优化算法性能展示与四种算法对比,改进非洲秃鹫优化算法(IAVOA,2021年,名字自己随便取的),引入了几种改进策略,效果还不错 与DBO,AVOA,WOA,NGO四种算法,在
- 基于Comsol的粗糙单裂隙渗流与传热耦合模型研究:模型建立与边界条件细探,Comsol粗糙单裂隙渗流传热耦合数值模型, 细模型边界条件以及模型建立 ,核心关键词:Comsol; 粗糙单裂隙; 渗流
- 基于裂隙岩体特征的 热-流-固耦合效应数值建模技术探讨,裂隙岩体热-流-固耦合数值建模 ,核心关键词:裂隙岩体;热-流-固耦合;数值建模;建模方法;耦合效应;数值模拟;地质工程;地球科学;岩土工程;工
- 基于Simulink的BMS动力电池管理系统的仿真与控制策略模型研究,BMS仿真电池平衡控制策略仿真similink 动力电池管理系统仿真 BMS + Battery Simulink 控制策略模型
- Simulink飞轮储能PMSM永磁同步机与同步机一次调频:系统频率特性研究与参考文献解析,simulink飞轮储能PMSM永磁同步机与同步机一次调频,系统频率特性如下,有参考文献 ,核心关键词:S
- 小土堆学习笔记相关资源
- 基于FPGA的DDS波形发生器技术:实现多波形数字频率合成与调频调幅调相切换功能,基于FPGA的DDS多波形数字频率合成技术,波形发生器,采用DDS原理,以FPGA芯片作为核心,采用verilog H
- 永磁同步电机直接转矩控制DTC模型(含传统与滑膜控制对比研究)利用Simulink仿真分析,永磁同步电机+SIMULINK+直接转矩控制 DTC控制模型x2(传统+滑膜) A1 暂无文档 ,核心关键词
- Matlab下的储能蓄电池PQ控制策略研究与实践,matlab储能蓄电池pq控制 ,核心关键词:Matlab; 储能蓄电池; PQ控制; 能源管理; 电池优化控制; 电力系统 ,Matlab储能蓄电池
- 基于模型预测控制的四轮独立驱动与转向路径跟踪:车辆稳定性控制的高级算法,四轮独立驱动 转向路径跟踪及车辆稳定性控制 模型预测控制MPC 上层4WS+DYC,下层阿克曼转向分配和最小轮胎负荷率驱动力矩分
- Simulink中四机两区域系统一次调频优化:风机与光伏同步机的联合调频策略及多台双馈风电场联合调频研究,simulink简化四机两区域系统一次调频,风机同步机光伏调频,新能源风电渗透率高,可调,风电
- 基于WinCC 8.0与STEP V5.7 SP1的PLC编程虚拟机,Win10 22H2最新系统,支持PLCSIM与多种组件安装 ,西门子WinCC 8.0 机 STEP V5.7 SP1Chin
- 基于蚁群算法与A*算法的多目标点路径规划:送餐机器人室内旅行商问题的解决方案,多目标点路径规划-蚁群+A*算法 室内旅行商问题-送餐移动机器人(从厨房出发到达多个目标点,最后返回厨房) 1,A*算
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈