键盘检测原理及应用实现

例 4.1.1用数码管的前两位显示一个十进制数,变化范围为 00~59, 开始时显示 00, 每按下S2 键一次, 数值加 1; 每按下S3 键一次, 数值减 1;每按下 S4 键一次, 数值归零; 按下 S5 键一次, 利用定时器功能使数值开始自动每秒加 1, 再次按下 S5 键, 数值停止自动加 1, 保持显示原数。新建文件 jianpan.c, 程序代码如下:
 

#include <reg52.h>         //52系列单片机头文件
#define uchar unsigned char
#define uint unsigned int
sbit key1 = P3^4;
sbit key2 = P3^5;
sbit key3 = P3^6;
sbit key4 = P3^7;
sbit dula = P2^5;           //申明U1锁存器的锁存端
sbit wela = P2^6;           //申明U2锁存器的锁存端
uchar code table[]={
0xC0, /*/"0"*/
0xF9, /*/"1"*/
0xA4, /*/"2"*/
0xB0, /*/"3"*/
0x99, /*/"4"*/
0x92, /*/"5"*/
0x82, /*/"6"*/
0xF8, /*/"7"*/
0x80, /*/"8"*/
0x90, /*/"9"*/
0x88, /*/"A"*/
0x83, /*/"B"*/
0xC6, /*/"C"*/
0xA1, /*/"D"*/
0x86, /*/"E"*/
0x8E, /*/"F"*/
0x89, /*/"H"*/
0xC7, /*/"L"*/
0xC8, /*/"n"*/
0xC1, /*/"u"*/
0x8C, /*/"P"*/
0xA3, /*/"o"*/
0xBF, /*/"-"*/
0xFF, /*/熄灭*/
0xFF /*/自定义*/
};
void delayms(uint xms);      
uchar num,numt0;  
void dispaly(uchar numdis)  //显示子函数
{
    uchar shi,ge;
    shi=numdis/10;
    ge=numdis%10;

    dula=1;
    P0=table[shi];  //送段选数据
    dula=0;
    
    P0=0xff    ;      //送位选数据前关闭所有显示,防止打开位选锁存时
    
    wela=1;          //原来段选数据通过位选锁存器造成混乱
    P0=0x01    ;      //送位选数据
    wela=0;          //关闭U2锁存器
    delayms(5); //延时

    dula=1;
    P0=table[ge];  //送段选数据
    dula=0;
    
    P0=0xff    ;      //送位选数据前关闭所有显示,防止打开位选锁存时
    
    wela=1;          //原来段选数据通过位选锁存器造成混乱
    P0=0x02    ;      //送位选数据
    wela=0;          //关闭U2锁存器
    delayms(5); //延时
}
void init()  //初始化函数
{
  TMOD=0x01;  //设置定时器0为工作方式1(0000 0001)
  TH0=(65536-45872)/256;//装初值50ms一次中断
  TL0=(65536-45872)%256;//装初值50ms一次中断
  EA=1;        //开总中断
  ET0=1;    //开定时器0中断
}
void keyscan()
{
   if(key1==0)
   {
      delayms(10);
      if(key1==0)
      {
        num++;
        if(num==60)     //当到60时重新归0
          num=0;
        while(~key1);//等待按键释放
        }
    }
   if(key2==0)
   {
      delayms(10);
      if(key2==0)
      {
        if(num==0)     //当到0时重新归60
          num=60;
          num--;
        while(~key2);//等待按键释放
        }
    }
   if(key3==0)
   {
      delayms(10);
      if(key3==0)
      {
        num=0;         //清零
        while(~key3);//等待按键释放
        }
    }
   if(key4==0)
   {
      delayms(10);
      if(key4==0)
      {
        while(~key4);//等待按键释放
        TR0=~TR0;//启动或停止定时器0
        }
    }
}
void T0_time()interrupt 1
{
  TH0=(65536-45872)/256;//重装初值
  TH0=(65536-45872)%256;
  numt0++;                //num每加一次判断一次是否到了20次
  if(numt0==20)
  {
    numt0=0;
    num++;
    if(num==60)
    num=0;
    }
}
void main()
{
    init();
    while(1)
    {
      keyscan();
      dispaly(num);
      }
    }


void delayms(uint xms)
{
    uint i,j;
    for(i=xms;i>0;i--)
        for(j=110;j>0;j--);
    }
 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值