英山论坛-英山人的网上家园

 找回密码
 注册

QQ登录

只需一步,快速开始

扫描二维码登录本站

查看: 1280|回复: 0

单片机 距阵键盘

[复制链接]

6

主题

26

回帖

44

积分

论坛游侠

积分
44
发表于 2011-1-3 13:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转英山论坛。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 华尔 于 2011-1-4 10:24 编辑
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. uchar key=16,key_p=16;
  6. uchar code table[]={
  7. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,     //共阴数码管段选码表,无小数点
  8.            
  9. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};


  10. void delay(uint ms)
  11. {
  12.         uchar i;
  13.         while(ms--)
  14.         for(i=0;i<110;i++);
  15. }
  16. void key_press()
  17. {
  18.         uchar kess;

  19.                     P1=0x0f;                                
  20.                     delay(1);
  21.                     kess=P1^0x0f;         //P1口的状态异或上0x0f,如果下了高4位不管,看低4位是多少
  22.                         switch (kess)
  23.                         {
  24.                                 case 1:key=0; break;
  25.                                 case 2:key=1; break;
  26.                                 case 4:key=2; break;
  27.                                 case 8:key=3; break;
  28.                                 default: key = 16;
  29.                         }
  30.                          P1=0xf0;
  31.                         delay(1);
  32.                         kess=P1>>4^0x0f;
  33.                         switch (kess)
  34.                         {
  35.                                 case 1:key+=12;break;
  36.                                 case 2:key+=8; break;
  37.                                 case 4:key+=4; break;
  38.                                 case 8:key+=0; break;
  39.                                 
  40.                         }
  41.                   
  42.         
  43. }
  44. void key_tst()
  45. {        
  46.         if(P1!=0xf0)
  47.          delay(5);
  48.          if(P1!=0xf0)
  49.                 key_press();
  50.                 if(key_p!=key)
  51.                
  52.                 {        
  53.                         P0=table[key];
  54.                         P2=0xff;
  55.                         
  56.                         key_p=key;
  57.                 }        
  58.            delay(100);
  59. }


  60. void main()
  61. {         
  62.         P0=0x00;
  63.         while(1)
  64.         {
  65.                 key_tst();
  66.                 P2=0xfe;        
  67.         }
  68. }
复制代码
支持英山论坛,做英山建设的促进派。

QQ|免责声明|手机版|小黑屋|英山在线 ( 鄂ICP备12016885号 ) |鄂公网安备42112402000088号 未成年人保护热线:12345

GMT+8, 2024-11-25 09:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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