请教51单片机用矩阵键盘控制八位数码管扫描数码管显示的问题

已解决问题
stc89c51单片机,我想用矩阵键盘控制数码管显示键值,但是我想用独立键盘复位。
提问时间: 05:38:15
stc89c51单片机,我想用矩阵键盘控制数码管显示键值,但是我想用独立键盘复位。
浏览次数:3363
你也可以把显示数码管的程序放在中断里执行也可以把显示数码管和键盘扫描放到同一个while(1)里面,显示一个数就扫一下键盘再显示另一个数又扫一下键盘。
答案创立者
以企业身份回答&
快速解决你的电商难题
店铺优化排查提升2倍流量
擅长&nbsp 店铺优化
您可能有同感的问题博客分类:
今天学习了下矩阵键盘,
分别代表0~F这16个数字
我们按了哪个键就显示到数码管上
看完郭老师讲解原理后就自己动手写了,郁闷的是
在keil软件中,我在switch-case语句中 少了个冒号,竟然编译通过!
结果当然不正确了,然后我再keil中调试代码,那更郁闷了,P3口在扫描到第2行键盘时就
会复位成0xff,怎么赋值都没用,其实是没写冒号啊!
调了半天都不行,最后不得不将STC89C52RC换上仿真芯片SST89E516,在线调试后才发现的错误,
然后参考书上的代码才调试成功的,表示无语~~~
#include &reg52.h&
#include "MY51.H"
void showKey(uint8 num); //静态显示
void keyScan();
void main()
showKey(18);
//初始显示的是6个负号
{ //循环检测
keyScan();
void showKey(uint8 num)
// 打开6个数码管
P0=table[num];
void keyScan()
uint8 num=0;
//定义显示的数字
uint8 temp=0;
//P3口回读信息
uint8 i=0;
//定义矩阵键盘行号索引
for(i=0; i&4;i++)
P3=_crol_(0xfe,i);
//扫描的行索引号,从第0行到第3行
//读取P3口
temp=temp&0xf0;
//提取高4位
if(temp!=0xf0)
delayms(5);
temp=temp&0xf0;
if(temp!=0xf0)
//真的按键了
switch(temp)
num=0+4*i;
num=1+4*i;
num=2+4*i;
num=3+4*i;
//18号索引是负号
// 按了不该按的指示灯
//松开按键检测
//读取P3口
temp=temp&0xf0;
//提取高4位
if(temp==0xf0)
//松开按键了
delayms(5);
temp=temp&0xf0;
if(temp==0xf0)
//真的松开键盘了
showKey(num);
//静态显示按键
void T0_Work()
//T0定时器调用的工作函数
#ifndef _MY51_H_
#define _MY51_H_
#include &math.h&
#include &intrins.h&
typedef int
typedef int
typedef unsigned int
typedef unsigned int
typedef unsigned short
typedef unsigned short
typedef unsigned long
typedef unsigned long
typedef unsigned long
typedef un
typedef signed long
typedef signed long
typedef float
typedef double
typedef signed char
typedef signed char
typedef unsigned char
typedef unsigned char
//WINDOWS的windef.h里面是这么定义的
typedef unsigned char
typedef unsigned char UCHAR ;
typedef unsigned char UINT8 ;
typedef unsigned char uint8 ;
typedef unsigned char BOOL
//windows中定义BOOL为int
typedef unsigned char bool
//bool是c++的内置类型
#define TRUE
#define true
#define FALSE
#define false
#define open
//open和close用于 标志打开和关闭状态
#define OPEN
#define close
#define CLOSE
#define lock
#define start
#define START
#define stop
#define STOP
#define keyDown
#define keyUp
sbit dula =P2^6;
//段选锁存器控制
sbit wela =P2^7;
//位选锁存器控制
#define led P1
//灯总线控制
sbit led0=P1^0;
//8个led灯,阴极送低电平点亮
sbit led1=P1^1;
sbit led2=P1^2;
sbit led3=P1^3;
sbit led4=P1^4;
sbit led5=P1^5;
sbit led6=P1^6;
sbit led7=P1^7;
sbit keyS2=P3^4;
//4个独立按键
sbit keyS3=P3^5;
sbit keyS4=P3^6;
sbit keyS5=P3^7;
void displaySMG(uint8 one,uint8 two,uint8 three,uint8 four,uint8 five,uint8 six,uint8 dot);
void delayms(uint16 ms);
void T0_Work();
void delayms(uint16 ms)
//软延时函数
uint16 i,j;
for(i=i&0;i--)
for(j=113;j&0;j--)
///////////////////////////////////////////////////////////////////////////
#define dark 0x11
//在段中,0x11是第17号元素,为0是低电平,数码管不亮
#define dotDark 0xff //小数点全暗时
uint8 code table[]= {
//0~F外加小数点和空输出的数码管编码
0x3f , 0x06 , 0x5b , 0x4f , // 0 1 2 3
0x66 , 0x6d , 0x7d , 0x07 , // 4 5 6 7
0x7f , 0x6f , 0x77 , 0x7c , // 8 9 A B
0x39 , 0x5e , 0x79 , 0x71 , // C D E F
0x80 , 0x00 ,0x40
空时是第0x11号也就是第17号元素
/////////////////////////////////////////////////////////////////////////////
TH0Cout=0 ;
TL0Cout=0 ;
T0IntCout=0;
//中断计数
T0IntCountAll=0; //(N-1)/65536+1;
//总中断次数
//使用延时函数标志,初始未用
//中断处理函数执行结果之一
void startT0(uint32 ms)
//开启定时器
t=ms/1000.0;
//定时时间
fox =11.0592*(pow(10,6));
//晶振频率
N=(t*fox)/12 ;
//定时器总计数值
TH0Cout =(65536-N%6;
//装入计时值零头计数初值
TL0Cout =(65536-N%6;
T0IntCountAll=(N-1)/65536+1;
//总中断次数
TMOD=TMOD | 0x01;
//设置定时器0的工作方式为1
//打开总中断
//打开定时器中断
//定时器装入初值
//启动定时器
void delayT0(uint32 ms)
//硬延时函数,自己乱写的不好用,求指点
startT0(ms);
//启动定时器
//告诉T0定时器,起用延时模式
while(bT0Over==false); //时间没到的话继续检测
//时间到了,让标志复位
void T0_times() interrupt 1 //T0定时器中断函数
T0IntCout++;
if(T0IntCout==T0IntCountAll)
//达到总中断次数值
T0IntCout=0;
//中断次数清零,重新计时
//时间真的到了
if(bT0Delay)
//本次中断是用来延时的吗
//如果是由延时函数开启T0的话,关闭T0
//循环定时的话要重装初值,每次定时1秒,重装一次
T0_Work();
//工作函数
////////////////////////////////////////////////////////////////////////////////
void displaySMG(uint8 oneWela,uint8 twoWela,uint8 threeWela,uint8 fourWela,uint8 fiveWela,uint8 sixWela,uint8 dot)
//控制6位数码管显示函数,不显示的位用参数 dark
//段选数据清空并锁定
//////////////////////////
P0=0 //送位数据前关闭所有显示
//低电平输到数码管阳极,避免数码管吴亮
P0=table[oneWela]|((0x01&dot)?0x00:0x80);
//送段数据,使用小数点显示标志
delayms(2);
/////////////////////////
P0=table[twoWela]|((0x02&dot)?0x00:0x80);
delayms(2);
/////////////////////////
P0=table[threeWela]|((0x04&dot)?0x00:0x80);
delayms(2);
/////////////////////////
P0=table[fourWela]|((0x08&dot)?0x00:0x80);
delayms(2);
/////////////////////////
P0=table[fiveWela]|((0x10&dot)?0x00:0x80);
delayms(2);
/////////////////////////
P0=table[sixWela]|((0x20&dot)?0x00:0x80);
delayms(2);
14 顶18 踩
xouou_53320
浏览: 419170 次
void T0_Work()
//T0定时器调用的工作函数
lastSeries 写道前辈,是不是在工作以后连System ...
前辈,是不是在工作以后连System.out.println( ...
chuanwang66 写道不过改了iconv.exe路径也不 ...
正在学习,多谢分享
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'51单片机矩阵键盘扫描程序分析?
我的图书馆
51单片机矩阵键盘扫描程序分析?
我给你一个我自己写的吧 有注释
假设按下的是S1键进行如下检测(4*4键盘)
先在P3口输出 p3
低四位 行会有变化 cord_h =010 if !=
cord_h=10 if !=
输出高四位 cord_l=P3&0xf0 //此时P3口就是输入值 而不是上面的 cord_l=00
cord_h+cord_l=10=0x7e //此编码即为S1的编码
#include &reg52.h&//包含头文件 #define uchar unsigned char #define uint unsigned int
unsigned char const table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F
uchar keyscan(void); void delay(uint i);
void main() { P2=0x00;//1数码管亮 按相应的按键,会显示按键上的字符 while(1) { key=keyscan();//调用键盘扫描, switch(key) { case 0x7e:P0=table[0];//0 按下相应的键显示相对应的码值 case 0x7d:P0=table[1];//1 case 0x7b:P0=table[2];//2 case 0x77:P0=table[3];//3 case 0xbe:P0=table[4];//4 case 0xbd:P0=table[5];//5 case 0xbb:P0=table[6];//6 case 0xb7:P0=table[7];//7 case 0xde:P0=table[8];//8 case 0xdd:P0=table[9];//9 case 0xdb:P0=table[10];//a case 0xd7:P0=table[11];//b case 0xee:P0=table[12];//c case 0xed:P0=table[13];//d case 0xeb:P0=table[14];//e case 0xe7:P0=table[15];//f } } } uchar keyscan(void)//键盘扫描,使用行列反转 { uchar cord_h,cord_l;//行列值 P3=0x0f;
//行线输出全为0 cord_h=P3&0x0f; //读入列线值 if(cord_h!=0x0f) //先检测有无按键按下 { delay(100);
//去抖 cord_h=P3&0x0f; //读入列线值
if(cord_h!=0x0f) {
P3=cord_h|0xf0; //输出当前列线值
cord_l=P3&0xf0; //读入行线值
return(cord_h+cord_l);//键盘最后组合码值 } }return(0xff); //返回该值 }
void delay(uint i)//延时函数 { while(i--); }
在P3口做的键盘 你的去抖检测没有做好
[转]&[转]&[转]&
喜欢该文的人也喜欢51单片机数码管显示矩阵键盘键入值_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
51单片机数码管显示矩阵键盘键入值
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩2页未读,
定制HR最喜欢的简历
你可能喜欢用矩阵键盘使数码管显示不同的值
这是我所写的源程序,矩阵键盘的要点呢就是按键的判断:
在进行按键判断时,要注意当按键按下时P3的值就会发生变化而不是不变的
其中数码管的位选是全选即数码管全部显示
uint keyScan(){P3 = 0xf0;if((P3&0xf0)!=0xf0)//一个键被按下,P3的列项值就会由1变为2
,此处用来判断是否有键被按下{//建立两个变量用来存放行值和列值delay(100);//消抖if((P3&0xf0)!=0xf0){l = P3&0xf0;P3 = l|0x0f;//因为P3有一个键被按下,所以P3的行被按下的那个键的行数变为0h = P3&0x0f;while((P3&0x0f)!=0x0f){return (h+l);}}}}
//////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
#include&reg52.h&
#include&intrins.h&
#define uchar unsigned char
#define uint unsigned int
sbit we = P2^7;
sbit du = P2^6;
uchar code leddata[] =
//建立延迟函数
void delay(uint z)
{uint x,y;for(x =x &0;x--)for(y = 114;y&0;y--);
uint keyScan()
{P3 = 0xf0;if((P3&0xf0)!=0xf0)//一个键被按下,P3的列项值就会由1变为2
,此处用来判断是否有键被按下{//建立两个变量用来存放行值和列值delay(100);//消抖if((P3&0xf0)!=0xf0){l = P3&0xf0;P3 = l|0x0f;//因为P3有一个键被按下,所以P3的行被按下的那个键的行数变为0h = P3&0x0f;while((P3&0x0f)!=0x0f){return (h+l);}}}
void display() //显示函数 ,按下不同的键数码管显示不同的值
{switch(keyScan())
//调用键值{//第一行键值码case 0xee: P0 = leddata[0];
case 0xde: P0 = leddata[1];
case 0xbe: P0 = leddata[2];
case 0x7e: P0 = leddata[3];
//第二行键值码case 0xed: P0 = leddata[4];
case 0xdd: P0 = leddata[5];
case 0xbd: P0 = leddata[6];
case 0x7d: P0 = leddata[7];
//第三行键值码case 0xeb: P0 = leddata[8];
case 0xdb: P0 = leddata[9];
case 0xbb: P0 = leddata[10];
case 0x7b: P0 = leddata[11];
//第四行键值码case 0xe7: P0 = leddata[12];
case 0xd7: P0 = leddata[13];
case 0xb7: P0 = leddata[14];
case 0x77: P0 = leddata[15];
void main()
{//打开数码管的段选和位选we = 1;P0 = 0x00;we = 0; du = 1;P0 = leddata[2];while(1){display();
矩阵键盘在数码管上显示1-16
7.矩阵键盘读取键值 数码管显示
4×4矩阵键盘,控制数码管显示
4*4矩阵按键控制数码管显示0-F
51 单片机 C 语言编程:矩阵键盘输入,显示在数码管
51单片机的数码管和矩阵键盘
C51单片机学习(一):LED和数码管静态显示
单片机编程:让led数码管显示数字0到9
矩阵键盘扫描显示键值
基础知识_数码管动态显示,矩阵键盘
没有更多推荐了,}

我要回帖

更多关于 c52单片机数码管矩阵实现计算机 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信