加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

用4*4键盘控制数码管的显示

(2009-09-06 19:50:30)
标签:

杂谈

分类: 硬件

本程序功能:

   4*4键盘每个按键对应一个键值,按一下键在数码管上显示对应的键值,依次从可以0000~ffff
#include <REG51.h>
unsigned char key_scan(void);
void delay1ms(unsigned int i);
unsigned char key;
unsigned char st[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
sbit DAT=P1^1;
sbit CLK=P1^0;

void main(void)
  unsigned char m,c;
    unsigned  char  temp,d,j;
    m=0x00;
 temp=0;
 for(;;)
 {
    key=key_scan();//键盘扫描
    if(key!=0xf0) //m=temp;   有键按下,则把对应的键码通过移位寄存器循环移位显示在数码管上 ;否则数码管显示不变。
   // else
    {
     temp=key;
     m=key; 
   // for(j=0;j<4;j++)//这个循环可以不要
     d=st[m];
        for(c=0;c<8;c++)
         {
        CLK=0;
        DAT=d&0x01;
        CLK=1;
        d>>=1;
          }
  }
     // delay1ms(500);
  
 }

}
void delay1ms(unsigned int i)
{
unsigned int a;
for(;i>1;i--)
   for(a=100;a>1;a--);
}
unsigned char key_scan(void)
{
unsigned char a,b;
unsigned  char   key;
P2=0xf0;
a=P2;
if(a!=0xf0)
{
   delay1ms(10); //延时消除抖动
   P2=0xf0;
   a=P2;
   if(a!=0xf0)
   {
    P2=0x0f;
    b=P2;
    b=(a&0xf0)+(b&0x0f);
    switch(b)
    {
  case 0xe7: a=0; break;
     case 0xd7: a=1; break;
     case 0xb7: a=2; break;
     case 0x77: a=3; break;
     case 0xeb: a=4; break;
     case 0xdb: a=5; break;
     case 0xbb: a=6;;break;
     case 0x7b: a=7; break;
     case 0xed: a=8; break;
     case 0xdd: a=9; break;
     case 0xbd: a=10; break;
     case 0x7d: a=11;break;
     case 0xee: a=12;break;
     case 0xde: a=13;break;
     case 0xbe: a=14;break;
     case 0x7e: a=15;break;
     default:a=0xf0;break; 
      }
   }
}
else  a=0xf0;
return a;
}

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有