天津大学 电气与自动化工程学院
智能装置与设计
课程设计之-----智能门禁系统
【目录】 CONTENT
PART I 设计概述 ........................................................................................................................... 2
设计题目 ................................................................................................................................... 2 设计目的 ................................................................................................................................... 2 设计内容 ................................................................................................................................... 2 设计要求 ................................................................................................................................... 2 实验设备 ................................................................................................................................... 3 PART II 主要元器件介绍 ........................................................................................................... 3
2.1 PIC单片机 .......................................................................................................................... 3 2.2 LCD HG122321-C ................................................................................................................. 4 2.2.1 液晶显示器LCD接口信号说明:......................................................................... 4 2.2.2 外形尺寸 ................................................................................................................. 6 2.2.3指令说明 .................................................................................................................. 6 2.2.4 时序图..................................................................................................................... 8 2.2.5软件初始化 .............................................................................................................. 9
PART III 系统原理图及软件流程 ............................................................................................... 9
3.1系统原理图 ......................................................................................................................... 9 3.2软件流程........................................................................................................................... 10 4*4小键盘功能分布图 .................................................................................................................. 11 附:程序代码如下: ........................................................................................................................ 11
1
天津大学 电气与自动化工程学院
PART I
设计概述
设计题目 智能门禁系统
设计目的
1. 深入了解PIC16F877单片机的工作原理,熟练掌握汇编语言程序设计方法,熟
练使用MPLAB-ICD仿真器及MPLAB-IDE仿真调试软件。
2. 通过该课程设计使学生初步掌握以单片机为核心的智能装置设计的简单原则、
步骤和方法。
3. 熟悉智能装置设计中有关的硬件设计调试。 4. 熟悉智能装置设计中相关软件的设计、编程和调试。
设计内容
1. 以16F877单片机为核心,结合给出的其他元器件和实验系统原有的内容设计
智能门禁系统硬件电路。
2. 利用试验板提供的4*4键盘输入,单片机通过液晶显示器将结果显示出来,利用三色灯显示(通行、警告、禁入等)状态,利用通讯接口进行远程控制。 3. 实现主人入门口令输入和校对功能以及客人呼叫功能 4. 利用上位机的通讯设置初始口令。 5. 利用键盘设置初始口令。
设计要求
1. 根据实验指导书的设计内容及所给出的元件,设计门禁系统的硬件原理图。 2. 按照设计好的硬件原理图在实验板上用导线搭建硬件电路。
3. 用万用表检查硬件电路连接是否正确,检查无误后上电并编制简单的测试程
序分步调试各部分功能。
4. 在各部分功能实现后,编制完整的门禁系统软件,并进行软硬件联调,直到达
2
天津大学 电气与自动化工程学院
到设计要求。完成后由教师进行验收检查。
实验设备
1. MPLAB-ICD模块与仿真头 2. 智能装置实验系统
3. 安装了MPLAB-IDE开发软件的计算机 4. 数字万用表 5. 导线若干
PART II 主要元器件介绍
2.1 PIC单片机
单片机是一块芯片上集成了处理单元,数据存储器,程序存储器,输入/输出和定时器/计数器等部件的一台小型计算机。随着芯片集成度的提高,单片机的功能迅速的扩充,特别是PIC单片机,增加了许多强大的外围模块,从而给用户带来了极大的便利。
PIC单片机有如下特点:1、哈佛总线结构;2、指令流水新操作;3、所有指令均为单字节;4、引入寄存器文档的概念;5、功耗低;6、驱动能力强;7、程序存储器版本齐全.
图 2.1.1 PIC16F877单片机内部结构框图
3
天津大学 电气与自动化工程学院
图2.1.2 PIC16F87X数据存储区
2.2 LCD HG122321-C
2.2.1 液晶显示器LCD接口信号说明:
1、RS,R/W的配合选择决定控制界面的4种模式: RS L L H H 2、E信号 E状态 高——>低 高 低/低——>高 ●
R/W L H L H 功能说明 MPU写指令到指令暂存器(IR) 读出忙标志(BF)及地址记数器(AC)的状态 MPU写入数据到数据暂存器(DR) MPU从数据暂存器(DR)中读出数据 执行动作 I/O缓冲——>DR DR——>I/O缓冲 无动作 结果 配合/W进行写数据或指令 配合R进行读数据或指令 忙标志:BF
BF标志提供内部工作情况.BF=1表示模块在进行内部操作,此时模块不接受外部指令和数据.BF=0时,模块为准备状态,随时可接受外部指令和数据.
4
天津大学 电气与自动化工程学院
利用STATUS RD 指令,可以将BF读到DB7总线,从而检验模块之工作状态.
●
字型产生ROM(CGROM)
字型产生ROM(CGROM)提供8192个此触发器是用于模块屏幕显示开和关的控制。DFF=1为开显示(DISPLAY ON),DDRAM 的内容就显示在屏幕上,DFF=0为关显示(DISPLAY OFF)。 DFF 的状态是指令DISPLAY ON/OFF和RST信号控制的。
●
显示数据RAM(DDRAM)
模块内部显示数据RAM提供×2个位元组的空间,最多可控制4行16字(个字)
的中文字型显示(本模块只用到其中的16*2个),当写入显示数据RAM时,可分别显示CGROM与CGRAM的字型;此模块可显示三种字型,分别是瘦长的英数字型(16*8)、CGRAM字型及CGROM的中文字型,三种字型的选择,由在DDRAM中写入的编码选择,在00~0F的编码中将选择CGRAM的字定义字型,10~7F的编码中将选择
瘦长英数字的字型,至于A0以上的编码将自动的结合下一个位元组,组成两个位元组的编码形成中文字型的编码(A140~D75F)。
●
字型产生RAM(CGRAM)
字型产生RAM提供图象定义(造字)功能, 可以提供四组16×16点的自定义图象空间,使用者可以将内部字型没有提供的图象字型自行定义到CGRAM中,便可和CGROM中的定义一般的通过DDRAM显示在荧屏中。
●
地址计数器AC
地址计数器是用来贮存DDRAM/CGRAM之一的地址,它可由设定指令暂存器来改变,之后
只要读取或是写入DDRAM/CGRAM的值时,地址计数器的值就会自动加一,当RS为“0”时而R/W为“1”时,地址计数器的值会被读取到DB6~DB0中。
●
游标/闪烁控制电路
此模块提供硬体游标及闪烁控制电路,由地址计数器的值来指定DDRAM中的游标或闪
烁位置。
3. 串口接口管脚信号
管脚号 名称 LEVER 功能 1 VSS 0V 电源地 2 VDD +5V 电源正(3.0V~5.5V) 3 VEE - 对比度调整 4 CLK H/L 串行同步时钟:上升沿时读取SID数据 5 SID H/L 串行数据输入端 6 CS H/L 模组片选端,高电平有效 7 BL+ VDD 背光源电压+4.2V-+5V 8 BL- VSS 背光源公共端
5
天津大学 电气与自动化工程学院
2.2.2 外形尺寸
图2.2.2 LCD HG122321 外形尺寸
2.2.3指令说明
块控制芯片提供两套控制命令,基本指令和扩充指令如下: 指令表1:(RE=0:基本指令) 指 令 清除 显示 地址 归位 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 指 令 码 RS R/W D7 D6 D5 D4 D3 D2 D1 D0 功 能 将DDRAM填满\"20H\并且设定DDRAM的地址计数器(AC)到\"00H\" 设定DDRAM的地址计数器(AC)到\"00H\并且X 将游标移到开头原点位置;这个指令不改变DDRAM 的内容 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 显示状态开/关 0 0 0 0 0 0 1 D C B C: 控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁 进入点 0 0 0 0 0 0 0 1 I/D S 指定在数据的读取与写入时,设定游标 6
天津大学 电气与自动化工程学院 的移动方向及指定显示的移位 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移,高电平表示有效,低电平则无效 设定 游标或显示移位控制 0 0 0 0 0 1 S/C R/L X X 设定游标的移动与显示的移位控制位;这个指令不改变DDRAM 的内容 S/C:高电平时移动显示的文字,低电平时移动光标 DL:高电平时为4位总线,低电平时为8 功能 设定 0 0 0 0 1 DL X RE X X 位总线 RE=1: 扩充指令操作 RE=0: 基本指令操作 设定0 0 0 1 AC5 AC4 AC3 AC2 AC1 AC0 设定CGRAM 地址 CGRAM 地址 设定设定DDRAM 地址(显示位址) 0 0 1 0 AC5 AC4 AC3 AC2 AC1 AC0 第一行:80H-87H 第二行:90H-97H 读取忙标志(BF)可以确认内部动作是否完成,高电平表示忙,此时模块不能0 1 BF AC6 AC5 AC4 AC3 AC2 AC1 AC0 接收命令或者数据,如果为低电平表示不忙。同时可以读出地址计数器(AC)的值 DDRAM 地址 读取忙标志和地址 写数据1 到RAM 读出RAM1 的值 0 数据 将数据D7~D0写入到内部的RAM (DDRAM/CGRAM/IRAM/GRAM) 1 数据 从内部RAM读取数据D7~D0 (DDRAM/CGRAM/IRAM/GRAM) 指令表2:(RE=1:扩充指令) 指 令 待命 模式 0 0 0 0 0 0 0 0 0 1 指 令 码 RS R/W D7 D6 D5 D4 D3 D2 D1 D0 功 能 进入待命模式,执行其他指令都棵终止 待命模式
7
天津大学 电气与自动化工程学院 0 0 1 SR SR=1:允许输入垂直卷动地址 SR=0:允许输入IRAM和CGRAM地址 选择2行中的任一行作反白显示,并可卷动地址开关开启 反白 选择 睡眠 模式 扩充 功能 设定 设定绘图RAM 地址 0 0 0 0 0 0 0 0 0 0 0 0 0 1 R1 R0 决定反白与否。初始值R1R0=00,第一次设定为反白显示,再次设定变回正常 SL=0:进入睡眠模式 SL=1:脱离睡眠模式 CL=0/1:4/8位数据 0 0 0 0 0 0 1 SL X X 0 0 0 0 1 CL X RE G 0 RE=1: 扩充指令操作 RE=0: 基本指令操作 G=1/0:绘图开关 设定绘图RAM 0 0 1 0 0 0 AC3 AC2 AC1 AC0 先设定垂直(列)地址AC6AC5„AC0 AC6 AC5 AC4 AC3 AC2 AC1 AC0 再设定水平(行)地址AC3AC2AC1AC0 将以上16位地址连续写入即可 备注;当IC1在接受指令前,微处理器必须先确认其内部处于非忙碌状态,即读取BF标志时,BF需为零,方可接受新的指令;如果在送出一个指令前并不检查BF标志,那么在前一个指令和这个指令中间必须延长一段较长的时间,即是等待前一个指令确实执行完成。
2.2.4 时序图
8
天津大学 电气与自动化工程学院
2.2.5软件初始化
PART III 系统原理图及软件流程
3.1系统原理图
图3.1系统原理图
9 系统初始化 天津大学 电气与自动化工程学院 3.2软件流程 SPI总线初始化 LCD初始化 SCI/RS232初始化
通过RS232设置口令
LCD显示提示文字
有按键? NO
YES
10 号键 ? YES
NO
11号键? YES
NO 13号键? YES
NO
LCD显示提示文字
调用local()函数 进入本地模式 调用visit()函数 进入来访模式 调用modify_key()函数 进入修改模式 10
天津大学 电气与自动化工程学院
4*4小键盘功能分布图
附:程序代码如下:
#include #define CS RC4 //lcd片选端口 #define RED RC1 //RC1用于三色灯红色控制 #define GRE RC2 //RC2用于三色灯绿色控制 #define LINE1 1 //LCD显示在第一行 #define LINE2 2 //LCD显示在第二行 unsigned char bank3 W_COMMAND=0XF8; //向LCD写指令命令 unsigned char bank3 W_DATA=0XFA; //向LCD写数据命令 unsigned char bank3 password[5]={0,0,0,0,0}; //初始口令,5位为有效口 令 11 天津大学 电气与自动化工程学院 unsigned char bank3 pass_temp[5]; //用于存放主人输 入的口令 unsigned char bank2 LCD_IN[10]={0X00,0X10,0X20,0X00,0X00,0X20,0X00,0X60,0X00,0XC0};//LCD初始化命令字 unsigned char bank2 LCD_DDRAM1[2]={0X80,0X00}; //LCD第一行起始地址 unsigned char bank2 LCD_DDRAM2[2]={0X90,0X00}; //LCD第二行起始地址 unsigned char bank2 tip1[10]={0XC7,0XEB,0XCA,0XE4,0XC8,0XEB,0XBF,0XDA,0XC1,0XEE}; //主人模式提示“请输入口令” unsigned char bank2 tip2[12]={0XC7,0XEB,0XCA,0XE4,0XC8,0XEB,0XB7,0XBF,0XBC,0XE4,0XBA,0XC5};//客人模式提示“请输入房间号” unsigned char bank2 tip3[12]={0XD2,0XAA,0XD0,0XDE,0XB8,0XC4,0XBF,0XDA,0XC1,0XEE,0XC2,0XF0};//修改口令提示“要修改口令吗” unsigned char bank2 tip4[12]={0XC7,0XEB,0XCA,0XE4,0XC8,0XEB,0XBE,0XC9,0XBF,0XDA,0XC1,0XEE};//修改口令时提示“请输入旧口令” unsigned char bank2 tip5[12]={0XC7,0XEB,0XCA,0XE4,0XC8,0XEB,0xD0,0XC2,0XBF,0XDA,0XC1,0XEE};//修改口令时提示“请输入新口令” unsigned char bank1 LCD_PASS[8]={0XBB,0XB6,0XD3,0XAD,0XBB,0XD8,0XC0,0XB4}; //通行提示“欢迎回来” unsigned char bank1 LCD_WARNING[8]={0XBF,0XDA,0XC1,0XEE,0XB4,0XED,0XCE,0XF3}; //警告提示“口令错误” unsigned char bank1 LCD_FORBID[8]={0XBD,0XFB,0XD6,0XB9,0XCD,0XA8,0XB9,0XFD}; //禁止提示“禁止通过” unsigned char bank1 poem1[14]={0XBB,0XA8,0XBE,0XB6,0XB2,0XBB,0XD4,0XF8,0XD4,0XB5,0XBF,0XCD,0XC9,0XA8}; unsigned char bank1 poem2[14]={0XC5,0XEE,0XC3,0XC5,0XBD,0XF1,0XCA,0XBC,0XCE,0XAA,0XBE,0XFD,0XBF,0XAA}; unsigned char bank1 poem3[10]={0XB2,0XF1,0XC3,0XC5,0XCE,0XC5,0XC8,0XAE,0XB7,0XCD}; unsigned char bank1 12 天津大学 电气与自动化工程学院 poem4[10]={0XB7,0XE7,0XD1,0XA9,0XD2,0XB9,0XB9,0XE9,0XC8,0XCB}; unsigned char key; unsigned char keyfind(void); //检测有按键按下子函数 unsigned char keyscan(void); //键盘扫描子函数 void delay(unsigned char a); //软件延时子函数 void LCD_INITIA(void); //LCD初始化 void LCD_CLEAR(void); //LCD清屏 void LCD_START(char line,char first); //在LCD的第line行的第first位置开始显示 void LCD_WRITE(unsigned char data); //向lcd写数据 void sci_initial(void); //sci初始化 char sci_rc(void); //sci_RS232接收通讯 void sci_tx(unsigned char bb); //sci_rx rs232发送通讯 void local(void); //local()函数用于主人模式 void visit(void); //visit()函数用于客人呼叫模式 void modify_key(void); //该函数用于键盘设置口令 void set_rs232(void); //该函数用于rs232设置口令 char compare(void); //判断数组相等 char calibration(void); //校对输入的口令 void main() { TRISD=0XF0; //PORTD用于键盘扫描 PORTC=0X00; //拉低时钟信号,片选禁止 TRISC=0XC0; //RC1,RC2用作三色灯的输出控 SSPSTAT=0X40; SSPCON=0X20; //SPI总线初始化 CS=1; //LCD片选使能 LCD_INITIA(); //LCD初始化 sci_initial(); //SCI_RS232初始化 set_rs232(); //通过RS232远程设置口令 LCD_CLEAR(); //LCD清屏 while(1) { char i; LCD_INITIA(); LCD_START(LINE1,0); for(i=0;i<14;i++) LCD_WRITE(poem1[i]); 13 天津大学 电气与自动化工程学院 LCD_START(LINE2,0); for(i=0;i<14;i++) LCD_WRITE(poem2[i]); key=keyfind(); if(key==10) //按10号键进入主人口令输入和校对模式 { LCD_INITIA(); LCD_START(LINE1,0); for(i=0;i<10;i++) LCD_WRITE(tip1[i]); local(); } else if(key==11) //按11号键进入客人呼叫模式 { LCD_CLEAR(); LCD_START(LINE1,1); for(i=0;i<12;i++) LCD_WRITE(tip2[i]); visit(); } else if (key==13) //按13号键进入修改口令模式 modify_key(); delay(50); RED=0; GRE=0; LCD_INITIA(); LCD_START(LINE1,2); for(i=0;i<10;i++) LCD_WRITE(poem3[i]); LCD_START(LINE2,2); for(i=0;i<10;i++) LCD_WRITE(poem4[i]); delay(250); } } /*该函数用于rs232设置口令*/ void set_rs232(void) { char i; for(i=0;i<5;i++) { password[i]=sci_rc(); delay(2); 14 天津大学 电气与自动化工程学院 } } /*该函数用于校验输入的口令*/ char calibration(void) { char i; unsigned char key_temp; for(i=0;i<6;i++) { key_temp=keyfind(); if(key_temp==12) //按12号“取消”键,可退出该模式 return 2; else if(key_temp==14) //按14号“更改输入”键,可重新输入 { i=0; continue; } else if((key_temp==15)&(i==5)) //按15号“确认”键,结束输入 break; pass_temp[i]=key_temp; } if(compare()==1) return 1; else return 0; } /*该函数用于主人入门口令输入和校对*/ void local(void) { char i,cnt=0; //输入口令的次数 while(cnt<3) //允许输入口令3次 { if(calibration()==1) { LCD_INITIA(); LCD_START(LINE1,2); //lcd显示通行提示 for(i=0;i<8;i++) LCD_WRITE(LCD_PASS[i]); GRE=1; RED=0; //三色灯显示绿色 break; } 15 天津大学 电气与自动化工程学院 else if(calibration()==0) { LCD_INITIA(); LCD_START(LINE1,2); //lcd显示警告提示 for(i=0;i<8;i++) LCD_WRITE(LCD_WARNING[i]); GRE=1; RED=1; //三色灯显示黄色 cnt++; //输入次数增一 } else if(calibration()==2) return; if(cnt==3) { LCD_INITIA(); LCD_START(LINE1,2); //lcd显示禁止提示 for(i=0;i<8;i++) LCD_WRITE(LCD_FORBID[i]); GRE=0; RED=1; //三色灯显示红色 break; } } } /*该函数用于来访客人呼叫模式*/ void visit(void) { unsigned char room[3],key_temp; char i; for(i=0;i<4;i++) //输入房间号,按“确认”键结束 { key_temp=keyfind(); if(key_temp==12) //按12号“取消”键,可退出该模式 return; else if(key_temp==14) //按14号“更改输入”键,可重新输入 { i=0; continue; } else if((key_temp==15)&(i==3)) //按15号“确认”键,结束输入 break; 16 天津大学 电气与自动化工程学院 room[i]=key_temp; } for(i=0;i<3;i++) sci_tx(room[i]); if(sci_rc()==1) //接收到“1”表示允许进入,三色灯显示绿色 { RED=0; GRE=1; } else //接收到其他数据,表示不允许,三色灯显示红色 { RED=1; GRE=0; } } /*该函数用于通过4*4键盘修改口令*/ void modify_key(void) { unsigned char key_temp; char i,j,cnt=0; LCD_INITIA(); LCD_START(LINE1,1); for(i=0;i<12;i++) LCD_WRITE(tip3[i]); //lcd提示“要修改口令吗” if(keyfind()==15) //按15号“确认”键确认 { LCD_INITIA(); LCD_START(LINE1,1); //lcd显示提示“请输入旧口令” for(i=0;i<12;i++) LCD_WRITE(tip4[i]); while(cnt<5) //允许5次输入旧口令 { if(calibration()==1) { LCD_INITIA(); LCD_START(LINE1,1); //lcd显示提示“请输入新口令” for(i=0;i<12;i++) LCD_WRITE(tip5[i]); for(i=0;i<6;i++) { key_temp=keyfind(); if(key_temp==12) //按12号“取消”键,可退出该模式 17 天津大学 电气与自动化工程学院 return; else if(key_temp==14) //按14号“更改输入”键,可重新输入 { i=0; continue; } else if((key_temp==15)&(i==5)) //按15号“确认”键,结束输入 break; pass_temp[i]=key_temp; } for(j=0;j<5;j++) { password[j]=pass_temp[j]; } break; } else { LCD_INITIA(); LCD_START(LINE1,1); 旧口令” for(i=0;i<12;i++) LCD_WRITE(tip4[i]); cnt++; GRE=1; RED=1; 警告 } if(cnt==4) return; } } else return; } /*该函数用于初始化LCD*/ void LCD_INITIA() //LCD初始化 { unsigned char n; for(n=0;n<10;n++) { SSPBUF = W_COMMAND; while(!SSPIF); //等待发送完成 //lcd显示提示“请输入 //三色灯显示黄色 18 天津大学 电气与自动化工程学院 SSPIF=0X00; //清除中断标志位 SSPBUF=LCD_IN[n]; while(!SSPIF); //等待发送完成 SSPIF=0X00; //清除中断标志位 n++; SSPBUF=LCD_IN[n]; while(!SSPIF); //等待发送完成 SSPIF=0X00; //清除中断标志位 delay(1); } } /*LCD清屏*/ void LCD_CLEAR(void) { //清屏 SSPBUF = W_COMMAND; while(!SSPIF); //等待发送完成 SSPIF=0X00; //清除中断标志位 SSPBUF = 0X00; while(!SSPIF); //等待发送完成 SSPIF=0X00; //清除中断标志位 SSPBUF = 0X10; while(!SSPIF); //等待发送完成 SSPIF=0X00; //清除中断标志位 } /*该函数用来向LCD写数据的起始位置*/ void LCD_START(char line,char first) { unsigned char n; //n存放发送数据的长度 unsigned char i; if(line==LINE1) { SSPBUF = W_COMMAND; while(!SSPIF); //等待发送完成 SSPIF=0X00; //清除中断标志位 SSPBUF=LCD_DDRAM1[0]; while(!SSPIF); //等待发送完成,发送高四位80H SSPIF=0X00; //清除中断标志位 SSPBUF=(LCD_DDRAM1[1]+first)<<4; while(!SSPIF); //等待发送完成,发送低四位 SSPIF=0X00; //清除中断标志位 } else { 19 天津大学 电气与自动化工程学院 SSPBUF = W_COMMAND; while(!SSPIF); //等待发送完成 SSPIF=0X00; //清除中断标志位 SSPBUF=LCD_DDRAM2[0]; while(!SSPIF); //等待发送完成,发送高四位90H SSPIF=0X00; //清除中断标志位 SSPBUF=(LCD_DDRAM2[1]+first)<<4; while(!SSPIF); //等待发送完成,发送低四位 SSPIF=0X00; //清除中断标志位 } } /*向lcd写数据*/ void LCD_WRITE(unsigned char data) { SSPBUF =W_DATA; //发送写数据的指令 while(!SSPIF); //等待发送完成 SSPIF=0X00; //清除中断标志位 SSPBUF = data&0xf0; //发送数据D7-D4 while(!SSPIF); //等待发送完成 SSPIF=0X00; //清除中断标志位 SSPBUF = (data&0x0F)<<4; //发送数据D3-D0 while(!SSPIF); //等待发送完成 SSPIF=0X00; //清除中断标志 delay(1); } /*该函数用于sci初始化*/ void sci_initial() { // 初始化操作 SYNC=0; //采用异步模式 TX9=0; TXEN=0; BRGH=0; //采用低速模式 SPBRG=77; //波特率1200,低速, RCSTA=0X90; //采用8位数据传输,可连续接收 TXIE=0; RCIE=0; //屏蔽该中断,采用查询方式 } /*该函数用于RS232接收通讯*/ char sci_rc(void) { char x; while(!RCIF); x=RCREG; 20 天津大学 电气与自动化工程学院 delay(2); return(x); } /*该函数用于RS232发送通讯*/ void sci_tx(unsigned char bb) { TXEN=1; TXREG=bb; while(!TXIF); delay(1); TXEN=0; } /*该函数用于查询4*4键盘的编号*/ unsigned char keyfind(void) { unsigned char j,temp1; //j为列号, unsigned char temp2=0x80; PORTD=0XF0; while(1) { if (PORTD!=0XF0) { delay(5); //键盘去抖处理 if (PORTD!=0XF0) break; } } for (j=0;j<4;j++) { temp1=PORTD; temp1=temp1&temp2; if(temp1==0) break; temp2=temp2>>1; } return(keyscan()+j); } /*该函数用于查询4*4键盘的行号*/ unsigned char keyscan(void) { unsigned char scancode=0xf7,i,a,b; //i表示行号 unsigned char temp; for(i=0;i<13; ) { 21 天津大学 电气与自动化工程学院 PORTD=scancode; temp=PORTD; temp=temp&0xf0; if (temp!=0xf0) break; //扫描到第i行时退出扫描 a=scancode>>1; //先将scancode右移7位 b=scancode<<7; scancode=a|b; i=i+4; } return(i); } /*该函数用于判断数组相等*/ char compare(void) { char i; for(i=0;i<5;i++) { if(pass_temp[i]!=password[i]) return 0; } return 1 ; } /*该函数可用于软件延时*/ void delay(unsigned char a) //延时 { unsigned int i,j; for(i=0;i22
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务