找回密码
 立即注册

QQ登录

只需一步,快速开始

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

上传个单片机键盘扫描的源程序

[复制链接]
跳转到指定楼层
楼主
ID:276550 发表于 2018-1-16 14:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    随手上传

单片机源程序如下:
  1. /****************************************************

  2. 电路图说明:
  3.         使用P3口做为矩阵键盘的输入端,前四位控制行线,后
  4. 四位控制列线。
  5. 程序功能:逐列扫描识别法 + 定时查询方式
  6.         使用数码管显示,4*4矩阵键盘,按下的键号,键盘键号
  7. 使用行扫描法。
  8.        
  9. ****************************************************/

  10. #include<reg52.h>
  11. #define uint unsigned int
  12. #define uchar unsigned char

  13. sbit duan=P2^0;
  14. sbit wei=P2^1;
  15. uchar num;//存放数码管显示数值
  16. uchar code d_table[]={
  17. 0x3f  , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d ,
  18. 0x7d , 0x07 , 0x7f  , 0x6f , 0x77 , 0x7c ,
  19. 0x39 , 0x5e , 0x79 , 0x71 , 0x00};//共阴0~F段码
  20. uchar code w_table[]={
  21. 0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//1-6位选码

  22. void init();//启动定时器0
  23. void delay(uint);//最小1ms延迟

  24. uchar keyscan();//键盘是否按下扫描函数,
  25.                                 //函数返回按下按键键值,无按键按下时返回16

  26. void display_2wei(uint);//数码管两位动态显示函数

  27. void main()
  28. {
  29.         init();
  30.         while(1)
  31.         {
  32.                 ;       
  33.         }
  34. }

  35. void init()
  36. {
  37.         num=16;

  38.         EA=1;
  39.         ET0=1;
  40.     ET1=1;
  41.         PT0=1;//将数码管刷新定时器中断定为高优先级
  42.           //以保证数码管正常显示
  43.         TMOD=0x11;
  44.         TH0=(65535-20000)/256;
  45.         TL0=(65535-20000)%256;
  46.         TH1=(65535-10000)/256;
  47.         TL1=(65535-10000)%256;
  48.         TR0=1;
  49.         TR1=1;
  50. }
  51. void delay(uint z)
  52. {
  53.         uint i,j;
  54.         for(i=z;i>0;i--)
  55.                 for(j=110;j>0;j--);       
  56. }

  57. uchar keyscan()//如果无按键按下返回16
  58. {
  59.         uchar temp,i,key_read;
  60.     static uchar key_value=16;

  61.     temp=0xef;//预置第0列输出0的设置值
  62.     for(i=0;i<4;i++)//4次列扫描
  63.         {
  64.           P3=temp;//4次循环,依次置0->1->2->3列输出0
  65.           if((key_read=P3)!=temp)//判断该列上有无按键按下
  66.           {
  67.                 delay(10);
  68.                 if((key_read=P3)!=temp)
  69.                 {
  70.                         key_read=~key_read;
  71.                         while(P3!=temp);
  72.                         switch(key_read&0x0f)//只留行值
  73.                     {
  74.                      case 0x01:key_value=i; break;//得第0行按键键号
  75.                            
  76.                          case 0x02:key_value=4+i; break;//得第1行按键键号
  77.                          
  78.                          case 0x04:key_value=8+i; break;//得第2行按键键号
  79.                          
  80.                          case 0x08:key_value=12+i;break;//得第3行按键键号
  81.                          
  82.                          default:  key_value=16;break;       
  83.                         }
  84.                         return key_value;               
  85.             }       
  86.       }
  87.           temp=(temp<<1)|0x01;        //得使下一列输出0的设置值
  88.         }
  89.         return key_value;
  90. }

  91. void display_2wei(uint m_num)
  92. {
  93.         uchar ge,shi;
  94.         ge=m_num%10;
  95.         shi=(m_num/10)%10;
  96.        
  97.         //十位数
  98.         P0=w_table[1];
  99.         wei=1;
  100.         wei=0;
  101.        
  102.         P0=d_table[shi];
  103.         duan=1;
  104.         duan=0;
  105.        
  106.         delay(5);
  107.        
  108.         //个位数
  109.         P0=w_table[2];
  110.         wei=1;
  111.         wei=0;
  112.        
  113.         P0=d_table[ge];
  114.         duan=1;
  115.         duan=0;
  116.        
  117.         delay(5);
  118. }

  119. void timer0_20ms() interrupt 1
  120. ……………………

  121. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
矩阵.rar (12.49 KB, 下载次数: 10)


评分

参与人数 1黑币 +6 收起 理由
vktpas + 6

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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