单片机电子密码锁 第7页

单片机电子密码锁 第7页
主程序:
#include "PWLock.h"
/* 键消抖延时函数 */
void delay(void)
{
 uchar i;
 for (i=300;i>0;i--);
}

/* 键扫描函数 */
uchar keyscan(void)
{
 uchar scancode,tmpcode;
 P1 = 0xf0;         // 发全0行扫描码
 if ((P1&0xf0)!=0xf0)     // 若有键按下
 {
  delay();       // 延时去抖动
  if ((P1&0xf0)!=0xf0)    // 延时后再判断一次,去除抖动影响
  {
   scancode = 0xfe;
   while((scancode&0x10)!=0)  // 逐行扫描
   {
    P1 = scancode;    // 输出行扫描码
    if ((P1&0xf0)!=0xf0)  // 本行有键按下
    {
     tmpcode = (P1&0xf0)|0x0f;

     /* 返回特征字节码,为1的位即对应于行和列 */
     return((~scancode)+(~tmpcode));
    }
    else scancode = (scancode<<1)|0x01; // 行扫描码左移一位
   }
  }
 }
 return(0);        // 无键按下,返回值为0  
}

/* 定时器0中断服务子程序,2ms定时动态扫描显示 */
void time0_int(void) interrupt 1
{
 /* 重置2ms定时 */
 TH0 = -2000/256;
 TL0 = -2000%256;

 if (showflag==1)
  display();    // 调用显示函数
}

/* 定时器1中断服务子程序,50ms*/
void time1_int(void) interrupt 3
{
www.751com.cn
  t1count++;
 }
 else      // 计时到1s
 {
  TR1 = 0;    // 关闭计数器1
  t1count = 0; 
  green = 1;    // 绿灯不亮
  red = 1;    // 红灯不亮
  showflag = 1;   // 打开数码管显示
  digbit = 0x01;   // 从数码管第1位开始动态显示
  for (k=0;k<6;k++)  // 显示888888
   wordbuf[k] = 8;
 }
}

/* 根据共阴极字型编码表获取0~9,A~B字型代码 */
uchar getcode(uchar i)
{
 uchar p;
 switch (i)
 {
  case 0:  p=0x3f; break;   /* 0 */
  case 1:  p=0x06; break;   /* 1 */
  case 2:  p=0x5B; break;   /* 2 */
  case 3:  p=0x4F; break;   /* 3 */
  case 4:  p=0x66; break;   /* 4 */
  case 5:  p=0x6D; break;   /* 5 */
  case 6:  p=0x7D; break;   /* 6 */
  case 7:  p=0x07; break;   /* 7 */
  case 8:  p=0x7F; break;   /* 8 */
  case 9:  p=0x67; break;   /* 9 */
  case 10:    p=0x77; break;   /* A */
  case 11:    p=0x7C; break;   /* B */
  case 12:    p=0x39; break;   /* C */
  case 13:    p=0x5E; break;   /* D */
  case 14:    p=0x79; break;   /* E */
  case 15:    p=0x71; break;   /* F */
  default:    break;
 }
 return(p);
}/* 显示函数 */

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9] 下一页

Copyright © 2007-2012 www.chuibin.com 六维论文网 版权所有