找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1988|回复: 0
收起左侧

C51单片机键盘行列式源程序附加DSN Proteus仿真 带注释

[复制链接]
ID:716077 发表于 2020-3-30 15:39 | 显示全部楼层 |阅读模式
#include   "reg51.h"
unsigned  char  tab[]={0x0ee,0x0de,0x0be,0x7e,0x0ed,0x0dd,0x0bd,0x7d,0x0eb,0x0db,0x0bb,0x7b,0x0e7,0x0d7,0x0b7,0x77};//定义按键K0~K15的键码值
unsigned  char  smm[]={0x0fe,0x0fd,0x0fb,0x0f7};//行0~行3的行扫描码
unsigned  char  a[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};


unsigned  char  keysm1()
{
unsigned  char  a,b,t;
for(P2=0x0f0;P2==0x0f0;);//行线输出低电平,并判断是否有按键按下
t=0;//行计数器清0
b=smm[t];//获得行扫描码,准备行扫描
do//进行行扫描
{
P2=b;//给P1口送行扫描码
a=P2;//此时读入列线值
a=a&0x0f0;//取出列线值
if(a==0x0f0)//如果相等则代表此行无键按下,准备下一行的扫描码
{
t++;
if(t==4)   t=0;
b=smm[t];
}
}while(a==0x0f0);//只要无键按下,则循环扫描
b=b&0x0f;//当某行有键按下时,取出列线值
b=b|a;//将行列线值合并成键值码
t=0;//键值码查找计数器清0
for(;b!=tab[t];t++);//循环查找按键的键值码
return(t);//找到键值码后,返回按键的位置,例如K0键返回0,以此类推
}


void  delayms(unsigned  char  ms)//毫秒级延时函数,晶振6MHZ
{
unsigned  char  i;
while(ms--)
{
for(i=60;i>0;i--);
}
}


void  display(unsigned  char  x)//显示函数,当按相应按键时,在数码管上显示键值,例如K0键返回0,以此类推,例如K15键返回15
{
P3=a[x];
}


void  main()
{
unsigned  char  m,n;
for(;;)//无限循环扫描键盘以及显示按键信息
{
m=keysm1();//调用键盘是否被按下的逐行扫描法函数
delayms(11);//延时10ms,用于键盘消抖
n=keysm1();//再次调用键盘是否被按下的逐行扫描法函数,返回显示数字
if(m==n)//如果消抖前后两次按键的显示数字相同
{
display(m);//则调用显示函数在数码管上的显示结果
}
for(P2=0x0f;P2!=0x0f;);//判断按键是否结束
delayms(100);//延时1ms
}
}

51hei.png

行列式键盘(1).zip

14.48 KB, 下载次数: 15, 下载积分: 黑币 -5

DSN

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表