📄 d_lock.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 + -