键盘扫描

 

  1.对于单片机,要求先对P1口初始化,即P1=0; P_1到P1_6脚,扫描P1_1脚,则,P1_1=1,依次类推,循环扫描P1_1至P1_6;

      同时对应要求将P1口的IO模式设定好,即P1_1=1时,P1M0=0X7C; P1M1=0X00; (将P1_1设为准双向口,P1_2至P1_6设为输   入,可查STC12C5410AD芯片手册)

2.针对键盘图,当第1列有第一个按键被按下,则P1_1=1,P1_6=1,P1其他脚为0;则串口显示为0X42,可以依次类推第一列显示数字分别为:0x42,0x22,0x12,0x0A,0x06,无(反斜对角上无显示)

代码具体如下:

//#include <reg52.h>
#include <intrins.h>
#include <STC12.h>
#define   uchar unsigned char   /*宏定义*/

sbit P1_7=P1^7;
sbit P1_6=P1^6;
sbit P1_5=P1^5;
sbit P1_4=P1^4;
sbit P1_3=P1^3;
sbit P1_2=P1^2;
sbit P1_1=P1^1;
sbit P1_0=P1^0;
uchar ch;
uchar record;

void init_serialcomm()
{
 SCON=0x50; //SCON:serial mode 1,8-bit UART,enable ucvr
 TMOD|=0x20; //TMOD:timer 1,mode 2,8-bit reload
// SMOD=0

    PCON|=0x00; 
 TH1 = 0xFC;  //3.579545 external osc
 IE|=0x90; //Enable Serial Interrupt
 TR1=1;  //timer 1 run
}

//向串口发送一个字符
void send_char_com(uchar ch)
{
     SBUF=ch;
    while(TI==0);
 TI=0;
}

void delay(unsigned int n)
{
    unsigned i;
 i=0;
    while(i<n)i++;
}

 

//各行键盘扫描

void port(p1m0)

    P1=0;
    switch(p1m0)
 {
      case 0X7C: P1_1=1; break;
      case 0X7A: P1_2=1; break;
       case 0X76: P1_3=1; break;
       case 0X6E: P1_4=1; break;
       case 0X5E: P1_5=1; break;
       case 0X3E: P1_6=1; break;  
 } 
 P1M0=p1m0;
 P1M1=0X00;
 delay(5000);  //按键反应调试这个,1000是按1次,发送4到5个,100000,按几次出现一个
 ch=P1;
 if(ch!=0x02&&ch!=0x04&&ch!=0x08&&ch!=0x10&&ch!=0x20&&ch!=0x40) send_char_com(ch);

}

void scan(void) //键盘扫描
{
    port(0X7C);
   port(0X7A);
   port(0X76);
   port(0X6E);
   port(0X5E);
   port(0X3E); 
    
}
void main(void)

    init_serialcomm();
     while(1)
     {
        scan();
     }   

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值