用PIC32单片机实现电子密码锁.doc_第1页
用PIC32单片机实现电子密码锁.doc_第2页
用PIC32单片机实现电子密码锁.doc_第3页
用PIC32单片机实现电子密码锁.doc_第4页
用PIC32单片机实现电子密码锁.doc_第5页
免费预览已结束,剩余46页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机设计实验报告2011年小学期单片机设计实验报告题目: 电子密码锁班 级:2010211114班内序号:27学生姓名:张丹丹学 号:10210430指导教师:葛顺明电子密码锁 实验摘要电子密码锁这个项目实现的功能是:初始系统设置默认密码:“123”,用户可以根据液晶屏的提示输入密码,若用户输入密码正确,绿灯指示灯亮;然后用户可以修改密码,密码修改成功,绿灯会闪烁下;如果密码输入三次错误,报警系统就会启动,此时红灯、黄灯、绿灯三灯都会闪烁。同时屏幕显示不允许用户再次输入。即用户一旦输入三次错误密码,用户就不能再进入系统了。我们这个项目的主要功能是:1、 开锁上锁功能;2、 修改密码功能;3、 报警功能;4、 掉电存储功能;由于时间限制,再加上对单片机的某些引脚的特殊功能不太了解,本来计划好的掉电存储功能没办法实现了。从本质上看,掉电存储与液晶屏的工作原理应该是一样的,但是由于延时问题没设计好,所以导致程序崩溃,所以最终决定把掉电存储功能给舍弃掉。该系统虽然看上去较为简单,但是其可拓展性和应用性都很不错。对代码进行简单的修改,将初始的密码可以进行任意的更改。至于应用性,就比如说银行自动取款机,淘宝网上支付功能等等,与这个电子密码锁的功能本质上一致的。所以,总而言之,电子密码锁的应用真的是无所不在的。关键字PIC32MX795F512L电子密码锁矩阵键盘输入LCD液晶显示一系统硬件设计1.系统模块总体框图如下:PIC32MX795F512L单片机键盘输入模块LCD显示模块指示灯模块电源供电模块2.PIC32MX795F512L介绍 PIC32MX795F512L单片机是具有USB、CAN与以太网的32位高性能闪存式单片机,共有引脚100个,引脚分布如下:图中黄色表示已经被单片机内部集成的电路所占用,功能已经固定,不能提供给开发者使用其他功能。所以当时选用引脚时,就非常注意选用那些未被占用的引脚,尽量避免不符合要求的引脚的使用。电子密码锁:引脚93、94、98、99、100、3、4、5:RE0RE7,用作LCD的8位数据输入端;引脚90、96: RG0、RG12,用作LCD的RS与EN接口;引脚72、76、77:RD0、RD1、RD2,已经集成的3个LED指示灯;引脚39、40、28、42:RF13、RF12、RA9、RB13,用作矩阵键盘的行数据输入端;引脚49、50、81、82:RF4、RF5、RD4、RD5,用作矩阵键盘的列数据输入端。3分模块设计介绍1)RT1602C点阵LCD显示模块 引脚号引脚名电平输入/输出作用1 VSS电源地2 VCC电源(+5V)3 Vee对比调整电压4 RS0/1输入0-输入指令1-输入数据5 R/W0/1输入0=向LCD写入相应指令或数据1=向LCD读取信息6 E1,10输入/输出使能信号,1时读取信息,10(下降沿)执行指令7DB00/1输入/输出数据总线line0(最低位)8DB10/1输入/输出数据总线line19DB20/1输入/输出数据总线line210DB30/1输入/输出数据总线line311DB40/1输入/输出数据总线line412DB50/1输入/输出数据总线line513DB60/1输入/输出数据总线line614DB70/1输入/输出数据总线line7(最高位)15A+UCCLCD背光电源正极16K接地LCD背光电源负极VO为显示器对比度调整端,接正电源时对比度最弱,接电源地时对比度最高。为了简化电路以及获得最好的显示效果,将VO端口直接接电源地。R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。由于整个项目中只存在对LCD进行写入的操作,因此直接将R/W端口接电源地。GND接电源,VDD接正电源。RS为寄存器选择,高电平时选择数据寄存器,低电平时选择指令寄存器。源代码中LCD_write_cmd函数为向LCD写入指令的函数,因此会有RS=0;LCD_write_data函数为向LCD写入数据的函数,因此会有RS=1。E端为使能端,当E端由高电平跳变成低电平,也就是下降沿时,LCD模块进行命令执行。BL1和BL2为设置LCD背光,实验中没有使用这两个端口。DOD7八个为数据I/O口,与PORTE的0至7口相连。DDRAM就是显示数据RAM,用来寄存待显示的字符代码,共80字节,其地址和屏幕的对用关系如下表:显示位置 1 1 1 1 1 1 1. 40 第一行00H01H02H03H04H05H06H. 27H 第二行40H41H42H43H44H45H46H. 67HLCD共有11条指令:1. 清屏指令指令功能 指令编码RSR/WDB7DB6DB5DB4DB3DB2DB1DB0 清屏0000000001功能:清除液晶显示屏,即将DDRAM的内容全部填入“空白”的ASCII码20H; 光标归位,即将光标撤回液晶显示屏的左上方; 将地址计数器(AC)的值设为0。2. 光标归位指令指令功能 指令编码RSR/WDB7DB6DB5DB4DB3DB2DB1DB0 光标归位0 00000001 x功能:把光标撤回到显示器的左上方; 把地址计数器的(AC)的值设为0; 保持地址DDRAM的值不变;3. 进入模式设置指令 指令功能 指令编码RSR/WDB7DB6DB5DB4DB3DB2DB1DB0 光标归位0 000000 1I/D S功能:设定每次定入一位数据后光标的移动方向,并且设定每次写入的一个字符是否移动。参数的设定情况如下:位名设置I/D0=写入新数据后光标左移1=写入新数据后光标右移S0=写入新数据后显示屏不移动1=写入新数据后显示屏整体右移1个字符4. 显示开关控制指令指令功能 指令编码RSR/WDB7DB6DB5DB4DB3DB2DB1DB0 显示开关控制0 00000 1 D C B 功能:控制显示器开/关、光标显示/关闭 以及光标是否闪烁。参数设定的情况如下:位名设置D 0=显示功能关1=显示功能开C 0=无光标1=有光标B 0=光标闪烁1=光标不闪烁5. 设定显示屏或光标移动方向指令指令功能 指令编码RSR/WDB7DB6DB5DB4DB3DB2DB1DB0 设定显示屏或 光标移动方向0 00001 S/C R/L X X 功能:使光标移位或使整个显示屏移位。参数的设定情况如下: S/CR/L设定情况 0 0 光标左移1格,且AC值减1 0 1 光标右移1格,且AC值加1 1 0 显示器上字符全部左移1格,但光标不动 1 1 显示器上字符全部右移1格,但光标不动 6. 功能设定指令指令功能 指令编码RSR/WDB7DB6DB5DB4DB3DB2DB1DB0 功能设定0 000 1DL N F X X 功能:设定数据总线位数、显示的行数及字型。参数设定的情况如下: 位名设置 DL0=数据总线为4位1=数据总线为8位 N0=显示1行1=显示2行 F0=5*7点阵/每字符1=5*10点阵/每字符7. 设定CGRAM地址指令指令功能 指令编码RSR/WDB7DB6DB5DB4DB3DB2DB1DB0设定CGRAM地址0 00 1 CGRAM的地址(6位)功功能:设定下一个要存入数据的CGRAM的地址。8. 设定DDRAM地址指令指令功能 指令编码RSR/WDB7DB6DB5DB4DB3DB2DB1DB0设定CGRAM地址0 01 CGRAM的地址(7位) 功 功能:设定下一个要存入数据的CGRAM的地址。 9.读取忙信号或AC地址 指令功能 指令编码RSR/WDB7DB6DB5DB4DB3DB2DB1DB0设定CGRAM地址0 1FB AC的内容(7位)功能:读取忙碌信号BF的内容,BF=1表示液晶显示器忙,暂时无法接收单片机送来的数据或指令;当BF=0时,液晶显示器可以接收单片机送来的数据或指令;读取地址计数器(AC)的内容。2)4X4键盘模块示意图如下:4X4矩阵键盘的工作原理是每一条行线与列线的交叉处是否连通,是由交叉处的按键决定的,采取这种行列式矩阵结构只需要4条行线和4条列线,即可组成具有4X4个按键的矩阵键盘。在我们的实验中矩阵键盘中的16个按键并没有完全采用,各个按键按照其键盘序号使用情况如下图:按键键名功能09键数字键输入数字A键确认键对相应操作进行确认指令B键开关键系统开启与关闭D 键更改密码键对密码进行更改E键保存键对新输入的密码进行保存F键清除键删除所有的输入3)指示灯模块指示灯采用PIC32MX795F512L单片机内集成的三个LED灯构成,通过指示灯闪烁的种类以及个数来判断系统所处的状态,系统是处于开启状态还是关闭,改密的成功与否,报警电路是否启动。三个灯的亮灯颜色分别是绿、黄、红:按键指示灯采用绿灯。当有键按下时,绿灯亮;当按键无效或者无键按下时,没有现象;开锁指示灯采用红灯。当三次以内输入密码输入密码正确时,红灯亮;修改密码时,一旦新密码保存成功,开锁指示灯灭,提示用户重新输入新的密码;报警指示:当输入密码三次以上错误时,三个指示灯会同时闪烁,同时提示“No Allowed!”,系统会强制关闭,不允许非法用户再进行输入;4)电源模块系统的电源由实验室的稳压直流电源提供,电压大小为5V。二系统软件设计1.程序流程图开始系统初始化,任意设置六位数存入number数组作为初始密码 开启系统 LCD显示:Your Password.提示用户输入密码存入save数组键盘输入判断数字键 清除键确认键报警电路启动绿、黄、红灯闪烁save和number数组进行比较 3次密码输入错误 不相等(两次以内) 两次以内密码正确LCD显示No Allowed!LCD显示Succeed绿灯闪烁LCD显示Wrong黄灯闪烁 更改 密码LCD初始化显示密码输入LCD初始化系统强制关机LCD提示New Password: 清除键存入save数组键盘输入判断 数字键 保存键 将save数组赋给 number数组 LCD显示:Password saved! 提示用户重新输入密码(已修改的密码)2.模块实现 1)LCDLCD的初始化过程如下:1延时15ms2写指令0x38(不检测忙信号)3延时5ms4写指令0x38(不检测忙信号)5延时5ms6写指令0x38(不检测忙信号)7(以后每次写指令、读/写数据操作之前均需检测忙信号)8写指令0x38 显示模式设置:16*2显示,5*7点阵,8位数据接口9写指令0x0C 显示及光标设置:显示开,不显示光标,光标不闪烁10写指令0x06 显示光标移动设置11写指令0x01 显示清屏 LCD_write_cmd(0x38); /8bit Delay_nms(2); LCD_write_cmd(0x0C); /显示开Delay_nms(2); LCD_write_cmd(0x06); /显示光标移动设置Delay_nms(2); LCD_write_cmd(0x01); /显示清屏Delay_nms(2);代码中LCD的初始化过程并没有严格采用数据手册中的过程,不过仍然符合了初始化的时序要求,这从后续的实验过程中可以看出,否则将无法完成字符的显示。LCD初始化完成之后进行字符写入,写入字符时,需要先指定字符的寄存器地址,再实际写入字符。LCD_write_cmd(ch+i);LCD_write_data( si );初始化过程中设定的显示模式为162,第一行的寄存器地址为0X80-0X8F,第二行的寄存器地址为0XC0-0XCF。 if(y=0) ch = 0x80 + x; if(y=1) ch = 0xC0 + x;由if语句确定字符的地址。当LCD显示的是字符串的时候,只需要用指针指向字符串,在while循环中多次调用LCD_write_data。2) 键盘键盘的编程方法有两种:围线反转法与行列扫描法。我们这个实验原理采用的是行列扫描法。虽然行列扫描法执行的效率不高,但是准确度却可以保证,通过对行赋值以及对列的扫描,就可以得到按下的键值,就可以得到键盘序号。先用软件自带函数PORTSetPinsDigtalIn将所有4列的I/O端口设置成输出,接着利用PORTSetBits函数将4个端口置成高电位,与此同时,将所有4行的I/O端口设置成输出类型和低电平,利用while循环中变量值的变化判断实现防抖动的功能,当处于某列中的四个按钮之一被按下时,该列的电平变化为低电平,根据电平的变化可以得知xlabel的值;ylabel值的获得与xlabel值的获得完全相反,将所有4行的I/O端口设置成输入类型和高电平,所有4列的I/O端口设置成输出类型和低电平,按钮的按下会使某行的高电平变成低电平,从而获得ylabel的值。int keyboard()/第一列_RF13=0;_RF12=1;_RB12=1;_RB13=1;if(_RF4=0)delay(10);if(_RF4=0)return 1; if(_RF5=0)delay(10);if(_RF5=0)return 5;if(_RD4=0)delay(10);if(_RD4=0)return 9;if(_RD5=0)delay(10);if(_RD5=0)return 12;/第二列_RF13=1;_RF12=0;_RB12=1;_RB13=1;if(_RF4=0)delay(10);if(_RF4=0)return 2;if(_RF5=0)delay(10);if(_RF5=0)return 6;if(_RD4=0)delay(10);if(_RD4=0)return 0;if(_RD5=0)delay(10);if(_RD5=0)return 13;/第三列_RF13=1;_RF12=1;_RB12=0;_RB13=1;if(_RF4=0)delay(10);if(_RF4=0)return 3;if(_RF5=0)delay(10);if(_RF5=0)return 7;if(_RD4=0)delay(10);if(_RD4=0)return 10;if(_RD5=0)delay(10);if(_RD5=0)return 14;/第四列_RF13=1;_RF12=1;_RB12=1;_RB13=0;if(_RF4=0)delay(10);if(_RF4=0)return 4;if(_RF5=0)delay(10);if(_RF5=0)return 8;if(_RD4=0)delay(10);if(_RD4=0)return 11;if(_RD5=0)delay(10);if(_RD5=0)return 15;return 16;3. 调试过程对于这个实验我们共进行了三个模块的调试过程:1、 键盘的测试程序: 测试的原理很简单:就是通过按下某个键值,使得设置的指示灯亮; 测试代码如下:#include /外围设备库#include #define uchar unsigned char #define uint unsigned int #define PULLUPS (CN13_PULLUP_ENABLE | CN14_PULLUP_ENABLE |CN17_PULLUP_ENABLE|CN18_PULLUP_ENABLE)/两个指示灯的弱上拉电阻使能#define CONFIG (CN_ON) /系统管道打开#define PINS (CN13_ENABLE|CN14_ENABLE|CN17_ENABLE|CN18_ENABLE) /指示灯管道使能 #pragma config FNOSC = PRIPLL / Oscillator Selection#pragma config FPLLIDIV = DIV_2 / PLL Input Divider (PIC32 Starter Kit: use divide by 2 only)#pragma config FPLLMUL = MUL_18 / PLL Multiplier#pragma config FPLLODIV = DIV_2 / PLL Output Divider#pragma config FPBDIV = DIV_1 / Peripheral Clock divisor#pragma config FWDTEN = OFF / Watchdog Timer#pragma config WDTPS = PS1 / Watchdog Timer Postscale#pragma config FCKSM = CSDCMD / Clock Switching & Fail Safe Clock Monitor#pragma config OSCIOFNC = OFF / CLKO Enable#pragma config POSCMOD = XT / Primary Oscillator#pragma config IESO = OFF / Internal/External Switch-over#pragma config FSOSCEN = OFF / Secondary Oscillator Enable/调试模式选择,通过配置寄存器DEV_CONFIG0#pragma config CP = OFF / Code Protect#pragma config BWP = OFF / Boot Flash Write Protect#pragma config PWP = OFF / Program Flash Write Protect#pragma config ICESEL = ICS_PGx2 / ICE/ICD Comm Channel Select#pragma config DEBUG = OFF void delay(uint a)uint x,y;for(x=a;x0;x-)for(y=3360;y0;y-) int keyboard()/第一列_RF13=0;_RF12=1;_RB12=1;_RB13=1;if(_RF4=0)delay(10);if(_RF4=0)return 1; if(_RF5=0)delay(10);if(_RF5=0)return 5;if(_RD4=0)delay(10);if(_RD4=0)return 9;if(_RD5=0)delay(10);if(_RD5=0)return 12;/第二列_RF13=1;_RF12=0;_RB12=1;_RB13=1;if(_RF4=0)delay(10);if(_RF4=0)return 2;if(_RF5=0)delay(10);if(_RF5=0)return 6;if(_RD4=0)delay(10);if(_RD4=0)return 0;if(_RD5=0)delay(10);if(_RD5=0)return 13;/第三列_RF13=1;_RF12=1;_RB12=0;_RB13=1;if(_RF4=0)delay(10);if(_RF4=0)return 3;if(_RF5=0)delay(10);if(_RF5=0)return 7;if(_RD4=0)delay(10);if(_RD4=0)return 10;if(_RD5=0)delay(10);if(_RD5=0)return 14;/第四列_RF13=1;_RF12=1;_RB12=1;_RB13=0;if(_RF4=0)delay(10);if(_RF4=0)return 4;if(_RF5=0)delay(10);if(_RF5=0)return 8;if(_RD4=0)delay(10);if(_RD4=0)return 11;if(_RD5=0)delay(10);if(_RD5=0)return 15;return 16;int main()_TRISF4=1;_TRISF5=1;_TRISD4;_TRISD5=1; mCNOpen(CONFIG, PINS, PULLUPS);PORTSetPinsDigitalOut(IOPORT_F, BIT_12|BIT_13);PORTClearBits(IOPORT_F, BIT_12|BIT_13);PORTSetPinsDigitalOut(IOPORT_B, BIT_12|BIT_13);PORTClearBits(IOPORT_B, BIT_12 |BIT_13);PORTSetPinsDigitalOut(IOPORT_D, BIT_1);PORTClearBits(IOPORT_D, BIT_1); int pressed=0;while(1)pressed=keyboard();if (pressed!=16)_RD1=1;else_RD1=0;在调试过程中确实遇到了好多问题:首先是软件编程的问题:由于刚开始对键盘的原理不清楚,编程过程糊里糊涂,一边用反转扫描法,一边又想用行列扫描法,最终不伦不类。后来又专门去找了老师,老师又很认真地给我们讲了一遍键盘的原理,又详细给我们介绍了行列扫描法与线反转法的区别与联系。后来我们经过商量,最终决定用行列扫描法。其次是硬件的问题:由于分工,莘鉴主要负责硬件的焊接与连接,我主要负责软件编程。硬件连接也是一个艰巨的过程。因为硬件的调试是一个比较繁琐随机的过程。它可能出现的问题太多了,而且连线易短路断路,所以我们每次调试的时候,基本都会拿电压表测试下线路的接触是否良好,很佩服她的耐性。我们刚开始调试时,一直出现串行的问题,总是不能出现预想的效果。后来我们又采取换引脚的方法,当然引脚也不是随便换的,主要是为了利用上拉电阻,保证在赋值时必定是高电位。高电位一定来自于按键的按下,而不是本身的高电位。从而可以确定按键序号。2、 LCD液晶屏的调试模块 LCD1602.c/ 名称: LCD1602液晶控制与显示程序#include #include LCD1602.h/ LCD忙等待 RS-RG13 RWRG12 ERG14void LCD_BUSY_WAIT() INT8U status; TRIS_LCD_DAT = 0xFF; /将端口设为输入 PORTClearBits(IOPORT_G, BIT_13); /RS = 0; PORTSetBits(IOPORT_G, BIT_12); /RW = 1; /读状态寄存器 do PORTSetBits(IOPORT_G, BIT_14); /E=1;status=PORT_LCD_DAT;PORTClearBits(IOPORT_G, BIT_14); /E=0; while (status & 0x80); /忙则继续等待/ 写LCD命令void Write_LCD_Command(INT8U cmd) TRIS_LCD_DAT=0x00;PORT_LCD_DAT=cmd;PORT_LCD_CTL=TRIS_LCD_CTL=0x00;PORTClearBits(IOPORT_G, BIT_13); /RS=0;PORTClearBits(IOPORT_G, BIT_12); /RW=0;PORTSetBits(IOPORT_G, BIT_14); /E=1;PORTClearBits(IOPORT_G, BIT_14); /E=0; LCD_BUSY_WAIT(); /LCD忙等待/ 写LCD数据寄存器void Write_LCD_Data(INT8U dat) TRIS_LCD_DAT=0x00;PORT_LCD_DAT=dat;PORTSetBits(IOPORT_G, BIT_13); /RS=1;PORTClearBits(IOPORT_G, BIT_12); /RW=0;PORTSetBits(IOPORT_G, BIT_14); /E=1;PORTClearBits(IOPORT_G, BIT_14); /E=0; LCD_BUSY_WAIT(); /LCD忙等待/ LCD初始化void LCD_Initialize() Write_LCD_Command(0x38); /置功能,8位,双行,5*7 Write_LCD_Command(0x01); /清屏 Write_LCD_Command(0x06); /字符进入模式:屏幕不动,字符后移 Write_LCD_Command(0x0C); /显示开,关光标/ 在r行(01) c列(015)显示字符串void LCD_ShowString(INT8U r, INT8U c,char *str) INT8U i=0; if (r=0) Write_LCD_Command(0x80|c);elseif(r=1)Write_LCD_Command(0xC0|c);for (i=0;i16&stri!=0;i+)Write_LCD_Data(stri);main.c/ 名称: 1602LCD字符液晶测试程序/ 说明: 本例运行时,LCD第一行显示静态字符串,第二行显示键盘矩阵/ 所输入的字符,程序支持空格输入,退格和清除.#include #include #include LCD1602.h/可显示的字符表(最后一位是空格符)(分别对应:0x00-0x0D)/const char CHAR_Table = 0123456789+-= ;/待显示字符串/char Disp_String17;/有键按下/#define Key_Pressed() (RC4 = 1)/键值/#define KEY_VALUE (PORTC & 0x0F)/ 主程序void main()SYSTEMConfig(SYS_FREQ, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);PORTSetPinsDigitalOut(IOPORT_G, BIT_12 | BIT_13| BIT_14);PORTClearBits(IOPORT_G, BIT_12 | BIT_13| BIT_14);PORTSetPinsDigitalOut(IOPORT_E, BIT_0 | BIT_1| BIT_2| BIT_3| BIT_4| BIT_5| BIT_6| BIT_7);PORTClearBits(IOPORT_E, BIT_0 | BIT_1| BIT_2| BIT_3| BIT_4| BIT_5| BIT_6| BIT_7); char c; INT8U sLen; LCD_Initialize(); /LCD初始化 LCD_ShowString(0,0,(char*)- ABC 1234 -); LCD_Initialize(); /LCD初始化 LCD_ShowString(1,0,(char*)- ABC 1234 -);/LCD1602.h/ 名称: 1602液晶头文件#define INT8U unsigned char#define INT16U unsigned int#define _XTAL_FREQ 1000000UL /LCD命令 #define LCD_CLS 0x01#define LCD_HOME 0x02#define LCD_SETMODE 0x04#define LCD_SETVISIBLE 0x08#define LCD_SHIFT 0x10#define LCD_SETFUNCTION 0x20#define LCD_SETCGADDR 0x40#define LCD_SETDDADDR 0x80/LCD数据端口与命令端口定义#define PORT_LCD_DAT PORTE#define PORT_LCD_CTL PORTG#define TRIS_LCD_DAT TRISE#define TRIS_LCD_CTL TRISG/ The following is used by the main application#define SYS_FREQ(80000000) /主频80MHzvoid LCD_Initialize();void LCD_BUSY_WAIT();void Write_LCD_Command(INT8U data);void Write_LCD_Data(INT8U data);void LCD_ShowString(INT8U r,INT8U c,char *str);对于液晶屏的调试过程比键盘的调试过程更加繁琐,软件的编程相当简单,但是硬件的调试就不那么顺利了,刚开始我们调试的过程中,老是出现乱码,只有“abc123”能正常显示,其它的数字和字母都不能正常显示,我和队友刚开始还以为是连线的问题,接触不好,我和队友几乎把该测试的都测试了,结果还是不能解决问题。最后,无可奈何之下又去找了老师,老师把液晶屏的原理又给我们重新讲了一遍,他提醒我们从本质上去分析问题,不要老是停留在表面上,因为可能是单片机或者底座的问题,与连线可能都没有问题。然后我们回去按照老师的方法,一点一点调试,把所有的可能都试了一遍。(d)01100100变成了(l)01101100;(D)01000100变成了(L)01001100;终于找出了规律:液晶屏的第5和6个引脚极有可能短路一块了,因为总是第五位与第六位总是电位相同。于是我们把问题集中到了引脚上面,先检查焊接问题,用电压表测试发现焊接没有问题,后又测试底座,终于发现原来98和99引脚连接在一起了,准确的说,就是液晶屏的数据端口第五位与第六位短路了。我们于是兴奋地冲到老师的办公室,老师用专门的工具把引脚给分开了。然后我们又回来重新上电测试,终于功夫不负有心人,终于达到我们预想的效果了。3、键盘与液晶屏测试程序 测试的思想:就是通过按下相应的键值在液晶屏上显示相应的字符。通过 按键键值测试液晶屏与键盘的配合使用情况。#include /外围设备库#include #include #include LCD1602.h#define uchar unsigned char #define uint unsigned int #define CONFIG (CN_ON) /系统管道打开#define PINS (CN16_ENABLE) /指示灯管道使能#define PULLUPS (CN15_PULLUP_ENABLE | CN16_PULLUP_ENABLE)/两个指示灯的弱上拉电阻使能#define PULLUPS (CN13_PULLUP_ENABLE | CN14_PULLUP_ENABLE |CN17_PULLUP_ENABLE|CN18_PULLUP_ENABLE)/两个指示灯的弱上拉电阻使能#define PINS (CN13_ENABLE|CN14_ENABLE|CN17_ENABLE|CN18_ENABLE) /指示灯管道使能#pragma config FNOSC = PRIPLL / Oscillator Selection#pragma config FPLLIDIV = DIV_2 / PLL Input Divider (PIC32 Starter Kit: use divide by 2 only)#pragma config FPLLMUL = MUL_20 / PLL Multiplier#pragma config FPLLODIV = DIV_1 / PLL Output Divider#pragma config FPBDIV = DIV_1 / Peripheral Clock divisor#pragma config FWDTEN = OFF / Watchdog Timer#pragma config WDTPS = PS1 / Watchdog Timer Postscale#pragma config FCKSM = CSDCMD / Clock Switching & Fail Safe Clock Monitor#pragma config OSCIOFNC = OFF / CLKO Enable#pragma config POSCMOD = XT / Primary Oscillator#pragma config IESO = OFF / Internal/External Switch-over#pragma config FSOSCEN = OFF / Secondary Oscillator Enable/调试模式选择,通过配置寄存器DEV_CONFIG0#pragma config CP = OFF / Code Protect#pragma config BWP = OFF / Boot Flash Write Protect#pragma config PWP = OFF / Program Flash Write Protect#pragma config ICESEL = ICS_PGx2 / ICE/ICD C

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论