#include <reg52.h>
//#include <at89x52.h>
//unsigned char code BCD[]={0x3f,0x06,0x5b,0x4f, //此处是将0-F转换成相应的BCD码
// 0x66,0x6d,0x7d,0x07,
// 0x7f,0x6f,0x77,0x7c,
// 0x39,0x5e,0x79,0x71};
//unsigned char code KEY[]={0x00,0x00,0x01,0x02,0x03,//此处是为使程序通用,当键值不是按
// 0x04,0x05,0x06,0x07,//这个排列时,把此表更改即可
// 0x08,0x09,0x0a,0x0b,//最前面的那个0x00是为了查表方便,
// 0x0c,0x0d,0x0e,0x0f};//因为键值是从1开始的
sfr key_port=0x90; //定义P1口为键盘扫描口
bit key_ok=0; //有键按下的标志
/*************延时子程序*************
****调用一次用时18微秒,t每加1,用时增加6微秒*/
void delay(unsigned char t)
{
while(t--);
}
unsigned char r_left(unsigned char x)//循环左移一位
{
x<<=1;
x++;
return(x);
}
/*************粗判有无键按下**********
****有键按下则将key_ok置1************/
void scan_full(void)
{
unsigned char temp;
key_port=0xf0; //低半字节为行线,高半字节为列线
temp=P1;
if(temp!=0xf0)
key_ok=1;
else key_ok=0;
}
/************键盘扫描程序*************************
****功能:返回键值,当无键按下时,返回0*************/
unsigned char key_scan(void)
{
unsigned char temp,count=0x01,key_value;//按键返回值
unsigned char x_scan=0xfe,y_scan=0xef;//行、列扫描码
unsigned char i,j,y; //行数和列数
while(1)
{
scan_full(); //粗判是否有键按下
if(key_ok==1)
{
key_ok=0;
delay(200); //延时去抖动
scan_full(); //再次粗判是否有键按下
if(key_ok==1)
{
for(i=0;i<4;i++) //扫描4行
{
key_port=x_scan;
for(j=0;j<4;j++) //每行4列
{
temp=key_port;
temp=temp&0xf0;
y=y_scan&0xf0;
if(temp==y)
{
while(key_ok!=0)//等待按键松开
{
scan_full();
}
key_value=count;
return(key_value);//找到键值,马上返回
}
else
{
count++;
y_scan=r_left(y_scan);
}
}
y_scan=0xef; //扫描完一列,重新对列扫描量赋初值
x_scan=r_left(x_scan);//行扫描码左移一位,扫描下一行
}
}
}
return(key_value);//没键按下,返回0
}
}
//unsigned char key(void)
//{
// unsigned char x;
// unsigned char y;
// x=key_scan();
// return(x);
//y=KEY[x];
//return y;
//}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。
资源推荐
资源详情
资源评论
收起资源包目录
基于STM32的Protues仿真实例(8051)-PWM调温.zip (16个子文件)
Protues仿真实例(8051)-PWM调温
PWM调温
Last Loaded PWM.DBK 96KB
PWM.plg 196B
PWM.hex 1KB
PWM.PWI 1KB
PWM.DSN 96KB
pwm.c 2KB
keyscan.c 2KB
PWM.M51 11KB
keyscan.LST 6KB
PWM.lnp 54B
PWM.Uv2 2KB
keyscan.OBJ 4KB
pwm.OBJ 5KB
pwm.LST 5KB
PWM.Opt 1KB
PWM 7KB
共 16 条
- 1
资源评论
CrMylive.
- 粉丝: 1w+
- 资源: 4万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功