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

📄 d_lock.c

📁 12864的驱动程序
💻 C
字号:
/***************************************************************\
|*          12864LCD显示程序 proteus7.1仿真AMPIRE128*64       *|
|*        Copyright (c) 2007山师.传播       */
/*        All rights reserved.                  */
      /*赵彦彬                                  *|
|*                                       *|
|*          
\***************************************************************/



#include"w_word.h"



/**********************************************\
|*   写命令子程序  
       使用变量:
       入口参数:NULL
       返回参数:NULL                        
       调用函数:NULL
       实现功能 :         
\**********************************************/ 
void write_cmd(uchar cmd)             //写命令子程序 
{ RW=0;
  DI=0;   		 //DI=0 写命令 
  E=1;
  P1=cmd;
  E=0;       //RW="L",E="H->L" DB7~DB0的数据被写到IR或DR 
   }

/**********************************************\
|*   写数据子程序                             *|
        使用变量:
       入口参数:NULL
       返回参数:NULL                        
       调用函数:NULL
       实现功能 :                              *|
\**********************************************/ 
void write_dat(uchar dat)             //写数据子程序
{ RW=0;
  DI=1;   //DI=1  写数据
  E=1;
  P1=dat;
  E=0;    //RW="L",E="H->L" DB7~DB0的数据被写到IR或DR 
   }

/**********************************************\
|*   设置显示起始行 X地址和Y地址              *|
|      使用变量:
       入口参数:st_line 起始行x_ad起始页y_ad起始列
       返回参数:NULL                        
       调用函数:NULL
       实现功能 :
\**********************************************/ 

void set_dis(uchar st_line,uchar x_ad,uchar y_ad)  //设置显示起始行 X地址和Y地址
{  
//write_cmd(st_line+0xc0);                //+0xc0是参照设置起始行的格式
 write_cmd(x_ad+0xb8);                  //+0xb8是参照设置页地址的格式
  if(y_ad<64) { CS1=0;CS2=1;write_cmd(y_ad+0x40);} //Y_add地址实际上只有0~63 采用CS1和CS2选左右半屏
      else     { CS1=1;CS2=0;write_cmd(y_ad);}      //选第一片时,+64第二片为y_add-64+64
 }



/***********************************************\
|*   显示子程序                                                          *|
       使用变量:i,j,k
       入口参数:st_line 起始行x_ad起始页y_ad起始列
			   buf数据指针count显示字数
       返回参数:NULL                        
       调用函数:set_dis(),write_dat()
                            write_cmd  
       实现功能 :
\***********************************************/ 
void write_word(uchar st_line,uchar x_a,uchar y_a,uchar *buf,uchar count) //写入汉字
{ uint i,j,k=1;
    set_dis(st_line, x_a,y_a);
 for(j=0;j<count;j++)                //显示的字数
 {	set_dis(st_line,x_a,y_a);
 	for(i=0;i<16;i++)
  	 write_dat(*(buf+i+j*32)) ;        //字的下半部分,x_add+1
 	set_dis(st_line,x_a+1,y_a);
 	for(i=16;i<32;i++)
   write_dat(*(buf+i+j*32));         
 	set_dis(st_line,x_a,y_a=y_a+16);

	if(y_a==128)                   //一行的字数超过8 y_add>128时换行
	{                         //为什么每次换行第一列子的上半部分出现错误?

	x_a=2*k;

	y_a=0;

	set_dis(st_line,x_a,y_a);
	set_dis(st_line,x_a,y_a);
	k++;
	}
}
write_cmd(0x3f); 
CS1=CS2=1;
}
/****************************************/
/*     使用变量:j,k
       入口参数:st_line ,x_a,y_a,(x_end终止行y_enda终止列
       返回参数:NULL                        
       调用函数:set_dis()
                           write_dat( )write_cmd()
       实现功能:
/***************************************/
void clrdis(uchar st_line,uchar x_a,uchar y_a,uchar count) //写入汉字
{ uint i,j,k=1;

    set_dis(st_line, x_a,y_a);
 set_dis(st_line, x_a,y_a);//////////////////111111111111111111
 for(j=0;j<count;j++)                //显示的字数
 {	//set_dis(st_line,x_ad,y_ad);//////////////1111111111111111111111111111
	for(i=0;i<16;i++)
  	 write_dat(0) ;        //字的下半部分,x_add+1
 	set_dis(st_line,x_a+1,y_a);
 	for(i=16;i<32;i++)
   write_dat(0); 
     
	set_dis(st_line,x_a,y_a=y_a+16);

	if(y_a==128)                   //一行的字数超过8 y_add>128时换行
	{                         //为什么每次换行第一列子的上半部分出现错误?

	x_a=2*k;

	y_a=0;

	set_dis(st_line,x_a,y_a);
	set_dis(st_line,x_a,y_a);
	k++;
	}
}



}


/****************************************/
/*    去抖动延时
       使用变量:i
       入口参数:NULL
       返回参数:NULL                        
       调用函数:NULL
       实现功能:
/***************************************/
void delay(void)
{
	uchar i;

	for (i=300;i>0;i--);     //0.5ms

}

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

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

}

/****************************************/
/*   音频定时0
	使用变量:music
       入口参数:NULL
       返回参数:NULL                        
       调用函数:NULL
       实现功能:
/***************************************/

void time0_int()  interrupt 1 
{

	TH0=0XFD;
	TL0=0X34;
  music=~music;
}
/****************************************/
/*   音响时长定时1 
        使用变量:time_500ms
       入口参数:NULL
       返回参数:NULL                        
       调用函数:NULL
       实现功能:
/***************************************/
void time1_int()  interrupt 3
{TH1=0X3C;
TL1=0XB0;
time_500ms++;
if(time_500ms==30)
 	{  TR1=0;
	time_500ms=0;
	TR0=0;
	}
}




/****************************************/
/*    初始化
	使用变量:
       入口参数:NULL
       返回参数:NULL                        
       调用函数:NULL
       实现功能:
/***************************************/
void init(void)
{clrdis(0,0,0,32);
write_word(0,0,0,&dis1,12);
write_word(0,4,0,&dis2,5);

}

/****************************************/
/*     使用变量:
       入口参数:NULL
       返回参数:NULL                        
       调用函数:NULL
       实现功能:
/***************************************/
void in(void)
{uint key,rd1,rd2;
uint button_in=0;

count=0;
clrdis(0,4,0,16);  
write_word(0,2,0,&dis3,8);  
        
while(button_in!=6)
	{button_in++;
	count++;
	key=keyscan();
	
	switch(key)
	{case (0x11):user=1;write_word(0,4,(count-1)*16,&dis4,1);break;
	case(0x21):user=2;write_word(0,4,(count-1)*16,&dis4,1);break;
	case (0x41):user=3;write_word(0,4,(count-1)*16,&dis4,1);break;
	case(0x81):user=4;write_word(0,4,(count-1)*16,&dis4,1);break;
	case(0x12):user=5;write_word(0,4,(count-1)*16,&dis4,1);break;
	case(0x22):user=6;write_word(0,4,(count-1)*16,&dis4,1);break;
	case(0x42):user=7;write_word(0,4,(count-1)*16,&dis4,1);break;
	case(0x82):user=8;write_word(0,4,(count-1)*16,&dis4,1);break;
	case(0x14):user=9;write_word(0,4,(count-1)*16,&dis4,1);break;	
	case(0x24):user=0;write_word(0,4,(count-1)*16,&dis4,1);break;
	case(0x44):button_in=6;break;
	case(0x84):clrdis(0,4,0,8);button_in=0;count=0;break;
	default:break;
	}
		if(button_in==2)
		{clrdis(0,4,0,8);
		write_word(0,4,0,&dis8,4);      //二位密码
	for(rd1=50;rd1>0;rd1--)
		{for(rd2=300;rd2>0;rd2--)
		delay();
		}	
	clrdis(0,4,0,8);
		count=0;
		button_in=0;
		}

	}
clrdis(0,2,0,32);
write_word(0,2,0,&dis5,3);
button_in=0;
count=0;
while(button_in!=8)
	{button_in++;
	count++;
    key=keyscan();

	switch(key)
		{case (0x11):password[button_in]=1;write_word(0,4,(count-1)*16,&dis4,1);break;
		case(0x21):password[button_in]=2;write_word(0,4,(count-1)*16,&dis4,1);break;
		case (0x41):password[button_in]=3;write_word(0,4,(count-1)*16,&dis4,1);break;
		case(0x81):password[button_in]=4;write_word(0,4,(count-1)*16,&dis4,1);break;
		case(0x12):password[button_in]=5;write_word(0,4,(count-1)*16,&dis4,1);break;
		case(0x22):password[button_in]=6;write_word(0,4,(count-1)*16,&dis4,1);break;
		case(0x42):password[button_in]=7;write_word(0,4,(count-1)*16,&dis4,1);break;
		case(0x82):password[button_in]=8;write_word(0,4,(count-1)*16,&dis4,1);break;
		case(0x14):password[button_in]=9;write_word(0,4,(count-1)*16,&dis4,1);break;	
		case(0x24):password[button_in]=0;write_word(0,4,(count-1)*16,&dis4,1);break;
		case(0x44):button_in=8;break;
		case(0x84):clrdis(0,4,0,8);button_in=0;count=0;break;
		default:break;
		}
	if(button_in==7)
		{clrdis(0,4,0,8);
		write_word(0,4,0,&dis9,4);       //六位密码
	for(rd1=50;rd1>0;rd1--)
		{for(rd2=300;rd2>0;rd2--)
		delay();
		}
		
		clrdis(0,4,0,8);
		count=0;
		button_in=0;
		}
}
test_pw=0;
for(button_in=0;button_in<6;button_in++)
	{if(password[button_in+1]!=userls[user].userpw[button_in])
		test_pw=1;
	}
if(test_pw==1)
{test_red_led=1; //密码错误
 clrdis(0,2,0,32);
 write_word(0,2,0,&dis6,5);
 

for(rd1=200;rd1>0;rd1--)
		{for(rd2=300;rd2>0;rd2--)
		delay();
		}
}
else 
{
test_green_led=1;
clrdis(0,2,0,32);
write_word(0,2,0,&dis7,2);

for(rd1=200;rd1>0;rd1--)
		{for(rd2=300;rd2>0;rd2--)
		delay();
		}
muaic_ok();
}          //输入正确





}


/****************************************/
/*     使用变量:
       入口参数:NULL
       返回参数:NULL                        
       调用函数:NULL
       实现功能:
/***************************************/

void admini(void)
{
}






void main()
{uint key;
EA=1;
TMOD=0x01;
ET0=1;
ET1=1;
TH1=0X3C;
TL1=0XB0;
TH0=0XFD;
TL0=0X34;
test_red_led=0;
test_green_led=0;
init();

while(1)
{init();
key=keyscan();

switch(key)
	{case(0x11):in();break;
	case(0x21):admini();break;
	default:break;
	}

}
}


 
 

⌨️ 快捷键说明

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