DSP根据TMS320F2812密码锁设计.doc

上传人:小** 文档编号:3003288 上传时间:2020-06-20 格式:DOC 页数:19 大小:128.52KB
返回 下载 相关 举报
DSP根据TMS320F2812密码锁设计.doc_第1页
第1页 / 共19页
DSP根据TMS320F2812密码锁设计.doc_第2页
第2页 / 共19页
点击查看更多>>
资源描述

《DSP根据TMS320F2812密码锁设计.doc》由会员分享,可在线阅读,更多相关《DSP根据TMS320F2812密码锁设计.doc(19页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、.-密码锁实验一、实验目的1. 掌握液晶的使用方法;2. 掌握液晶信号之间时序的正确识别和引入3. 掌握键盘信号的输入,DSP I/O口的使用;4. 掌握键盘信号之间时序的正确识别和引入。5. 熟悉对TMS320F2812的编程调试。二、实验设备1.一台装有CCS2000软件的计算机;2.插上2812主控板的DSP实验箱;3.DSP硬件仿真器。三、实验原理1.12864液晶显示器:本实验箱采用的液晶接口在DSP的数据总线上,由于DSP是十六位总线,液晶是八位总线,所以DSP的高八位总线悬空。液晶的结构框图如下,2.4*4矩阵按键:实验箱上提供一个4x4的行列式键盘。2812的8个I/O口与之相

2、连,这里按键的识别方法是扫描法。键被按下时,与此键相连的行线电平将由与此键相连的列线电平决定,而行线的电平在无按键按下时处于高电平状态。让所有的列线处于低电平,按键所在的行电平将被拉成低电平。根据此行电平的变化,便能判断此行一定有按键被按下,但还不能确定是哪个键被按下。那么,按下键的那列电平就会拉成低电平,判断出哪列为低电平就可以判断出按键号码。四、实验步骤1.把2812模块小板插到大板上;打开液晶模块的电源开关;2.更改源程序,通过仿真器把执行代码下载到DSP芯片,不断调试;3.运行程序,通过12864液晶显示和矩阵按键实现密码锁功能。 五、总结和体会通过本次实验,实现了密码锁基本功能。具有

3、重新输入功能,能够通过按键修改密码,且最大的密码位数可通过改变程序中mimaweishu变量快速修改,初始值为50位。通过12864显示输入提示,人机界面友好。程序实现在解密后自动弹出 “欢迎使用 DSP 2812”的数据信息。虽然是基本功能,但真要实现起来还是感觉有些难度的,程序中应用大量标志来执行不同的功能,使尽量减少程序漏洞。并通过本次实验提高了标志应用能力。实验过程中遇到了很多问题,最终解决问题错误并成功实现密码锁功能。整个实验过程,是不断学习、不断进步的过程。通过实验掌握了液晶和矩阵按键的控制使用。程序的编写能力也得到了提高。由于要占用大量的存储空间来存放显示的汉字,开始时遇到了容量

4、不足的问题。于是去加深学习了2812的存储器映射和CMD文件编写相关的知识,但是资料的例子都没用到L0和L1存储空间,而是用H0空间既做程序又做数据空间。通过更改Length值还是没有解决问题。后来想到了利用LO和L1的连续8K空间和H0的8K连续空间分别作为程序空间和数据空间,解决了容量不足的问题。由于矩阵按键程序为循环扫描方式,因此源程序运行时按一下按键,按键将被扫描了几百次,这样肯定不能实现密码锁按键要单次触发的要求。通过更改按键程序实现了单次触发的条件,很好地为后续程序服务。通过实验,提高了2812程序调试能力。学会了观察变量变化在线调试的分析方法。实验程序:#include incl

5、ude/DSP281x_Device.h / DSP281x Headerfile Include File#include include/DSP281x_Examples.h / DSP281x Examples Include Fileunsigned short mimaweishu=50;unsigned short chongshuflag=0,enBflag=0,enjinflag=0,initflag=0,anAdengdai=1,shuruflag=0,chongshemima=0,rightflag=0,jiemiflag=0,chongsheflag=0,errorfla

6、g=0,anjianjishu=0,shurufinish=0;unsigned short key,keyvalue,an0=0,an1=0,an2=0,an3=0,an4=0,an5=0,an6=0,an7=0,an8=0,an9=0,anA=0,anB=0,anC=0,anD=0,anjin=0,anxin=0;unsigned short a51,b51=a,1,2,3,4,5,6,7,8,9,*,0,D,C;unsigned short table=0,1,2,3,4,5,6,7,8,9;void xianshi(unsigned short);void anjianqingling

7、() anA=anB=anC=anD=anxin=anjin=an1=an2=an3=an4=an5=an6=an7=an8=an9=an0=0; / ASCII码表unsigned char nAsciiDot = / ASCII0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, / - -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0xFC,0xFC,0x38,0x00,0x00, / -!-0x00,0x00,0x00,0x0D,0x0D,0x00,0x00,0x00,;typedef str

8、uct typFNT_GB16 / 汉字字模数据结构 signed char Index2; / 汉字内码索引 char Msk32; / 点阵码数据aa;/ 汉字数据表struct typFNT_GB16 GB_16 = 欢0, 0x04,0x34,0xC4,0x04,0xC4,0x3C,0x20,0x10, 0x0F,0xE8,0x08,0x08,0x28,0x18,0x00,0x00, 0x10,0x08,0x06,0x01,0x82,0x8C,0x40,0x30, 0x0C,0x03,0x0C,0x10,0x60,0xC0,0x40,0x00,迎1,使2,用3/*- 文字: 输4 -*

9、/*- 文字: 入5 -*/*- 文字: 密6 -*/*- 文字: 码7 -*/*- 文字: 查8 -*/*- 文字: 看9 -*/*- 文字: 数10 -*/*- 文字: 据11 -*/*- 文字: 按12 -*/*- 文字: 键13 -*/*- 文字: 开14 -*/*- 文字: 始15 -*/*- 文字: 确16 -*/*- 文字: 认17 -*/*- 文字: 正18 -*/*- 文字: 为19 -*/*- 文字: 错20 -*/*- 文字: 误21 -*/*- 文字: 请22 -*/*- 文字: 重23 -*/*- 文字: 试 24 -*/*- 文字: 新25 -*/*- 文字: 设2

10、6 -*/*- 文字: 稍27 -*/*- 文字: 后28 -*/*- 文字: 29 -*/*- 文字: 初30 -*/*- 文字: 始31 -*/*- 文字: 成32 -*/*- 文字: 功33 -*/;void Gpio_select(void);void delay(int time) int i,j; for(i=0;itime;i+) for(j=0;j1200;j+);void wcom(unsigned char com) Reg08=com;void wdata(unsigned char dat)Reg07=dat;void lcdinit(void)wcom(0xa4);w

11、com(0xad);wcom(0x03);wcom(0xac);wcom(0xe2); /initialize interal functiondelay(10); wcom(0xa2); /set nomal display wcom(0xa0); /ADC select SEG1 to SEG132wcom(0xc8); /set SHL COM1 to COM64 start page setup wcom(0x2c); /power control(VB,VR,VF=1,1,1) wcom(0x2e); /power control(VB,VR,VF=1,1,1) wcom(0x2f)

12、; /power control(VB,VR,VF=1,1,1) wcom(0x25); / wcom(0x81); /set reference voltage mode wcom(0x20); /set reference voltage wcom(0x40); /Initial Display Line was first line wcom(0xa6); /set nomal display wcom(0xa4); /set nomal display wcom(0xaf); /display onvoid clear(void)unsigned char page;unsigned

13、char seg; for(page=0xb0;page0xb9;page+) /写页地址共8页 0xb0-0xb8 wcom(page); wcom(0x10); wcom(0x00); for(seg=0;seg128;seg+) wdata(0x00); void lcdwritechar(char codenum ,char y ,char x ) unsigned char seg; unsigned int coden; codenum-=0x20; coden=codenum1)&0x0f); wcom(0x00|(x3)&0x0f); for(seg=0;seg1)&0x0f)

14、; wcom(0x00|(x3)&0x0f); for(seg=0;seg1)&0x0f);wcom(0x00|(x3)&0x0f);for(seg=0;seg1)&0x0f);wcom(0x00|(x3)&0x0f);for(seg=0;seg16;seg+)wdata(GB_16hz.Mskcoden+);main() short i,j; InitSysCtrl(); DINT; InitPieCtrl(); IER = 0x0000; IFR = 0x0000; InitPieVectTable(); lcdinit(); clear(); for(i=14;imimaweishu+1

15、;i+) bi=a; while(1) keyvalue=0;/注意的地方!使程序执行一周后keyvalue变为初始值0 GpioDataRegs.GPADAT.all =0xefff; Reg05=0x00; key=GpioDataRegs.GPADAT.all; if(key!=0xefff) if(key=0xe7ff & 0=anD) anjianqingling(); anD=1; anjianjishu+; keyvalue=D;if(key=0xebff & 0=anjin) anjianqingling(); anjin=1; /anjianjishu+;确认键,不需计数。计

16、数只为了输密码或设密码 keyvalue=#; if(key=0xef7f & 0=an0) anjianqingling(); an0=1; anjianjishu+; keyvalue=0; if(key=0xefbf & 0=anxin) anjianqingling(); anxin=1; anjianjishu+; keyvalue=*; Reg05=0x00; GpioDataRegs.GPADAT.all =0xdfff; Reg05=0x00; key=GpioDataRegs.GPADAT.all; if(key!=0xdfff) if(key=0xd7ff & 0=anA)

17、 anjianqingling(); anA=1; / anjianjishu+;计数只为了输密码或设密码 keyvalue=A; if(key=0xdbff & 0=an3) anjianqingling(); an3=1; anjianjishu+; keyvalue=3; if(key=0xdf7f & 0=an2) anjianqingling(); an2=1; anjianjishu+; keyvalue=2; if(key=0xdfbf & 0=an1) anjianqingling(); an1=1; anjianjishu+; keyvalue=1; Reg05=0x00;

18、GpioDataRegs.GPADAT.all =0xbfff; Reg05=0x00; key=GpioDataRegs.GPADAT.all; if(key!=0xbfff) if(key=0xb7ff & 0=anB) anjianqingling(); anB=1; / anjianjishu+; keyvalue=B; if(key=0xbbff & 0=an6) anjianqingling(); an6=1; anjianjishu+; keyvalue=6; if(key=0xbf7f & 0=an5) anjianqingling(); an5=1; anjianjishu+

19、; keyvalue=5; if(key=0xbfbf & 0=an4) anjianqingling(); an4=1; anjianjishu+; keyvalue=4; Reg05=0x00; GpioDataRegs.GPADAT.all =0x7fff; Reg05=0x00; key=GpioDataRegs.GPADAT.all; if(key!=0x7fff) if(key=0x77ff & 0=anC) anjianqingling(); anC=1; anjianjishu+; keyvalue=C; if(key=0x7bff & 0=an9) anjianqinglin

20、g(); an9=1; anjianjishu+; keyvalue=9; if(key=0x7f7f & 0=an8) anjianqingling(); an8=1; anjianjishu+; keyvalue=8; if(key=0x7fbf & 0=an7) anjianqingling(); an7=1; anjianjishu+; keyvalue=7; Reg05=0x00; if(0=keyvalue & 0=initflag)/请按A键输入密码查看数据 initflag=1; xianshi(0); if(A=keyvalue & 0=chongshemima & 0=ch

21、ongsheflag) chongshu: keyvalue=0;/使用goto没有经过开始处keyvalue=0;将导致按键所以一直循环. anjianjishu=0;shuruflag=1;anAdengdai=0;enBflag=enjinflag=1; /注意要重新赋值!否则再次输密码时只要前面对了就行。 for(i=0;i=17 & anjianjishu33) if(17=anjianjishu) for(i=0;i16;i+)lcdwritechar( ,2,i); lcdwritechar(*,2,anjianjishu-17); else if(anjianjishu49)

22、if(33=anjianjishu) for(i=0;i16;i+)lcdwritechar( ,2,i); lcdwritechar(*,2,anjianjishu-33); else if(anjianjishu65) if(49=anjianjishu) for(i=0;i=6 & anjianjishu22) if(6=anjianjishu) for(i=0;i16;i+)lcdwritechar( ,0,i); lcdwritechar(*,0,anjianjishu-6); else if(anjianjishu38) if(22=anjianjishu) for(i=0;i16

23、;i+)lcdwritechar( ,0,i); lcdwritechar(*,0,anjianjishu-22); else if(anjianjishu54) if(38=anjianjishu) for(i=0;i16;i+)lcdwritechar( ,0,i); lcdwritechar(*,0,anjianjishu-38); if(#=keyvalue & 1=enjinflag & 0=anAdengdai) keyvalue=0; for(i=1;imimaweishu+1;i+) if(ai!=bi) errorflag=1; if(0=errorflag)rightfla

24、g=1; if(1=errorflag) errorflag=0; /密码错误!请重新输入 xianshi(3); for(i=0;i32767;i+) for(j=0;j40;j+); if(1=chongsheflag) goto chongshe; else goto chongshu; if(1=rightflag) jiemiflag=1; rightflag=0;enjinflag=0;/防止#键进入确认功能 /密码正确!请稍后。 xianshi(4); /一段延时模拟等待 for(i=0;i32767;i+) for(j=0;j=17 & anjianjishu33) if(17

25、=anjianjishu) for(i=0;i16;i+)lcdwritechar( ,2,i); lcdwritechar(*,2,anjianjishu-17); else if(anjianjishu49) if(33=anjianjishu) for(i=0;i16;i+)lcdwritechar( ,2,i); lcdwritechar(*,2,anjianjishu-33); else if(anjianjishu65) if(49=anjianjishu) for(i=0;i16;i+)lcdwritechar( ,2,i); lcdwritechar(*,2,anjianjis

26、hu-49); if(#=keyvalue & 1=chongshemima & 0!=anjianjishu) chongshemima=0;if(anjianjishumimaweishu) for(i=anjianjishu+1;imimaweishu+1;i+) bi=a; /重设密码成功!/请稍后。 xianshi(7); /一段延时模拟等待 for(i=0;i32767;i+) for(j=0;j50;j+); goto chongshu; Reg05=0x00;/while();/mainvoid Gpio_select(void) Uint16 var1; Uint16 var

27、2; Uint16 var3; var1= 0x0000;/ sets GPIO Muxs as I/Os var2= 0xf000;/ sets GPIO DIR as outputs var3= 0x0000;/ sets the Input qualifier values EALLOW; GpioMuxRegs.GPAMUX.all=var1; GpioMuxRegs.GPADIR.all=var2;/ GPIO PORTs as output GpioMuxRegs.GPAQUAL.all=var3; / Set GPIO input qualifier values EDIS; v

28、oid xianshi(unsigned short changenum) switch(changenum) case 0: lcdwritehz(22,2,2); lcdwritehz(12,2,4); lcdwritechar(A,2,6); lcdwritehz(13,2,7); lcdwritehz(4,2,9); lcdwritehz(5,2,11); lcdwritehz(6,4,2); lcdwritehz(7,4,4); lcdwritehz(8,4,6); lcdwritehz(9,4,8); lcdwritehz(10,4,10); lcdwritehz(11,4,12)

29、; break; case 1: clear(); lcdwritehz(22,0,0); lcdwritehz(4,0,2); lcdwritehz(5,0,4); lcdwritehz(6,0,6); lcdwritehz(7,0,8); lcdwritechar(:,0,10); lcdwritehz(12,2,0); lcdwritechar(B,2,2); lcdwritehz(13,2,4); lcdwritehz(23,2,6); lcdwritehz(26,2,8); lcdwritehz(6,2,10); lcdwritehz(7,2,12); lcdwritehz(12,4

30、,0); lcdwritechar(A,4,2); lcdwritehz(13,4,4); lcdwritehz(23,4,6); lcdwritehz(25,4,8); lcdwritehz(4,4,10); lcdwritehz(5,4,12); lcdwritehz(12,6,0); lcdwritechar(#,6,2); lcdwritehz(13,6,4); lcdwritehz(16,6,6); lcdwritehz(17,6,8); lcdwritehz(4,6,10); lcdwritehz(5,6,12); break; case 2: clear(); lcdwritehz(22,0,0); lcdwritehz(4,0,2); lcdwritehz(5,0,4); lcdwritehz(30,0,6); lcdwritehz(31,0,8); lcdwritehz(6,0,10); lcdwritehz(7,0,12); lcdwritechar(:,0,14);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com