⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pwlock.lst

📁 单片机实现密码锁功能! 输入密码时显示:FFFFFF 输入错误时可按“取消键”重新输入 密码输入完毕按“确认键盘”
💻 LST
字号:
C51 COMPILER V6.12  PWLOCK                                                                 04/20/2008 12:33:28 PAGE 1   


C51 COMPILER V6.12, COMPILATION OF MODULE PWLOCK
OBJECT MODULE PLACED IN .\PWLock.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\PWLock.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /*****************************************/
   2          /* Copyright (c) 2005, 通信工程学院      */
   3          /* All rights reserved.                  */
   4          /* 作    者:戴 佳						 */
   5          /*****************************************/
   6          
   7          #include "PWLock.h"
   8           char gotkey();
   9          
  10          
  11          /* 定时器0中断服务子程序,2ms定时动态扫描显示 */
  12          void time0_int(void) interrupt 1 
  13          {
  14   1      	/* 重置2ms定时 */
  15   1      	TH0 = -2000/256;
  16   1      	TL0 = -2000%256;
  17   1      
  18   1      	if (showflag==1)
  19   1      		display();				// 调用显示函数
  20   1      }
  21          
  22          /* 定时器1中断服务子程序,50ms*/
  23          void time1_int(void) interrupt 3 
  24          {
  25   1      	uchar k;
  26   1      	/* 重置50ms定时 */
  27   1      	TH1 = -50000/256;
  28   1      	TL1 = -50000%256;
  29   1      
  30   1      	if (t1count<60)				
  31   1      	{
  32   2      		t1count++;
  33   2      	}
  34   1      	else						// 计时到1s
  35   1      	{
  36   2      		TR1 = 0;				// 关闭计数器1
  37   2      		t1count = 0;	
  38   2      		green = 1;				// 绿灯不亮
  39   2      		red = 1;				// 红灯不亮
  40   2      		showflag = 1;			// 打开数码管显示
  41   2      		digbit = 0xfe;			// 从数码管第1位开始动态显示
  42   2      		for (k=0;k<6;k++)		// 显示888888
  43   2      			wordbuf[k] = 8;
  44   2      	}
  45   1      }
  46          
  47          /* 根据共阴极字型编码表获取0~9,A~B字型代码 */
  48          uchar getcode(uchar i)
  49          {
  50   1      	uchar p;
  51   1      	switch (i)
  52   1      	{
  53   2      		case 0:	 p=0xc0;	break;			/* 0 */
  54   2      		case 1:	 p=0xf9;	break;			/* 1 */
  55   2      		case 2:	 p=0xa4;	break;			/* 2 */
C51 COMPILER V6.12  PWLOCK                                                                 04/20/2008 12:33:28 PAGE 2   

  56   2      		case 3:	 p=0xb0;	break;			/* 3 */
  57   2      		case 4:	 p=0x99;	break;			/* 4 */
  58   2      		case 5:	 p=0x92;	break;			/* 5 */
  59   2      		case 6:	 p=0x82;	break;			/* 6 */
  60   2      		case 7:	 p=0xf8;	break;			/* 7 */
  61   2      		case 8:	 p=0x80;	break;			/* 8 */
  62   2      		case 9:	 p=0x90;	break;			/* 9 */
  63   2      		case 10:	 p=0x88;	break;			/* a */
  64   2      		case 11:	 p=0x83;	break;			/* b */
  65   2      		case 12:	 p=0xc6;	break;			/* c */
  66   2      		case 13:	 p=0xa1;	break;			/* d */
  67   2      		case 14:	 p=0x86;	break;			/* e */
  68   2      		case 15:	 p=0x8e;	break;			/* f */
  69   2      		default: 			break;
  70   2      	}
  71   1      	return(p);
  72   1      }
  73          
  74          /* 显示函数 */
  75          void display(void)
  76          {
  77   1      	uchar i;
  78   1      	switch (digbit)
  79   1      	{
  80   2      		case 0xfe:		i=0;	break;
  81   2      		case 0xfd:		i=1;	break;
  82   2      		case 0xfb:		i=2;	break;
  83   2      		case 0xf7:		i=3;	break;
  84   2      		case 0xef:   	i=4;	break;
  85   2      		case 0xdf:  	i=5;	break;
  86   2      		default: 	break;
  87   2      	}
  88   1      
  89   1      	P2 = 0xff;						// 关闭显示
  90   1      	P0 = getcode(wordbuf[i]);		// 送字型码
  91   1      	P2 = digbit;					// 送字位码
  92   1      	
  93   1      	if (digbit!=0xdf)				// 共6位
  94   1      		digbit = (digbit<<1|0x01);			// 左移一位
  95   1      	else
  96   1      	    digbit = 0xfe;
  97   1      }
  98          
  99          /* 密码比较函数 */
 100          bit pwcmp(void)
 101          {
 102   1      	bit flag;
 103   1      	uchar i;
 104   1      	for (i=0;i<6;i++)
 105   1      	{
 106   2      		if (pw[i]==pwbuf[i])
 107   2      			flag = 1;
 108   2      		else
 109   2      		{
 110   3      			flag = 0;
 111   3      			i = 6;
 112   3      		}
 113   2      	}
 114   1      	return(flag);
 115   1      }
 116          
 117          /* 主程序 */
C51 COMPILER V6.12  PWLOCK                                                                 04/20/2008 12:33:28 PAGE 3   

 118          void main()
 119          {
 120   1      	uchar j,key;
 121   1      	P2 = 0xff;							// 关闭数码管显示	
 122   1      	TMOD = 0x11;						// T0,T1工作方式1
 123   1      
 124   1      	/* 2ms 定时设置 */
 125   1      	TH0 = -2000/256;
 126   1      	TL0 = 2000%256;
 127   1      
 128   1      	/* 50ms 定时设置 */
 129   1      	TH1 = -50000/256;
 130   1      	TL1 = -50000%256;
 131   1      	
 132   1      	/* 启动计数器0,关闭计数器1 */
 133   1      	TR0 = 1;
 134   1      	ET0 = 1;
 135   1      	TR1 = 0;
 136   1      	ET1 = 1;
 137   1      	EA = 1;
 138   1      
 139   1      	count = 0;						// 初始没有输入密码,计数器设为0
 140   1      	enterflag = 0;					// 没有按下确认键
 141   1      	pwflag = 0;						// 密码标志先置为0
 142   1         green = 1;						// 绿灯不亮
 143   1      	red = 1;						// 红灯不亮
 144   1      	
 145   1      	/* 假设内定密码为937602 */
 146   1      	pw[0] = 1;
 147   1      	pw[1] = 2;
 148   1      	pw[2] = 3;
 149   1      	pw[3] = 4;
 150   1      	pw[4] = 5;
 151   1      	pw[5] = 6;
 152   1      	digbit = 0xfe;					// 从第一位数码管开始动态扫描
 153   1      	/* 刚加电时,显示888888 */
 154   1      	for (j=0;j<6;j++)
 155   1      		wordbuf[j] = 8;
 156   1      
 157   1      	showflag = 1;					// 打开数码管显示
 158   1      
 159   1        	while(1)
 160   1          {
 161   2      		key = gotkey();					// 调用键盘扫描函数
 162   2      		switch(key)
 163   2         		{
 164   3            		case 0:						// 1行1列,数字0
 165   3      				if (count<6)
 166   3      				{
 167   4      					wordbuf[count] = 0x0f;	// 对应密码位上显示“F”
 168   4      					pwbuf[count] = 0;
 169   4      					count++;
 170   4      				}
 171   3      				break;
 172   3      			case 1:						// 1行2列,数字1
 173   3      				if (count<6)
 174   3      				{
 175   4      					wordbuf[count] = 0x0f;	// 对应密码位上显示“F"
 176   4      					pwbuf[count] = 1;
 177   4      					count++;
 178   4      				}
 179   3      				break;			
C51 COMPILER V6.12  PWLOCK                                                                 04/20/2008 12:33:28 PAGE 4   

 180   3      			case 2:						// 1行3列,数字2
 181   3      				if (count<6)
 182   3      				{
 183   4      					wordbuf[count] = 0x0f;	// 对应密码位上显示“F"
 184   4      					pwbuf[count] = 2;
 185   4      					count++;
 186   4      				}
 187   3      				break;
 188   3           		case 3:						// 1行4列,数字3
 189   3      				if (count<6)
 190   3      				{
 191   4      					wordbuf[count] = 0x0f;	// 对应密码位上显示“F"
 192   4      					pwbuf[count] = 3;
 193   4      					count++;
 194   4      				}
 195   3      				break;
 196   3      			case 4:						// 2行1列,数字4
 197   3      				if (count<6)
 198   3      				{
 199   4      					wordbuf[count] = 0x0f;	// 对应密码位上显示“F"
 200   4      					pwbuf[count] = 4;
 201   4      					count++;
 202   4      				}
 203   3      				break;
 204   3      			case 5:						// 2行2列,数字5
 205   3      				if (count<6)
 206   3      				{
 207   4      					wordbuf[count] = 0x0f;	// 对应密码位上显示“F"
 208   4      					pwbuf[count] = 5;
 209   4      					count++;
 210   4      				}
 211   3      				break;
 212   3      			case 6:						// 2行3列,数字6
 213   3      				if (count<6)
 214   3      				{
 215   4      					wordbuf[count] = 0x0f;	// 对应密码位上显示“F"
 216   4      					pwbuf[count] = 6;
 217   4      					count++;
 218   4      				}
 219   3      				break;
 220   3      			case 7:						// 2行4列,数字7
 221   3      				if (count<6)
 222   3      				{
 223   4      					wordbuf[count] = 0x0f;	// 对应密码位上显示“F"
 224   4      					pwbuf[count] = 7;
 225   4      					count++;
 226   4      				}
 227   3      				break;
 228   3      			case 8:						// 3行1列,数字8
 229   3      				if (count<6)
 230   3      				{
 231   4      					wordbuf[count] = 0x0f;	// 对应密码位上显示“F"
 232   4      					pwbuf[count] = 8;
 233   4      					count++;
 234   4      				}
 235   3      				break;
 236   3      			case 9:						// 3行2列,数字9
 237   3      				if (count<6)
 238   3      				{
 239   4      					wordbuf[count] = 0x0f;	// 对应密码位上显示“F"
 240   4      					pwbuf[count] = 9;
 241   4      					count++;
C51 COMPILER V6.12  PWLOCK                                                                 04/20/2008 12:33:28 PAGE 5   

 242   4      				}
 243   3      				break;
 244   3      			case 10:						// 3行3列,确认键
 245   3      				enterflag = 1;				// 确认键按下
 246   3      				if (count==6) 				// 只有输入6个密码后按确认键才作密码比较
 247   3      					pwflag = pwcmp();
 248   3      				else						
 249   3      					pwflag = 0;				// 否则直接pmflag赋0
 250   3      				break;
 251   3      			case 11:						// 3行4列,取消键
 252   3      				count = 0;					// 密码计数清零
 253   3      				for (j=0;j<6;j++)
 254   3      				{
 255   4      					wordbuf[j] = 8;			// 数码管显示888888
 256   4      					pwbuf[j] = 0x0f;		// 用FFFFFF清除已经输入的密码
 257   4      				}
 258   3      				break;
 259   3      			default:break;
 260   3      		}
 261   2      
 262   2      		if (enterflag==1)					// 如果按下确认键
 263   2      		{
 264   3      			enterflag = 0; 					// 标志位置回0
 265   3      			count = 0;						// 密码位计数器清零
 266   3      			for (j=0;j<6;j++)
 267   3      				pwbuf[j] = 0x0f;			// 用FFFFFF清除已经输入的密码			
 268   3      			showflag = 0;					// 关闭数码管显示
 269   3      			TR1 = 1;						// 计数器1开始计数
 270   3      			t1count = 0;					// 定时器1由50ms累积到1s所用的计数器
 271   3      			if (pwflag==1)			
 272   3      				green = 0; 					// 绿灯亮
 273   3      			else							
 274   3      				red = 0; 					// 红灯亮		
 275   3      		}
 276   2      	}    
 277   1      }
 278          
 279          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    882    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     21       2
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      3       1
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -