一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 3222|回复: 3

[其他综合] 自己觉得比较好的按钮扫描程序,有仿真

[复制链接]
发表于 2011-10-8 20:15 | 显示全部楼层 |阅读模式
#include<reg52.h>
#define un8 unsigned char
#define un16 unsigned int
sbit Press_key = P2^0;//按键的I/O
sbit Press_key1 = P3^4;
un8 bdata Control_Port;     // 声明一个可位寻址的字节变量
sbit     new_value = Control_Port^1;   // 引用该字节变量的某一位
sbit     old_value = Control_Port^2;
sbit     new_value1 = Control_Port^3;   // 引用该字节变量的某一位
sbit     old_value1 = Control_Port^4;
sbit led=P1^0;
sbit e= P0^2;
sbit rs=P0^3;
un8 code TAB[]={"0123456789"};
void lcdinit();    //1602初始化
void lcdcom(un8 com); //1602写指令
void lcddata(un8 dat); //1602写数据
void Delay(un8 xms);  
void Delay1(un16 xus);
un8 COUTER=0;
////*********************////
main()
{
   
  EA=1;
  ET0=1;
  TMOD|=0X01;
  TH0=(65536-60536)/256;
  TL0=(65536-60536)%256;
  TR0=1;
  //old_value=1;
// old_value1=1;
  lcdinit();
      //lcdcom(0X82);//第1行第3位
     
  while(1)
   {
   lcdcom(0X80);//第1行第3位

   lcddata('n');
   lcddata(TAB[COUTER/10]);
   lcddata(TAB[COUTER%10]);
  }
  //其他代码
}
/*void P_key() //按下后松开有效
{
   
     new_value =Press_key;
     if(new_value && !old_value)//识别按键。
  {
         
         led=~led;                  
   
  }
     old_value = new_value;
} */
////**************************************////
void Timer0_interrupt() interrupt 1 using 2
{
     un8    ban,can;
  TH0=(65536-65500)/256;
  TL0=(65536-65500)%256;

////////////////////////////////////////////////////  
  new_value =Press_key;
     if(!new_value && old_value)//识别按键。(按下即有效)
  {
         
         COUTER++;
   if(100==COUTER)
    {
    COUTER=0;
   }                 
   
  }
     old_value = new_value;
  
//短按减1,长按按下后先减1,按下超过25X65.5MS后每4x65.5MS减1//                          
     new_value1 =Press_key1;
     if(!new_value1 && old_value1)//短按立即有效.
  {
         COUTER--;
   can=0;
   if(255==COUTER)
    {
       COUTER=99;
   }
   
        }
  if(!new_value1&&!old_value1)  //按下未松开则每65,5MS can+1
     {
   can++;
   if(can>25)
    {
    ban++;
    if(4==ban)
     {
       ban=0;
    COUTER--;
    if(255==COUTER)
      {
         COUTER=99;
     }
    }
    }
   }
  
old_value1 = new_value1;
   
}

////***************Lcd初始化****************************////
void lcdinit()
{
  Delay(15);
   lcdcom(0x33);
    Delay(5) ;
     lcdcom(0x32);
      Delay(2);
    lcdcom(0x2); //4线模式
        Delay(1);
   lcdcom(0x06); //地址增量1,字符不动
          lcdcom(0x0C); //显示开,光标关,光标不闪
              lcdcom(0x28);
      lcdcom(0x01); //清屏
       Delay(5);
        lcdcom(0x02); //光标复位
     
}
////*********LCD写指令***********/////
void lcdcom(un8 com)
{
//un8 temp;
// temp=com;
   P0=com|0x0f; //不需要前面两条,因为COM的值未变
    rs=0;
      Delay1(2);
       e=1;
        Delay1(2);
         e=0;
   
//com=temp;
  P0=(com<<4)|0x0f;
   rs=0;
     Delay1(2);
      e=1;
       Delay1(2);
        e=0;
    }
////*****************LCD写数据**************////
void lcddata(un8 dat)
{
// un8 temp1;
// temp1=dat;
P0=dat|0x0f;
    rs=1;
Delay1(2);
e=1;
Delay1(2);
e=0;
// dat=temp1;
P0=(dat<<4)|0x0f;
    rs=1;
Delay1(2);
e=1;
Delay1(2);
e=0;
}
////************************////
void Delay(un8 xms)
{
un8 i,j;
for(i=xms;i>0;i--)
    for(j=120;j>0;j--);
}  
////**********************////   
void Delay1(un16 xus)
{
un16 i,j;
for(i=xus;i>0;i--)
    for(j=25;j>0;j--);
}
key1好.rar (53.53 KB, 下载次数: 492)
发表于 2011-10-10 19:56 | 显示全部楼层
这要顶,谢谢分享
回复

使用道具 举报

发表于 2011-10-10 20:25 | 显示全部楼层
谢谢分享~
回复

使用道具 举报

发表于 2011-10-13 22:48 | 显示全部楼层
本帖最后由 mfkyygt 于 2011-10-13 22:50 编辑

个人觉得上软件流程图比上代码好,或者代码可以作为附件,呵,让人明白设计思路很重要。
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-11-5 05:14 , Processed in 0.030862 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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