栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

键盘检测原理及应用实现

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

键盘检测原理及应用实现

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

#include         //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,
0xF9,
0xA4,
0xB0,
0x99,
0x92,
0x82,
0xF8,
0x80,
0x90,
0x88,
0x83,
0xC6,
0xA1,
0x86,
0x8E,
0x89,
0xC7,
0xC8,
0xC1,
0x8C,
0xA3,
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--);
    }
 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/510831.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号