找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3552|回复: 0
收起左侧

线反转法扫描键盘程序

[复制链接]
ID:71259 发表于 2014-12-30 01:51 | 显示全部楼层 |阅读模式


  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit fmq=P3^6;
  5. sbit P27=P2^7;  //位显示,最右边
  6. uchar code dis_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};
  7.              //code 的作用是把s8存到8K的ROM中
  8.    //共阳数码光显示字型数码组 1011 1111 “-”
  9. uchar code key_code[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77 };
  10. uchar key;
  11. void delay1ms(uchar n)     //1ms基准延时程序
  12. {
  13. uchar i;
  14. while(n--)
  15.   for(i=0;i<115;i++);
  16. }

  17. void delay500us()    //   500us延时
  18. {

  19. uchar i;

  20.   for(i=0;i<57;i++);   //500us基准延时程序

  21. }

  22. void beep() //产生1KHZ频率声音的函数
  23. {
  24.   fmq=0;
  25. delay500us();
  26. fmq=1;
  27. delay500us();

  28. }
  29. uchar key_scan()  //扫描键盘
  30. {
  31. uchar scan1,scan2,keycode,i;
  32. P1=0xf0;
  33. scan1=P1;
  34. if((scan1&0xf0)!=0xf0){          //判断是否按键
  35.   delay1ms(15);        //延时消陡
  36.   scan1=P1;
  37.   if((P1&0xf0)!=0xf0){    //二次判断是否按键
  38.    P1=0x0f;           //线反转法德核心
  39.    scan2=P1;
  40.    keycode=scan1|scan2;       //组合成键编码
  41.   }
  42.   for(i=0;i<16;i++){
  43.    if(keycode==key_code[i]){  //查表得键值
  44.     key=i;  
  45.     return key;
  46.    }
  47.   }
  48. }
  49. else{
  50.   P1=0xff;   //P1口写1,输入状态
  51.   return 16;
  52. }
  53.    

  54. }


  55. void main()
  56. {
  57.     uchar t;
  58. P0=0xbf;
  59. P27=0;
  60. P1=0xff;   //写1,读状态

  61. while(1)
  62. {
  63.   P1=0xf0;
  64.   if((P1&0xf0)!=0xf0){      // 判断按键
  65.    key_scan();
  66.    P0=dis_code[key];
  67.    for(t=0;t<200;t++)
  68.     beep();
  69.    fmq=1;
  70.    delay1ms(200);
  71.   }
  72. }
  73. }
复制代码


回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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