找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机矩阵键盘输入并显示 仿真电路加c51程序

[复制链接]
ID:103074 发表于 2016-1-13 17:06 | 显示全部楼层 |阅读模式
1.png 0.png

仿真电路加 c程序下载: 矩阵键盘.zip (26.45 KB, 下载次数: 21)

源程序代码预览:
  1. #include<reg52.h>
  2. typedef unsigned char u8;
  3. typedef unsigned int  u16;
  4. sbit seg_sel=P1^4;
  5. sbit bit_sel=P1^5;
  6. #define DATA P0
  7. u8 seg_tab[]={
  8.       0xc0,0xf9,0xa4,0xb0,
  9.       0x99,0x92,0x82,0xf8,
  10.       0x80,0x90,0x88,0x83,
  11.       0xc6,0xa1,0x86,0x8e,

  12. };
  13. u8 bit_tab[]={
  14.        0x80,0x40,0x20,0x10,
  15.        0x08,0x04,0x02,0x01,
  16. };
  17. void delay(unsigned int num)
  18. {
  19.   unsigned int x,y;
  20.   for(x=num;x>0;x--)
  21.   for(y=110;y>0;y--);//延时1ms
  22. }
  23. void display_led(u8 which_bit,u8 which_numbe)
  24. {
  25.    bit_sel=1;//D[7-0]=Q[7-0]P1^4片选信号锁存器1
  26.      DATA=bit_tab[which_bit];//DATA=P0输出which_bit8位
  27.      bit_sel=0;//BIT[7-0]=0x80
  28.      delay(1);
  29.     seg_sel=1;//P1^5片选信号锁存器2启动
  30.      DATA=seg_tab[which_numbe];//P0口输出which_numbe8位
  31.     seg_sel=0;
  32.      delay(1);
  33. }

  34. u8 _key_scan (void)//按键识别函数
  35. {
  36.   u8 temp,temp2;
  37.   P2=0xf0;//让P2输出0xf0
  38.   temp=P2;//读入P2的值
  39.   if(temp!=0xf0)//当P2不等于0xf0
  40.   {
  41.     delay(5);//延迟5ms
  42.     temp=P2;//在读入P2值
  43.     if(temp!=0xf0)//如果P2不等于0xf0
  44.      {            //说明有按键按下
  45.       temp2=temp&0xf0;//取出P2口高4位
  46.       P2=0x0f;//在P2=0x0f
  47.       delay(1);
  48.       temp=P2;//读入P2口值
  49.       temp2=temp2|temp;//保留低4位并
  50.        return temp2;
  51.       }//while(P2!=0xf0);//等待 //并与取出的高4位与
  52.    }
  53. }



  54. u8 encolde(u8 cod)//解码函数
  55. {
  56.     u8 num;
  57.    switch(cod)
  58.    {
  59.      case 0xee:num=0;break;//11101110
  60.      case 0xde:num=1;break;//11011110
  61.      case 0xbe:num=2;break;//10111110
  62.      case 0x7e:num=3;break;//01111110
  63.     // case 0xed: num=4; break;//11101101
  64.      case 0xed:num=4;break;
  65.      case 0xdd:num=5;break;//11011101
  66.      case 0xbd:num=6;break;//10111101
  67.      case 0x7d:num=7;break;//01111101
  68.      case 0xeb:num=8;break;//11101011
  69.      case 0xdb:num=9;break;//11011011
  70.      case 0xbb:num=10;break;//10111011
  71.      case 0x7b: num = 11; break;//01111011
  72.      case 0xe7: num = 12; break;//11100111
  73.      case 0xd7:num=13;break;//11010111
  74.      case 0xb7:num=14;break;//10110111
  75.      case 0x77:num=15;break;//01110111
  76.     default : break;//无影响
  77.     }
  78.      return num;
  79. }

  80. void main (void)
  81. {
  82.   u8 cod, num;
  83.    P0=0xff;
  84.    P1=0xff;//初始化P1;P2
  85.    seg_sel=0;//IE禁止 锁存
  86.    bit_sel=0;
  87.    while(1)
  88.     {
  89.       cod=_key_scan();
  90.       num=encolde(cod);
  91.      display_led(1,num);
  92.       }
  93. }
复制代码


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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