这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 独立按键和点阵

共3条 1/1 1 跳转至

独立按键和点阵

工程师
2012-11-19 09:49:32     打赏

程序一:/********************************************************************
** 描述    :  按下相应的独立按键,会在数码管上显示相应的左右中
             按S19显示左
    按S18显示中
    按S17显示右
************************************************************************/
#include <reg52.H>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char

sbit KEY1 = P3^2;   
sbit KEY2 = P3^3;
sbit KEY3 = P3^4;

unsigned char code tabP2[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE};
//中 的编
unsigned char code tabP0ZHONG[]={0x00,0x3C,0x24,0x24,0xFF,0x24,0x24,0x3C};
//“左”的
unsigned char code tabP0Z[]={0x00,0x94,0x94,0xF4,0x9F,0x94,0x24,0x44};
//“右”的
unsigned char code tabP0Y[]={0x00,0xF4,0x94,0x94,0x9F,0xF4,0x24,0x44};


***********************************************************************/
void Delay_1ms(uchar i)//1ms延时
{
 uchar x,j;
 for(j=0;j<i;j++)
 for(x=0;x<=148;x++); 
}
/***********************************************************************/
uchar KEY(void)
{
 if(KEY1==0 || KEY2==0 || KEY3==0) 
 {
  Delay_1ms(20);     //20毫秒软件防抖
  if(KEY1 == 0)
  {
   Delay_1ms(100);   //延时0.1秒再进行下次按键的检测
   return 1;
  }
  if(KEY2 == 0)
  {   
   Delay_1ms(100);   //延时0.1秒再进行下次按键的检测
   return 2;
  }
  if(KEY3 == 0)
  {   
   Delay_1ms(100);   //延时0.1秒再进行下次按键的检测
   return 3; 
  }
  return 0;
 }
 return 0; 
}
/***********************************************************************/
void main()
{
 int i,temp,flag;
 while(1)
 {
  temp = KEY();
  if(temp != 0)       //这里判断是否按键按下,按下后,才改变要显示的值
  {
   flag = temp;      //存标志
  }
  for(i=0;i<8;i++)
  {
   P0=0;
   P2=tabP2[i];
   if(flag == 1)
   {   
    P0=tabP0Z[i];     //显示“左”
   }
   if(flag == 2)
   {
    P0=tabP0ZHONG[i];    //显示 中
   }
   if(flag == 3)
   {
    P0=tabP0Y[i];     //显示“右”
   }
   Delay_1ms(2);
  }  
 }
}
程序二:
//本实验的目的是点阵上可以显示1,2,3
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit KEY1=P3^2;
sbit KEY2=P3^3;
sbit KEY3=P3^4;
uchar table[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE};
uchar table1[]={0x00,0x00,0x00,0x80,0xFE,0x84,0x00,0x00};//显示1
uchar table2[]={0x00,0x00,0x00,0xDE,0x92,0xF2,0x00,0x00};//显示2
uchar table3[]={0x00,0x00,0x7F,0x49,0x49,0x00,0x00,0x00};//显示3
void delay(uint del)
{
 uint i,j;
 for(i=0;i<del;i++)
  for(j=0;j<=148;j++);
}
void main()
{ uint a;
 while(1)
{
 if(KEY1==0)
 {
  delay(100);
  
  for(a=0;a<8;a++)
   {
    P0=0;
    P2=table[a];
    P0=table1[a];
    delay(2);
   }
 }
 if(KEY2==0)
    {
  delay(100);
  for(a=0;a<8;a++)
   { P0=0;
    P2=table[a];
    P0=table2[a];
    delay(2);
   }
 }
 if(KEY3==0)
 {
  delay(100);
  for(a=0;a<8;a++)
  { P0=0;
   P2=table[a];
   P0=table3[a];
   delay(2);
  }
 }
}
}
第一个程序中,分别按下独立按键,点阵上就显示左,中,右,而且独立按键不用一直按。
第二个程序中,独立按键必须要一直按着才可以,点阵上分别显示1,2,3
请问大家怎样修改第二个程序才可以不用一直按着按键,点阵上就可以显示1,2,3。谢谢了。




关键词: 独立     按键     点阵     显示    

高工
2012-11-19 12:05:00     打赏
2楼
你的第二个程序 main()函数的while(1)内是循环读取按键管教的状态的,也可理解为一直在读,(你的按键管脚的每一次改变都在影响你的循环内容)所以你需要一直按着才能显示你想要的状态。 你可以向程序一中那样,在while(1)外设置一个变量用来存储读到的端口状态,这样的话在while(1)内查询此状态变量就可以了,(此时while内的状态变量不在更新)

高工
2012-11-19 12:06:18     打赏
3楼
以后提问题要在标题中注明,否则别人很容易忽略掉的。。。加油

共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]