PIC单片机论坛论坛展示区(非讨论区)(这个版块不能发新贴)『 乾龙盛开发板/实验板编程实例 』 → [QL200]4*4键盘矩阵程序[PIC16F877A+PICC]


  共有52620人关注过本帖树形打印

主题:[QL200]4*4键盘矩阵程序[PIC16F877A+PICC]

帅哥哟,离线,有人找我吗?
zhongruntian
  1楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 丐帮帮主
等级:老师(版主) 帖子:9899 积分:201298 威望:0 精华:32 注册:2005-3-13 12:01:00
[QL200]4*4键盘矩阵程序[PIC16F877A+PICC]  发帖心情 Post By:2007-3-13 11:36:00

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:




http://www.cevx.com/bbs/index.php
支持(0中立(1反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
zhongruntian
  2楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 丐帮帮主
等级:老师(版主) 帖子:9899 积分:201298 威望:0 精华:32 注册:2005-3-13 12:01:00
  发帖心情 Post By:2007-3-13 11:36:00

//实验目的:熟悉键盘矩阵的扫描方法
//程序中没有做按键去抖,也没有考虑多个键同时按下的情况。
//最低两位数码管显示相应的按键(如按下S10,在显示10;按下S25,则显示25)
//无按键按下的时候显示FF
//按键跟按键的扫描结果满足如下关系:
//   按键     扫描结果(result)        按键       扫描结果 
//   K10            0XE7                K18          0XB7
//   K11            0XEB                K19          0XBB
//   K12            0XED                K20          0XBD
//   K13            0XEE                K21          0XBE
//   K14            0XD7                K22          0X77
//   K15            0XDB                K23          0X7B
//   K16            0XDD                K24          0X7D
//   K17            0XDE                K25          0X7E

//硬件要求:拨码开关S4全部置ON
//          拨码开关S6全部置ON,拨码开关S5第5-6位置ON,其他位置OFF
//          其它拨码开关置OFF

#include<pic.h>              //包含单片机内部资源预定义
 __CONFIG(0x1832);       
//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡

 int  result;
 void  delay();              //delay函数申明
 void  init();               //I/O口初始化函数申明
 void  scan();               //按键扫描程序申明
 void  display(int x);       //显示函数申明
//---------------------------------------------------
                             //主程序 
void main()
{
  while(1)                   //循环工作
    {
      init();                //调用初始化子程序
      scan();                //调用按键扫描子程序
      display(result);       //调用结果显示子程序
    }
 }
 
//---------------------------------------------------
//初始化函数
void init()
 {
  ADCON1=0X07;               //设置A口为普通I/O口
  TRISA=0X0f;                //设置A口高2位为输出,低4位为输入
  TRISC=0XF0;                //设置C口高4位为输入,低4位为输出
  TRISD=0X00;                //设置D口为输出
  PORTA=0XFF;             
  PORTD=0XFF;                //先清除所有显示
 }

//---------------------------------------------------
//按键扫描程序
void scan()
{
 PORTC=0XF7;                 //C3输出低电平,其他三位输出高电平
 asm("nop");                 //插入一定延时,确保电平稳定
 result=PORTC;               //读回C口高4位结果
 result=result&0xf0;         //清除低4位
 if(result!=0xf0)            //判断高4位是否为全1(全1代表没按键按下)?
   {
     result=result|0x07;     //否,加上低4位0x07,做为按键扫描的结果
   }
 else                        //是,改变低4位输出,重新判断是否有按键按下
   {
   PORTC=0XFb;               //C2输出低电平,其他三位输出高电平
   asm("nop");               //插入一定延时,确保电平稳定
   result=PORTC;             //读回C口高4位结果
   result=result&0xf0;       //清除低4位
   if(result!=0xf0)          //判断高4位是否为全1(全1代表没按键按下)
     {
     result=result|0x0b;     //否,加上低4位0xb,做为按键扫描的结果
     }
   else                      //是,改变低4位输出,重新扫描
       {
       PORTC=0XFd;           //C1输出低电平,其他三位输出高电平
       asm("nop");           //插入一定延时,确保电平稳定
       result=PORTC;         //读回C口高4位结果
       result=result&0xf0;   //清除低4位
       if(result!=0xf0)      //判断高4位是否为全1(全1代表没按键按下)
        {
        result=result|0x0d;  //否,加上低4位0x0d,做为按键扫描的结果
        }
       else                  //是,改变低4位的输出,重新扫描
          {
          PORTC=0XFe;        //C0输出低电平,其他三位输出高电平
          asm("nop");        //插入一定延时,确保电平稳定
          result=PORTC;      //读回C口高4位结果
          result=result&0xf0;//清除低4位
          if(result!=0xf0)   //判断高四位是否为全1(全1代表没有按键按下)
            {
             result=result|0x0e;//否,加上低4位0x0e,做为按键扫描的结果
            }
          else               //是,全部按键扫描结束,没有按键按下,置无按键按下标志位
            {
             result=0xff;    //扫描结果为0xff,做为没有按键按下的标志
            }  
          }     
      }
   }
 }

//----------------------------------------------------------
//显示程序
void   display(int x)
  {
   switch(result)                
      {
       case 0xe7:
                 PORTD=0xf9;PORTA=0X2F;delay();PORTD=0xc0;PORTA=0X1F;delay();break;   //K10
       case 0xeb:
                 PORTD=0xf9;PORTA=0X2F;delay();PORTD=0xf9;PORTA=0X1F;delay();break;   //K11
       case 0xed:
                 PORTD=0xf9;PORTA=0X2F;delay();PORTD=0xa4;PORTA=0X1F;delay();break;   //K12
       case 0xee:
                 PORTD=0xf9;PORTA=0X2F;delay();PORTD=0xb0;PORTA=0X1F;delay();break;   //K13
       case 0xd7:
                 PORTD=0xf9;PORTA=0X2F;delay();PORTD=0x99;PORTA=0X1F;delay();break;   //K14
       case 0xdb:
                 PORTD=0xf9;PORTA=0X2F;delay();PORTD=0x92;PORTA=0X1F;delay();break;   //K15
       case 0xdd:
                 PORTD=0xf9;PORTA=0X2F;delay();PORTD=0X82;PORTA=0X1F;delay();break;   //K16
       case 0xde:
                 PORTD=0xf9;PORTA=0X2F;delay();PORTD=0XF8;PORTA=0X1F;delay();break;   //K17
       case 0xb7:
                 PORTD=0xf9;PORTA=0X2F;delay();PORTD=0X80;PORTA=0X1F;delay();break;   //K18
       case 0xbb:
                 PORTD=0xf9;PORTA=0X2F;delay();PORTD=0X90;PORTA=0X1F;delay();break;   //K19
       case 0xbd:
                 PORTD=0xa4;PORTA=0X2F;delay();PORTD=0xc0;PORTA=0X1F;delay();break;   //K20
       case 0xbe:
                 PORTD=0xa4;PORTA=0X2F;delay();PORTD=0xf9;PORTA=0X1F;delay();break;   //K21
       case 0x77:
                 PORTD=0xa4;PORTA=0X2F;delay();PORTD=0xa4;PORTA=0X1F;delay();break;   //K22
       case 0x7b:
                 PORTD=0xa4;PORTA=0X2F;delay();PORTD=0xb0;PORTA=0X1F;delay();break;   //K23
       case 0x7d:
                 PORTD=0xa4;PORTA=0X2F;delay();PORTD=0x99;PORTA=0X1F;delay();break;   //K24
       case 0x7e:
                 PORTD=0xa4;PORTA=0X2F;delay();PORTD=0x92;PORTA=0X1F;delay();break;   //K25
       case 0xff:
                 PORTD=0x8e;PORTA=0X2F;delay(); PORTD=0x8e; PORTA=0X1F; delay();      //无按键按下
      }
   }

//------------------------------------------------------------------
//延时程序
void  delay()              //延时程序
    {
     int i;                 //定义整形变量
     for(i=0x100;i--;);     //延时
    }

    



http://www.cevx.com/bbs/index.php
支持(1中立(1反对(1单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
caiming235
  3楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:初中三年级 帖子:65 积分:1372 威望:0 精华:0 注册:2008-2-24 9:01:00
  发帖心情 Post By:2008-2-24 10:42:00

谢谢

支持(1中立(0反对(2单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
xinge3721
  4楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小学三年级 帖子:10 积分:486 威望:0 精华:0 注册:2007-9-8 16:41:00
  发帖心情 Post By:2008-3-26 18:55:00

最后的延时程序中的for(i=0x100;i--;)有问题吧?

支持(4中立(2反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
zhang
  5楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小学六年级 帖子:35 积分:900 威望:0 精华:0 注册:2005-9-27 21:43:00
  发帖心情 Post By:2008-4-4 17:04:00

因改为for(i=0x100;i>=0;i--);


支持(0中立(2反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
zhongruntian
  6楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 丐帮帮主
等级:老师(版主) 帖子:9899 积分:201298 威望:0 精华:32 注册:2005-3-13 12:01:00
  发帖心情 Post By:2008-4-23 22:35:00

没问题,可以这样用.而且这样用编译后占用资源最少.


http://www.cevx.com/bbs/index.php
支持(0中立(2反对(2单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
lsx88898
  7楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小学一年级 帖子:3 积分:263 威望:0 精华:0 注册:2009-5-4 18:55:00
  发帖心情 Post By:2009-5-4 18:58:00

在哪呢?


支持(0中立(1反对(2单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
lsx88898
  8楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小学一年级 帖子:3 积分:263 威望:0 精华:0 注册:2009-5-4 18:55:00
  发帖心情 Post By:2009-5-5 9:37:00

so hard


支持(0中立(0反对(2单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
haung
  9楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小学六年级 帖子:28 积分:845 威望:0 精华:0 注册:2008-5-30 12:49:00
  发帖心情 Post By:2009-7-12 15:41:00

very very good

支持(1中立(1反对(1单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
西湖情结
  10楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小学一年级 帖子:1 积分:229 威望:0 精华:0 注册:2010-8-5 23:00:00
  发帖心情 Post By:2010-8-7 11:48:00

      这个程序有问题吧,你们下载到QL200开发板上能运行吗,为什么我的不行,我把初始化程序中的TRISC=0XF0改为TRISC=0X00后,按键可以响应,但并不是显示从10~25。

      另外,请问在用QL200做4*4矩阵键盘实验时,我把PORTC的高四位设为输入,低四位设为输出,上拉电阻接通。我不按键的时候,PORTC高四位通过10k的上拉电阻输入的是高电平还是低电平?为什么?非常感谢。


支持(2中立(2反对(0单帖管理 | 引用 | 回复 回到顶部

返回版面帖子列表(如果下面的回复窗口不可输入,请点“代码模式”再点“设计模式”)

[QL200]4*4键盘矩阵程序[PIC16F877A+PICC]








签名    小提示:如果上面的回复窗口不可输入,请先点“代码模式”然后再点“设计模式”,然后就可输入回复内容了
Google 全部 本站