东北大学嵌入式课程设计电子密码锁程序.docx
- 文档编号:4449404
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:31
- 大小:21.32KB
东北大学嵌入式课程设计电子密码锁程序.docx
《东北大学嵌入式课程设计电子密码锁程序.docx》由会员分享,可在线阅读,更多相关《东北大学嵌入式课程设计电子密码锁程序.docx(31页珍藏版)》请在冰豆网上搜索。
东北大学嵌入式课程设计电子密码锁程序
#include"710defs.h"
#include"AC97.h"
#include"HB_it.h"
#include
#include"main.h"
#include"lcd_pattern.h"
externintc;
externU8shuru;
externU8a[7];
externU8b[7];
externintp;
externintc;
/*播放缓冲区的首地址*/
#definebase_addres0x100000
/*播放数据*/
UINT8PlayData[]={
#include"8k.dat"
};
UINT8PlayData1[]={
#include"7k.dat"
};
UINT32PCM_QUEUE_LEN=(512*1024);
UINT_uPlayVol=0x1f1f;
UINT16sPlayVolume=0;
BOOLPlayLastBlock;
volatileUINT_uPcmQHead;
/*延时函数*/
staticvoidDelay1(intnCnt)
{
volatileintloop;
for(loop=0;loop } /*播放函数1*/ INTPlayCallback(UINT8*pucBuff,UINT32uDataLen) { UINTnLen; nLen=PCM_QUEUE_LEN-_uPcmQHead; /*将数据从PCM队列中取出放到DMA缓存区*/ if(nLen>=uDataLen) { memcpy(pucBuff,&PlayData[_uPcmQHead],uDataLen); _uPcmQHead=(_uPcmQHead+uDataLen)%PCM_QUEUE_LEN; } else { memcpy(pucBuff,&PlayData[_uPcmQHead],nLen); memcpy(&pucBuff[nLen],PlayData,uDataLen-nLen); _uPcmQHead=uDataLen-nLen; } return0; } /*播放函数2*/ INTPlayCallback1(UINT8*pucBuff,UINT32uDataLen) { UINTnLen; nLen=PCM_QUEUE_LEN-_uPcmQHead; /*将数据从PCM队列中取出放到DMA缓存区*/ if(nLen>=uDataLen) { memcpy(pucBuff,&PlayData1[_uPcmQHead],uDataLen); _uPcmQHead=(_uPcmQHead+uDataLen)%PCM_QUEUE_LEN; } else { memcpy(pucBuff,&PlayData1[_uPcmQHead],nLen); memcpy(&pucBuff[nLen],PlayData1,uDataLen-nLen); _uPcmQHead=uDataLen-nLen; } return0; } /*读AC97寄存器*/ staticUINT16ac97_read_register(INTnIdx) { UINTvolatilenWait; /*置起R_WB位并写入寄存器地址*/ REG_ACTL_ACOS1=(0x80|nIdx); /*设置帧是否有效和有效的时隙*/ REG_ACTL_ACOS0=0x11; Delay1(100); /*检查AC_ACTL_ACCON的AC_R_FINISH位是否被置高,若被置高,说明读数据缓存区已经准备好给CPU读取*/ for(nWait=0;nWait<0x10000;nWait++) { if(REG_ACTL_ACCON&AC_R_FINISH) break; } REG_ACTL_ACOS0=0; Delay1(100); return(REG_ACTL_ACIS2&0xFFFF); } /*写AC97寄存器*/ staticINTac97_write_register(INTnIdx,UINT16sValue) { volatileUINTnWait; /*清R_WB位并写入寄存器地址*/ REG_ACTL_ACOS1=nIdx; /*写入AC97寄存器的值*/ REG_ACTL_ACOS2=sValue; /*设置帧的有效位和有效的时隙*/ REG_ACTL_ACOS0=0x13; Delay1(100); /*检查AC_ACTL_ACCON的AC_W_FINISH位,若被清零,说明AC-LINK控制数据输出缓存已经被CPU移到编解码器*/ for(nWait=0;nWait<0x10000;nWait++) { if(! (REG_ACTL_ACCON&AC_W_FINISH)) break; } /*若读回的值和写入的值相同,则说明写入成功*/ if(ac97_read_register(nIdx)! =sValue) {while (1) ; } REG_ACTL_ACOS0=0; return0; } /*初始化AC97*/ UINT8Initac97() { /*使能音频控制器和AC-LINK接口*/ REG_ACTL_CON=REG_ACTL_CON|IIS_AC_PIN_SEL|AUDIO_EN|ACLINK_EN|PFIFO_EN|RFIFO_EN|T_DMA_IRQ|R_DMA_IRQ|DMA_EN; Delay1(1000); /*stereo模式*/ REG_ACTL_RESET=REG_ACTL_RESET|0x3000; /*重启音频控制器*/ REG_ACTL_RESET=REG_ACTL_RESET|ACTL_RESET_BIT; Delay1(1000); REG_ACTL_RESET=REG_ACTL_RESET&~ACTL_RESET_BIT; Delay1(1000); /*重启AC97接口*/ REG_ACTL_RESET=REG_ACTL_RESET|AC_RESET; Delay1(1000); REG_ACTL_RESET=REG_ACTL_RESET&~AC_RESET; Delay1(1000); /*冷启动AC97*/ REG_ACTL_ACCON=REG_ACTL_ACCON|AC_C_RES; Delay1(1000); REG_ACTL_ACCON=REG_ACTL_ACCON&~AC_C_RES; Delay1(1000); /*检查AC97的ACTL_ACIS0的CODEC_READY位,若置起则说明AC97准备好了*/ if(! (REG_ACTL_ACIS0&0x10)) { while (1); } Delay1(100); /*选择麦克1;3D控制关;looback关*/ ac97_write_register(AC97_GENERAL_PURPOSE,0); return0; } UINT8StartPlay(INTnSamplingRate) { /*使能VRA(variablerateaudio)并设置播放采样率*/ ac97_write_register(AC97_EXT_AUDIO_CTRL,ac97_read_register(AC97_EXT_AUDIO_CTRL)|0x1); ac97_write_register(AC97_FRONT_DAC_RATE,nSamplingRate); /*设置DMA基地址和目的地址长度*/ REG_ACTL_PDSTB=base_addres; REG_ACTL_PDST_LENGTH=0x1000; PlayLastBlock=0; /*开始播放*/ REG_ACTL_ACOS0=0x1c;//设置数据传输时隙有效 REG_ACTL_PSR=0x3; REG_ACTL_RESET=REG_ACTL_RESET|AC_PLAY; return0; } /*设置音量*/ INTSetPlayVolume(UINT8ucLeftVol,UINT8ucRightVol) { INTnLData,nRData; if(ucLeftVol==0) nLData=0x80; else nLData=31-(ucLeftVol&0x1f); if(ucRightVol==0) nRData=0x80; else nRData=31-(ucRightVol&0x1f); sPlayVolume=(nLData<<8)|nRData; if(ucLeftVol==0) nLData=0x80; else nLData=62-ucLeftVol*2; if(ucRightVol==0) nRData=0x80; else nRData=62-ucRightVol*2; _uPlayVol=(nLData<<8)|nRData; /*设置音量*/ ac97_write_register(AC97_PCM_OUT_VOLUME,sPlayVolume);//PCM数据输出音量 ac97_write_register(AC97_AUX_OUT_VOLUME,_uPlayVol);//耳机音量设置 ac97_write_register(AC97_MASTER_VOLUME,_uPlayVol);//全局音量设置 return0; } UINT8StopPlay() { /*停止播放*/ REG_ACTL_RESET=REG_ACTL_RESET&~AC_PLAY; REG_ACTL_ACOS0=0; /*关闭音频播放中断*/ REG_AIC_MDCR=REG_AIC_MDCR|0x40; return0; } intmain(void) {//USI寄存器初始化 intcnt,i; U8wchar1[]="请输密码"; U8wchar2[]="密码正确"; U8wchar3[]="密码错误"; U8wchar4[]="系统锁定"; U8wchar5[]="请欣赏音乐"; LCD_IMAGE_TLCD_Size; LCD_LOCATION_TLCD_Location; LCDShowParameterLSP0,LSP1,LSP2,LSP3,LSP4,LSP5; LCD_Size.width=480; LCD_Size.height=240; LCD_Location.StartX=0; LCD_Location.StartY=0; LCD_Location.EndX=960; LCD_Location.EndY=240; printf("***************USI测试程序**********************\n"); printf("*************Flash型号W25P10********************\n"); USIInit(); //读器件ID printf("读器件ID: "); USIRead_ID(); //擦除扇区0 printf("写使能: \n"); USIWriteEnable(); while(USICheckBusy()); USISectorErease(0x0); for(cnt=0;cnt<6;cnt++) a[cnt]=cnt;//发送数据初始化 LCDInit(); LCDShow(LCD_Size,LCD_Location); LCDFIFOBufferSet(BlackBoard); LCDDisplayOn(); LSP0.StartX=10; LSP0.StartY=14; LSP0.LibPlace=0x400000; LSP0.Color=0x07ff; LSP0.LetterChar=wchar1;/*请输密码*/ LSP0.LCDBuffer=BlackBoard; LSP2.StartX=10; LSP2.StartY=14; LSP2.LibPlace=0x400000; LSP2.Color=0x07ff; LSP2.LetterChar=wchar3;/*密码错误**/ LSP2.LCDBuffer=BlackBoard2; LSP3.StartX=10; LSP3.StartY=14; LSP3.LibPlace=0x400000; LSP3.Color=0x07ff; LSP3.LetterChar=wchar4;/*系统锁定*/ LSP3.LCDBuffer=BlackBoard3; LSP4.StartX=10; LSP4.StartY=14; LSP4.LibPlace=0x400000; LSP4.Color=0x07ff; LSP4.LetterChar=wchar2; LSP4.LCDBuffer=BlackBoard4;/*密码正确*/ LSP5.StartX=10; LSP5.StartY=14; LSP5.LibPlace=0x400000; LSP5.Color=0x07ff; LSP5.LetterChar=wchar5;/*请欣赏音乐*/ LSP5.LCDBuffer=BlackBoard5; LCDOutputShow(LSP0,4); KPIInit(); printf("Pleasepresskeys.\n"); while (1) { if(p==1) { for(i=0;i<2;i++) { EBILedInit(0x80); Delay(0x100000); EBILedInit(0x40); Delay(0x100000); EBILedInit(0x20); Delay(0x100000); EBILedInit(0x10); Delay(0x100000); EBILedInit(0x08); Delay(0x10000); EBILedInit(0x04); Delay(0x100000); EBILedInit(0x02); Delay(0x10000); EBILedInit(0x01); Delay(0x100000); } LCDInit(); LCDShow(LCD_Size,LCD_Location); LCDFIFOBufferSet(BlackBoard4); LCDDisplayOn(); LCDOutputShow(LSP4,4); Delay(10000000); LCDInit(); LCDShow(LCD_Size,LCD_Location); LCDFIFOBufferSet(BlackBoard5); LCDDisplayOn(); LCDOutputShow(LSP5,5); /*播放音乐*/ { PCM_QUEUE_LEN=sizeof(PlayData); _uPcmQHead=0; /*设置I/O连接到音频*/ REG_GPIO_CFG0=0x155; /*//GPIO4,1: 输入GPIO0,2,3: 输出*/ REG_GPIO_DIR0=0xd; /*使能音频时钟*/ REG_CLKSEL=REG_CLKSEL|0x10000; Initac97(); /*使能AC97播放中断*/ REG_AIC_SCR6=0x41; REG_AIC_MECR=0x40; SetPlayVolume(30,30); StartPlay(8000); /*检查是否播放完成*/ while (1) { if(_uPcmQHead>=(PCM_QUEUE_LEN-4096)) break; } StopPlay(); } } if(p==2) { LCDOutputShow(LSP2,4); for(i=0;i<5;i++) { EBILedInit(0x0F); Delay(0x100000); EBILedInit(0xF0); Delay(0x100000); } } if(p==3) { LCDOutputShow(LSP3,4); for(i=0;i<10;i++) { EBILedInit(0x80); Delay(1000000); EBILedInit(0x01); Delay(1000000); } /*播放警报音乐*/ { PCM_QUEUE_LEN=sizeof(PlayData1); _uPcmQHead=0; /*设置I/O连接到音频*/ REG_GPIO_CFG0=0x155; /*//GPIO4,1: 输入GPIO0,2,3: 输出*/ REG_GPIO_DIR0=0xd; /*使能音频时钟*/ REG_CLKSEL=REG_CLKSEL|0x10000; Initac97(); /*使能AC97播放中断*/ REG_AIC_SCR6=0x41; REG_AIC_MECR=0x40; SetPlayVolume(30,30); StartPlay(8000); /*检查是否播放完成*/ while (1) { if(_uPcmQHead>=(PCM_QUEUE_LEN-4096)) break; } StopPlay(); } } } return0; } /******************************************************************************* *FunctionName: KPIInit *Description: KPI初始化 *Input: None *Output: None *Return: None *******************************************************************************/ voidKPIInit(void) { REG_GPIO_CFG2|=0x000aaaaa;//将GPIO设置为KPI模式 REG_GPIO_CFG2&=0xfffaaaaa; REG_AIC_SCR29=0x00000045;//将KPI中断设置为高电平有效,优先级为5 REG_AIC_MECR=0x20000000; REG_KPICONF=0x00142fff; } /******************************************************************************* *FunctionName: USIInit *Description: 初始化USI,设置GPIO口为USI模式,配置SCLK串行时钟 *Input: None *Output: None *Return: None *******************************************************************************/ voidUSIInit(void) { REG_GPIO_CFG5=0x000AA000; REG_USI_DIVIDER=0x1; REG_USI_CNTRL=0x00000044; REG_USI_SSR=0x0; } /******************************************************************************* *FunctionName: Delay *Description: 用于不精确延时 *Input: 延时时间 *Output: None *Return: None *******************************************************************************/ voidDelay(U32t) { do { t--; }while(t); } /******************************************************************************* *FunctionName: USICheckBusy *Description: 检测Fl
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 东北大学 嵌入式 课程设计 电子 密码锁 程序