找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4161|回复: 0
打印 上一主题 下一主题
收起左侧

单片机3个IO做9个按键程序

[复制链接]
跳转到指定楼层
楼主
ID:71259 发表于 2014-12-30 00:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include<reg51.h>
  2. //P0.0-P0.2
  3. unsigned char leddata[]={

  4.                 0xC0,  //"0"
  5.                 0xF9,  //"1"
  6.                 0xA4,  //"2"
  7.                 0xB0,  //"3"
  8.                 0x99,  //"4"
  9.                 0x92,  //"5"
  10.                 0x82,  //"6"
  11.                 0xF8,  //"7"
  12.                 0x80,  //"8"
  13.                 0x90,  //"9"
  14.                 0x88,  //"A"
  15.                 0x83,  //"B"
  16.                 0xC6,  //"C"
  17.                 0xA1,  //"D"
  18.                 0x86,  //"E"
  19.                 0x8E,  //"F"
  20.                 0x89,  //"H"
  21.                 0xC7,  //"L"
  22.                 0xC8,  //"n"
  23.                 0xC1,  //"u"
  24.                 0x8C,  //"P"
  25.                 0xA3,  //"o"
  26.                 0xBF,  //"-"
  27.                 0xFF,  //熄灭
  28.                 0xFF  //自定义

  29.                          };

  30. unsigned char key;

  31. void delay(unsigned char x)
  32. {
  33. unsigned char i;
  34. while(x--)
  35.   for(i=0;i<115;i++);
  36. }


  37. void keyscan()
  38. {
  39. //------先扫描直接接地的3个按键-----//
  40. P0|=0X07;  //先将IO拉高
  41. if(P0&0X01==0){
  42.   delay(15);
  43.   key=7;
  44.   return;
  45. }
  46. else if(P0&0x02==0){
  47.   delay(15);
  48.   key=8;
  49.   return;
  50. }
  51. else if(P0&0x04==0){
  52.   delay(15);
  53.   key=9;
  54.   return;
  55. }  

  56. //------接着对逐一对IO口进行扫键-----//
  57. P0|=0X07;   //先将IO拉高,很重要
  58. P0&=0XFE;  //P0.0置0
  59. if((P0&0X02)==0){
  60.   delay(15);
  61.   if((P0&0X02)==0){
  62.    P0|=0X07;    //对地的按键优先级高,这里是为了防止误判
  63.    if((P0&0X07)==0X07)
  64.     key=1;
  65.    else
  66.        key=8;  

  67.    return;
  68.   }
  69. }
  70. else if((P0&0X04)==0){
  71.   delay(15);
  72.   if((P0&0X04)==0){
  73.    P0|=0X07;
  74.    if((P0&0X07)==0X07)
  75.     key=2;
  76.    else
  77.     key=9;
  78.    return;
  79.   }
  80. }

  81. P0|=0X07;//先将IO拉高,很重要
  82.   P0&=0XFD;
  83. if((P0&0X01)==0){
  84.   delay(15);
  85.   if((P0&0X01)==0){
  86.    P0|=0X07;
  87.    if((P0&0X07)==0X07)
  88.     key=3;
  89.    else
  90.        key=7;
  91.    return;   
  92.   }  
  93. }
  94. else if((P0&0X04)==0){
  95.   delay(15);
  96.   if((P0&0X04)==0){
  97.       P0|=0X07;
  98.    if((P0&0X07)==0X07)
  99.        key=4;
  100.    else
  101.       key=9;  
  102.    return;   
  103.   }
  104. }

  105. P0|=0X07; //先将IO拉高,很重要
  106. P0&=0XFB;
  107. if((P0&0X01)==0){
  108.   delay(15);
  109.   if((P0&0X01)==0){
  110.       P0|=0X07;
  111.    if((P0&0X07)==0X07)
  112.     key=5;
  113.    else
  114.     key=7;
  115.    return;   
  116.   }
  117. }
  118. else if((P0&0X02)==0){
  119.   delay(15);
  120.   if((P0&0X02)==0){
  121.    P0|=0X07;
  122.    if((P0&0X07)==0X07)
  123.     key=6;
  124.    else
  125.     key=8;
  126.    return;   
  127.   }
  128. }

  129. }

  130. void main()
  131. {
  132. while(1){
  133.   keyscan();
  134.   P3=leddata[key];
  135. }
  136. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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