电子开发网

电子开发网电子设计 | 电子开发网Rss 2.0 会员中心 会员注册
搜索: 您现在的位置: 电子开发网 >> 电子开发 >> 单片机 >> 正文

51单片机4*4扫描C程序

作者:佚名    文章来源:本站原创    点击数:    更新时间:2011/3/31
;******************************************************
;*标题:    东哥   51单片机4*4扫描C程序  
;*文件:                            
;*版本:    1.0 
;*作者:    东哥    
;*邮箱:    picavr@163.com     QQ: 279068079

;*******************************************************   

#include "reg52.h"
#include<intrins.h>
#define  uchar unsigned char  
#define  uint  unsigned int
bit FLAG0=0;
uchar ptr;
static const char tab[16]={0x01,0x02,0x03,0x0c, /*键盘码00,01,02,03,*/
                           0x04,0x05,0x06,0x0d, /*键盘码04,05,06,07,*/
                           0x07,0x08,0x09,0x0e, /*键盘码08,09,0a,0b,*/
                           0x0a,0x00,0x0b,0x0f};/*键盘码0c,0d,0e,0f*/
void delay (unsigned int value)  /*延时副程式*/
 {
      while (value!=0) value--;  /*10US延时*/
 }

void scan(void)    /*扫描键盘副程式*/
{
 uchar a1=0xef,i,m;         /*A1=0XF7列扫描初值,I行*/
 FLAG0=0;                 /*设按键回应旗号为0,键盘扫描计数指标为0*/
     for(i=0;i<4;i++)  /*键盘4个扫描列*/
      {
               P2=a1;   /*列扫描输出,读入P1存入M,以便侦测行与侦测按键是否放开*/
                m=P2;
                switch(m&0x0f)  /*取行的高4位元,侦测那一行被按*/
            {
             case 0x07: ptr=i*4; /*第一行被按否?是则扫描指标=列X4*/
                           FLAG0=1; /*是则设FLAG0=1表有按键输入*/
                           break; /*跳出此循环*/
                case 0x0b: ptr=i*4+1; /*第二行被按否?是则扫描指标=列X4+1*/
                           FLAG0=1; /*是则设FLAG0=1表有按键输入*/
                           break; /*跳出此循环*/ 
                case 0x0d: ptr=i*4+2; /*第三行被按否?是则扫描指标=列X4+2*/
                           FLAG0=1; /*是则设FLAG0=1表有按键输入*/
                           break; /*跳出此循环*/
                case 0x0e: ptr=i*4+3; /*第四行被按否?是则扫描指标=列X4+3*/
                           FLAG0=1; /*是则设FLAG0=1表有按键输入*/
                 default:  break; /*跳出此循环*/
            }
         if(FLAG0==1)break;  /*不为1,则扫描列右移,扫描下一列*/
         a1=a1<<1|0x01;   /*高位补1,由于P1.7~P1.4未接+5V,而是由指令加载高电平*/
       }
 } 
void main(void)
{
 TMOD=0x20;                            //T1工作方式2
 TH1=0xfd;                             //串口波特率为9600
 TCON=0x40;                           //启动T1
 SCON=0x40;                           //串口工作与方式1并禁止接受
 IE=0x00;                             //无中断
 while(1)
 {
   scan();                           //启动键盘扫描
   if(FLAG0)                         //当FLAG0=1时,有键输入
   {
    SBUF=tab[ptr];                     
    while(TI==0);TI=0;               //将键值送串口
    FLAG0=0;                         //将标识位清零 
    delay(30000);                    //延时
    } 
  } 
 }    
Tags:51单片机,4*4扫描,C程序  
责任编辑:admin
  • 上一篇文章:
  • 下一篇文章:
  • 请文明参与讨论,禁止漫骂攻击,不要恶意评论、违禁词语。 昵称:
    1分 2分 3分 4分 5分

    还可以输入 200 个字
    [ 查看全部 ] 网友评论
    关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 在线帮助 - 文章列表
    返回顶部
    刷新页面
    下到页底
    晶体管查询