谁知道键盘控制数码管显示的方法是怎样的?



				
				
薰妍maggiel
7889 次浏览 2024-06-19 提问
120

最新回答 (3条回答)

2024-06-21 01:54:27 回答

首先定义接口,比如:
#include“reg51.h”
sbit  S1  =P1^0;
sbit  S2  =P1^1;
sbit  S3  =P1^2;
sbit  S4  =P1^3;  //按键对应的单片机IO
sbit  SMG_EN    P1^4;    //数码管选通
sbit  SMG_SET()  SMG_EN  =0  //数码管公共使能
sbit  SMG_CLR()  SMG_EN  =1  //数码管公共失能
define  GPIO_PORT    P2    //数码管8位数据口  
//以上是按键及数码管对应的单片机IO,下面来写驱动程序,首先需要定义一个字符码
unsigned  char  ascll[]={xx0,xx1,xx2,xx3,xx4,xx5,xx6,xx7,xx8,xx9};//此数组的值需要根据数码管与单片机数据口的实际对应关系来写,数组0-9偏移量分别对应数码管显示0-9的数值码希望你能明白这一点。
/*  延时函数  */
void  Delay(unsigned  long  w)
while(w--);
//下面先来写一个驱动函数
void  DisPlay(unsigned  char  dat)
SMG_SET();//数码管选通
GPIO_PORT  =dat;//将数据Dat送给数码管显示  
//按键扫描函数,按键对应的是P1最低4位
unsigned  char  key()
unsigned  char  temp;
P1  =0xff;
if((P1&0x0f)!=0x0f)  //如果P1口低4为不为f则表明有按键按下,下面判断是哪个按键  
Delay(1000);  //延时约20ms用来消抖,必须的
if((P1&0x0f)!=0x0f)//消抖后在判断一次如果低4位不为f就表示确实有按键按下
temp  =GPIO_RORT&0x0f;  //将IO上的按键值读给变量temp
switch(temp)  //判断是哪个键被按下
case  0x0e:      //表示是S1被按下1110
DisPlay(1);//显示1
break;
case  0x0d:    //表示是S2被按下1101
DisPlay(2);//显示2
break;
case  0x0b:    //表示是S3被按下1011
DisPlay(3);//显示3
break;
case  0x07:    //表示是S4被按下0111
DisPlay(4);//显示4
break;
while((P1&0x0f)!=0x0f);  //如果按键还一直被按着,则等待用户松开按键
Delay(1000);//延时20ms消抖
void  main()
while(1)  
key();//调用按键函数
一口气从上面写到下面,给你参考,希望对你有帮助

2024-06-21 01:54:27 回答

要关闭数码管,首先要知道你的显示方式,现在从你的位码看,应该是低电平有效吧,那就是在位选为高的时候就不显示了,这样就好办了啊,两个按键,那就直接独立按键,检测按键后,是关闭的那个按键按下,那就把位选全部置位,这样就不现实了,要显示的时候,取消置位,正常显示就好。

2024-06-21 01:54:27 回答

设置三个标志位,全局变量,需要在倒计时中断里改变状态的。
主程序流程:
上电初始化(设置LED状态,设置定时器相关寄存器参数,设置三个标志位状态)--->  死循环(判断标志位是否容许按键有效,然后判断是否有按键按下,转入响应的子程序处理段)
定时器中断任务:
判断是否到15秒,到了就置位标志位。

相关问题

页面运行时间: 0.11777305603027 秒