一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 2579|回复: 0

[其他综合] 初学者发个矩阵键盘的例子,借鉴了线反转法并有所改进

[复制链接]
发表于 2011-10-10 19:59 | 显示全部楼层 |阅读模式
///*2011/10/10*///
///*WOSS1001*///
#include<reg52.h>
#define un8 unsigned char
#define un16 unsigned int
sbit e= P0^2;
sbit rs=P0^3;
un8 code TAB[]={"0123456789abcdef"};
void lcdinit();    //1602初始化
void lcdcom(un8 com); //1602写指令
void lcddata(un8 dat); //1602写数据
void Delay(un8 xms);  
void Delay1(un16 xus);
un8 COUTER=0;
////*********************////
main()
{
   
  EA=1;
  ET0=1;
  TMOD|=0X01;
  TH0=(65536-65000)/256;
  TL0=(65536-65000)%256;
  TR0=1;
  lcdinit();
      
      
  while(1)
   {
   lcdcom(0X80);//第1行第1位
   if(255==COUTER)
    {
    COUTER=99;
   }
   if(100==COUTER)
      {
    COUTER=0;
   }
   //lcddata('n');

   lcddata(TAB[COUTER/10]);
   lcddata(TAB[COUTER%10]);
  
  
  }
  //其他代码
}

////*********每65MS扫描一次键盘*******************////
void Timer0_interrupt() interrupt 1 using 2
{
     un8 row,col,value,temp,n;
  TH0=(65536-65000)/256;
  TL0=(65536-65000)%256;
   
     P3=0x0f;
  row=P3&0x0f;
  row=row&0x0f;
     if((row!=0x0f)&&(temp=0x0f))
   {
   n++;                 //有按钮按下后N+1,65MS后再次检测按钮是否按着相当于按下消抖
  }
  else
      {
          n=0;
       temp=row;
         }
  if(2==n)           //稳定后
   {
   P3=0xf0;
      col=P3&0xf0;
      col=col&0xf0;
   if(col!=0xf0)
    {
       value=row|col; //键值
    switch (value)
     {
            case 0x77:COUTER++; //只作示范,按自己需要修改
              break;
            case 0x7b:COUTER++;
              break;
            case 0x7d:COUTER++;
              break;
         case 0x7e:COUTER++;
              break;
          case 0xb7:COUTER++;
              break;
            case 0xbb:COUTER++;
              break;
         case 0xbd:COUTER++;
              break;
         case 0xbe:COUTER++;
              break;
            case 0xd7:COUTER--;
              break;
          case 0xdb:COUTER--;
              break;
          case 0xdd:COUTER--;
              break;
          case 0xde:COUTER--;
              break;
          case 0xe7:COUTER--;
              break;
          case 0xeb:COUTER--;
              break;
          case 0xed:COUTER--;
              break;
          case 0xee:COUTER--;
              break;
     default:   break;
    }
   temp=row;
      }
  }  
   
  }



////***************Lcd初始化****************************////
void lcdinit()
{
  Delay(15);
   lcdcom(0x33);
    Delay(5) ;
     lcdcom(0x32);
      Delay(2);
    lcdcom(0x2); //4线模式
        Delay(1);
   lcdcom(0x06); //地址增量1,字符不动
          lcdcom(0x0C); //显示开,光标关,光标不闪
              lcdcom(0x28);
      lcdcom(0x01); //清屏
       Delay(5);
        lcdcom(0x02); //光标复位
     
}
////*********LCD写指令***********/////
void lcdcom(un8 com)
{
//un8 temp;
// temp=com;
   P0=com|0x0f; //不需要前面两条,因为COM的值未变
    rs=0;
      Delay1(2);
       e=1;
        Delay1(2);
         e=0;
   
//com=temp;
  P0=(com<<4)|0x0f;
   rs=0;
     Delay1(2);
      e=1;
       Delay1(2);
        e=0;
    }
////*****************LCD写数据**************////
void lcddata(un8 dat)
{
// un8 temp1;
// temp1=dat;
P0=dat|0x0f;
    rs=1;
Delay1(2);
e=1;
Delay1(2);
e=0;
// dat=temp1;
P0=(dat<<4)|0x0f;
    rs=1;
Delay1(2);
e=1;
Delay1(2);
e=0;
}
////************************////
void Delay(un8 xms)
{
un8 i,j;
for(i=xms;i>0;i--)
    for(j=120;j>0;j--);
}  
////**********************////   
void Delay1(un16 xus)
{
un16 i,j;
for(i=xus;i>0;i--)
    for(j=25;j>0;j--);
}
矩阵键盘.rar (81.71 KB, 下载次数: 318)

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-11-4 20:16 , Processed in 0.034768 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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