矩阵键盘扫描程序:线反转法

#include<reg52.h>//STC89C52RC 头文件
#include<intrins.h>//_crol_函数的头文件
#define uint unsigned int//宏定义
#define uchar unsigned char//宏定义
uchar num;//定义全局变量
uchar code
table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e, 0x79,0x71};//共阳极数码管字符表
void delay(uint xms)  //延时函数
{
uint i,j;
for(i=0;i<xms;i++)
for(j=0;j<110;j++);
}
无线收发
void display(num)  //显示函数
{
uchar numwe,xwei;
xwei=6;//用几位数码管显示?
numwe=0xfe;//初始化数码管位选控制
for(;xwei!=0;xwei--)
{
dula=1;  //开段选锁存器
P0=table[num];//送显示数
dula=0;  //关段选锁存器
P0=0xff;//消影
wela=1;  //开位选锁存器
P0=numwe;//送数码管位选控制
wela=0;  //关位选锁存器
numwe=_crol_(numwe,1); //对数码管位选控制左移位
delay(1);//调用延时函数
}
}
void keyscan()//矩阵键盘扫描函数开始
{
uchar x,y,key,temp;//定义:行坐标x、列坐标y、按键key
temp=0x0f;// 0000 1111
P3=temp;//P3口:4列送0000、4行送1111;
if (P3!=temp)//1判断是否有按键按下;
{
delay(10);//延时10毫秒消抖动;
P3=temp;//P3口:列送0000、行送1111;
if (P3!=temp)//2次判断是否有按键按下;
{
x=P3&temp;//取按下矩阵键盘的行坐标
temp=~temp;//按位取反,线反转使用;
P3=temp;//线反转P3口:4列送高电平、4行送低电平; y=P3&temp;//取按下矩阵键盘的列坐标
key=x|y;//行坐标x、列坐标y 进行或运算组合在一起。 while(P3!=temp);//按键释放检测语句
P1=key;//用流水灯显示当前的P3口状态
switch (key)  //进入开关多分支语句判断
{
case 0xee:  num=0;  F0=1;
break;
case 0xde:  num=1;  F0=1;
break;
case 0xbe:  num=2;  F0=1;
break;
case 0x7e:  num=3;  F0=1;
镗床夹具
break;
case 0xed:  num=4;  F0=1;
break;
case 0xdd:  num=5;  F0=1;
break;
case 0xbd:  num=6;  F0=1;
break;
case 0x7d:  num=7;  F0=1;
break;
case 0xeb:  num=8;  F0=1;
break;
case 0xdb:  num=9;  F0=1;
break;
case 0xbb:  num=10; F0=1;
break;
case 0x7b:  num=11;  F0=1;
break;
case 0xe7:  num=12; F0=1;
break;
环保染料
case 0xd7:  num=13; F0=1;
break;
case 0xb7:  num=14; F0=1;
break;
case 0x77:  num=15; F0=1;
break;
default://出错处理!
F0=0;//程序状态字置0
break;
}webqqq
}
}
}//矩阵键盘扫描函数结束
void init()//初始化函数
{
F0=0;//程序状态字:上电数码管不显示、以及出错处理
num=0;
}
void main()  //主函数开始
{
init();  //调用初始化函数
while(1)//大循环开始
{
keyscan();//调用按键扫描函数
if (F0==1)//判断是否正确按下了矩阵按键
三聚氰胺模压门板{
display(num);//调用显示函数
}
else//错误按键处理(关闭数码管显示、关闭流水灯)
{
dula=1; //开U1锁存器
P0=0xff;//送关闭数据
dula=0; //关U1锁存器
wela=1;  //开U2锁存器
P0=0xff;  //送关闭数据
wela=0;  //关U2锁存器
压力维持阀P1=0xff;//熄灭流水灯
}
}//大循环结束
}//主函数结束
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint x)
//
毫秒级延时函数
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void xianshi(uchar num)  //
段选显示函数
{
P0=table[num];
duan=1;
duan=0;
}
uchar keyscan(void)
//
矩阵键盘扫描函数
{
uchar h,l;
//
定义行、列值中间变量P3=0x0f;
//
列线输出全为
h=P3&0x0f;
/
/
读入行线
if(h!=0x0f)
//
检测有无按键按下{

本文发布于:2024-09-21 19:52:11,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/329884.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:函数   数码管   按键   选锁   显示   存器   矩阵
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议