您的当前位置:首页正文

嵌入式课程设计报告

2024-01-10 来源:客趣旅游网


嵌入式课程设计报告

设计题目:电子密码锁

摘要 随着科技和人们的生活水平的提高,实现防盗的问题也变得尤为突出,传统机械锁构造简单,电子锁的保密性高,使用灵活性好。根据需要设计运用W90P170开发板,制作一款电子密码锁,密码锁通过键盘输入密码,通过在LCD的文字和图片显示当前密码锁的状态。实现设置密码,密码验证,错误密码自锁、图片显示的功能。

目录

1

一、选题意义及系统功能 ....................................................................... 3

二、硬件设计及描述 ....................................................................................... 4

三、软件设计及描述 ....................................................................................... 5

四、程序代码 ................................................................................................... 6

五、课程设计体会 ......................................................................................... 11

六、运行结果 ................................................................................................. 12

七、心得体会 ................................................................................................. 12

八、参考文献 ................................................................................................. 13

九、附录.......................................................................................................... 13 一、选题意义及功能描述

1、选题意义

电子密码锁是通过密码输入来控制电路或是芯片工作,从而控制机械的开关闭合、开锁的电子产品。随着科技提高和人们生活水平的提高,对电子密码锁的需求增加。电子密码做较传统的机械锁安全性能更高。

2

特点如下:

(1)保密性好,编程量大,随机开锁的成功率几乎为零。

(2)密码可变,用户可以随时改变密码,防止密码被盗,同时也可以避免人员的更替而使锁的密级下降。

(3)误码输入保护,输入密码多次错误是,系统进行自锁。

(4)无活动零件,不会磨损,寿命长。

(5)使用灵活性好,无需佩戴钥匙,操作简单。

2、功能描述

基本功能:

(1)从键盘输入任意6位数字作为密码,将这六位数字经过USI总线存储到Flash芯片中,设置密码完成。

(2)从键盘输入密码,比较键盘输入的密码与Flash中存储的密码是否相同。

(3)如果密码正确,则LED灯点亮;如果密码不正确,则LED灯闪烁,而且如果连续三次输入密码错误则系统锁定,不允许再次输入密码。

扩展功能:

3

(1)首先显示“请输入密码:”,显示密码锁背景图片1。

(2)如果密码正确则显示“密码正确”,显示成功进入系统的背景图片2。

(3)如果密码不正确则显示“密码不正确,请重新输入:”

(4)如果连续三次输入密码错误则显示“对不起,您已经连续三次输入密码错误,系统锁定”,显示图片1。

3、个人开发流程

(1)了解开发板的硬件结构编写适应其硬件结构的程序。

(2)掌握并编写LCD显示文本和图片程序。

(3)通过EBI对外部LED灯进行控制。

(4)键盘键值读取,及密码锁密码比对,密码锁状态转换的程序编写。

二、硬件设计及描述

1、LED灯模块

CPU的数据总线低8位连接到锁存器74HC273的信号输入端,CPU外部总线接口(EBI)的nECS0片选信号连接到锁存器的锁存控制信号,当CPU 访问BANK0的任一地址空间是,数据总线的低八位的数据被锁存输出,作为控制8个LED等的发光状态的控制信号,

4

当写入0xff是,8个LED灯都灭,写0x00,8个LED灯都亮。硬件连接图如下。

2、KPI工作模块

行列式键盘以矩阵形式排列,每个键有一常开触点,其两端分别于输出扫描线和输入状态线相连,键盘中有无键按下,是由列线扫描输出、读入行线状态来判断。每个键都有一个键值和键号,通常将行、列按二进制顺序组合成酱汁,经过查表获得键号。硬件连接图如下

5

3、LCD工作模块

该模块由40个引脚与外界电路相连,由于本身没有寄存器,需要W90P710提供的LCD控制寄存器来控制选择对应的液晶类型及显示形式,FIFO的使用,颜色的显示模式和时序的设置,并通过配置相应的寄存器就可实现。

四、软件设计及描述

1、KPI模块设计

实验中的GPIO为键盘模式,使用的是GPIO_CFG2,查找相应的寄存器进行设置,打开键盘中断,设定中断触发方式和优先级,扫描功能打开,时间约为100ms。

2、LCD显示模块

6

初始化呢控制寄存器,设定lcd控制器和中断服务程序,并写到AIC中断向量表中。关闭FIFO1和FIFO0,关闭绿的控制器,重置控制器,再讲显示的数据发送到缓存区中,根据时序的配置,从缓冲区中将数据读入液晶。

3、整体模块设计及程序流程图

在主程序中进行按键初始化,在中断程序中实现,按键值的读取和存储,通过设定状态标志位,数组。对存储的密码和输入的密码进行比较,判断对错从而改变状态标志位,在中短结束,回到主程序后通过识别状态标志位,显示相应的图形和文字。

五、程序代码(主要程序,函数部分见附录)

7

1、main.c

#include

#include \"710defs.h\" /*头文件声明*/

#include \"HB_it.h\"

#include \"main.h\"

#include \"lcd_pattern.h\"

extern U8 a[6];

extern int p;

extern U32 KeyValue;

int main(void)

{

U32 FLL;

int cnt,i;

8

U8 wchar[]= \"设置密码\";

U8 wchar1[]= \"请输密码\";

U8 wchar2[]= \"密码正确\";

U8 wchar3[]= \"密码错误\";

U8 wchar4[]= \"对不起,您已经连续三次输入密码错误,系统锁定\";

LCD_IMAGE_T LCD_Size; /*声明结构体,结构体的具体定义在头文 LCD_LOCATION_T LCD_Location; 件中*/

LCDShowParameter LSP;

LCD_Size.width = 480; /*定义lcd的显示的长宽像素值*/

LCD_Size.height = 240;

LCD_Location.StartX = 0; /*设定显示的起始坐标*/

LCD_Location.StartY = 0;

LCD_Location.EndX = 960;

9

LCD_Location.EndY = 240;

LCDInit(); /*初始化*/

LCDShow(LCD_Size, LCD_Location);

LCDFIFOBufferSet(BlackBoard); LCDDisplayOn(); KPIInit(); printf(\"Please press keys.\\n\"); USIInit(); //读器件ID printf(\"读器件ID:\");

USIRead_ID(); //擦除扇区0

printf(\"写使能:\\n\");

USIWriteEnable();

while(USICheckBusy());

/*将要显示的图片存入缓存中,以便显示*/

/*显示图片*/

/*按键初始化*/

/*并通过串口输出此时的键值*/

/*初始化flash芯片*/

10

USISectorErease(0x0);

EBILedInit(0x0);

LSP.StartX = 8;

LSP.StartY = 7;

LSP.LibPlace = 0x400000;

LSP.Color = 0x07ff;

LSP.LetterChar = wchar1;

LSP.LCDBuffer = BlackBoard;

LCDOutputShow(LSP,4);

EBILedSet(0x00);

while(1)

{

if(p==6)

11

{

LCDInit();

LCDShow(LCD_Size, LCD_Location);

LCDFIFOBufferSet(BlackBoard);

LCDDisplayOn();

LSP.StartX = 8;

LSP.StartY = 7;

LSP.LibPlace = 0x400000;

LSP.Color = 0x07ff;

LSP.LetterChar = wchar1; /*正确密码*/

LSP.LCDBuffer = BlackBoard;

LCDOutputShow(LSP,4);Delay(10000000);

}

12

if(p==1)

{

LCDInit();

LCDShow(LCD_Size, LCD_Location);

LCDFIFOBufferSet(BlackBoard);

LCDDisplayOn();

LSP.StartX = 5;

LSP.StartY = 5;

LSP.LibPlace = 0x400000;

LSP.Color = 0x07ff;

LSP.LetterChar = wchar2; /*正确密码*/

LSP.LCDBuffer = BlackBoard;

LCDOutputShow(LSP,22);Delay(10000000);

13

}

if(p==2)

{

LCDInit();

LCDShow(LCD_Size, LCD_Location);

LCDFIFOBufferSet(BlackBoard);

LCDDisplayOn();

LSP.StartX = 5;

LSP.StartY = 5;

LSP.LibPlace = 0x400000;

LSP.Color = 0x07ff;

LSP.LetterChar = wchar3; /*密码错误*/

LSP.LCDBuffer = BlackBoard;

14

LCDOutputShow(LSP,4);Delay(10000000);

}

if(p==3)

{

LCDInit();

LCDShow(LCD_Size, LCD_Location);

LCDFIFOBufferSet(BlackBoard);

LCDDisplayOn();

LSP.StartX = 5;

LSP.StartY = 5;

LSP.LibPlace = 0x400000;

LSP.Color = 0x07ff;

LSP.LetterChar = wchar4; /*请输密码*/

15

LSP.LCDBuffer = BlackBoard;

LCDOutputShow(LSP,22);Delay(10000000);

}

}

return 0;

}

2、中断服务程序

void KPI_Handler(void)

{

// U32 KeyValue, tmp;

int cnt,sum=0;

//int shuru;

//int i;

16

tmp = REG_KPISTATUS; //取按键值

tmp &= 0x0000000f; //因为硬件连接关系,需要对按键进行处理

if((tmp > 0x7) && (tmp < 0xC))

{

KeyValue = tmp - 4;

}

else if((tmp > 0x3) && (tmp < 0x8))

{

KeyValue = tmp + 4;

}

else

{

KeyValue = tmp;

17

}

printf(\"KPI interrupts. %x\\n\

if(c<6)

{a[c]=KeyValue;} /*将设置的密码放在数组中*/

else if(c==6)

{

USIWriteEnable();

USIWrite(0x00, a); /*将设置的密码放在flash芯片中存储中*/

printf(\"Succeed\\n\"); /*将设置密码结束,更新状态位*/

Delay(100);

P=6;

}

else if(c>6 && c<13)

18

{

b[c-7]=KeyValue; /*输入密码*/

}

else if(c==13)

{

USIRead(0x0,a); /*将输入密码放入在flash芯片中存储呢*/

for(cnt=0;cnt<6;cnt++)

{

if(a[cnt]==b[cnt]) /*比对密码*/

sum++;

}

if(sum==6)

{

19

printf(\"测试成功.....%d\\n\密码正确状态位为1*/

p=1;

}

else

{

printf(\"测试失败.....%d\\n\

p=2;

}

}

else if(c>13 && c<20)

{

b[c-14]=KeyValue;/*继续读取密码*/

}

20

else if(c==20)/*继续比对密码*/

{

USIRead(0x0,a);

for(cnt=0;cnt<6;cnt++)

{

if(a[cnt]==b[cnt])

sum++;

}

if(sum==6)

{

printf(\"测试成功.....%d\\n\

p=1;

}

21

else

{

printf(\"测试失败.....%d\\n\

p=3;

}

}

else if(c>20 && c<27)

{

b[c-21]=KeyValue;

}

else if(c==27)/*第三次比对*/

{

USIRead(0x0,a);

22

for(cnt=0;cnt<6;cnt++)

{

if(a[cnt]==b[cnt])

sum++;

}

if(sum==6)

{

printf(\"测试成功.....%d\\n\

p=1;

}

else

{

printf(\"测试失败.....%d\\n\

23

p=4;

}

}

else/*这之后程序不再允许进行输入*/

{

printf(\"invalid operations\\n\");

}

c++;

}

六、实验结果截图

(1)密码锁初始状态,显示设置密码,显示图片1。

24

(2)设置密码后显示,输入密码。

25

(3)当连续输入错误的密码,系统显示密码错误,并且锁定系统。

(4)当输入密码正确时,显示图片2。

26

七、课程设计体会

经过这次课程设计,我对arm芯片有了更深入的理解,同时在操作W90P710这款芯片开发板的过程中提高了动手能力。掌握了ADS集成开发环境及JTAG仿真器的使用。通过实践,不断更改调试程序的过程中,我对理论学习长得中断源程序的编写、GPIO控制寄存器、中断寄存器的控制、对库函数的调用有了更好的理解和掌握。 同时也意识到自己的不足,学好汇编和c语言基础是未来面向硬件编程的重要基础,在c语言部分,指针的知识与应用还需加强。本次课程设计的过程中体现出了arm系列芯片较传统mcu的优势,接口丰富,内部存储资源更充裕。但是本次课设主要是运用了芯片偏向mcu的功能,并没有在芯片中加载操作系统。Arm系列的学习才刚刚开始,仅在入门阶段,未来需要深入继续学习嵌入式知识,使自己的技能更上一层楼。

八、参考文献

[1]张毅坤,陈善久,裘雪红. 单片微型计算机原理及应用.西安电子科技大学出版社.2008年5月

27

[2] 华成英,童诗白. 模拟电子技术基础.高等教育出版社,2007年8月

[3] 唐俊翟等 单片机原理与应用 冶金工业出版社, 2003.9

[4] 刘瑞新等 单片机原理及应用教程 机械工业出版社, 2003.7

[5] 吴国经等 单片机应用技术 中国电力出版社, 2004.1

[6] 李全利,迟荣强编著 单片机原理及接口技术 高等教育出版社,2004.1

九、附录

/*******************************************************************************

* Function Name : LCDInit

* Description : LCD初始化

* Input : None

* Output : None

* Return : None

*******************************************************************************/

28

void LCDInit(void)

{

REG_GPIO_CFG6 = 0x555555;

REG_LCD_LCDCON = 0x30c05;

REG_LCD_FIFO1PRM = 0xa;

REG_LCD_F1DREQCNT = 0x1e000f0;

REG_LCD_FIFO1RELACOLCNT = 0x1e0;

//LCD CLK

REG_LCD_LCDTCON1 = 0x3b166;

REG_LCD_LCDTCON2 = 0x3bf00f1;

REG_LCD_LCDTCON3 = 0x105401;

REG_LCD_LCDTCON4 = 0x20101;

REG_LCD_LCDTCON5 = 0xe;

29

}

/*******************************************************************************

* Function Name : LCDShow

* Description : 设置LCD显示位置

* Input : None

* Output : None

* Return : None

*******************************************************************************/

void LCDShow(LCD_IMAGE_T Size, LCD_LOCATION_T Location)

{

REG_LCD_F1DREQCNT = (Size.width <<15 ) + Size.height;

REG_LCD_FIFO1RELACOLCNT = (Size.width >> 1);

REG_LCD_DISPWINS = (Location.StartY << 16) + Location.StartX;

30

REG_LCD_DISPWINE = (Location.EndY << 16) + Location.EndX;

}

/*******************************************************************************

* Function Name : LCDFIFOBufferSet

* Description : 指向LCD缓冲区存取图像内容

* Input : 数组名称

* Output : None

* Return : None

*******************************************************************************/

void LCDFIFOBufferSet(PUINT8 Buffer)

{

REG_LCD_F1SADDR = (U32) Buffer;

}

31

/*******************************************************************************

* Function Name : LCDDisplayOn

* Description : 打开LCD

* Input : None

* Output : None

* Return : None

*******************************************************************************/

void LCDDisplayOn(void)

{

lcdIoctl(1, 1, 0);

}

/*******************************************************************************

* Function Name : LCDDisplayOff

32

* Description : 关闭LCD

* Input : None

* Output : None

* Return : None

*******************************************************************************/

void LCDDisplayOff(void)

{

lcdIoctl(1, 2, 0);

}

/*******************************************************************************

* Function Name : Delay

* Description : 用于不精确延时

* Input : 延时时间

33

* Output : None

* Return : None

*******************************************************************************/

void Delay(U32 t)

{

do

{

t--;

}while(t);

}

/*******************************************************************************

* Function Name : StringShow

* Description : 显示单个字符

34

* Input : LCD显示字符相关信息

* Output : None

* Return : None

*******************************************************************************/

void StringShow(LCDShowParameter LCDShowPara)

{

//用于取汉字点阵图

U32 Offset = 0, Length = 0;

U8 PBuffer[32] = {0};

//用于将汉字点阵图转化为LCD显示图

U32 BitCounter = 8; //8

U32 ByteCounter = 0; //32

U32 temp;

35

U8 ColorHigh, ColorLow;

//用于在LCD上显示汉字

U32 X = 0, Y = 0, Line = 0, Row = 0;

U8 LBuffer[512] = {0};

Offset = ((LCDShowPara.LetterChar[0]-0xa1) * 0x5e +

(LCDShowPara.LetterChar[1] - 0xa1)) << 5;

for(Length = 0; Length < 32; Length++)

{

PBuffer[Length] = (* (unsigned int volatile *)(LCDShowPara.LibPlace + Offset + Length));

}

ColorLow = (U8)(0x00ff & LCDShowPara.Color);

ColorHigh = (U8)(0xff00 & LCDShowPara.Color >> 8);

for(ByteCounter = 0; ByteCounter < 32; ByteCounter++)

36

{

BitCounter = 8;

temp = PBuffer[ByteCounter];

for(BitCounter = 0; BitCounter < 8; BitCounter++)

{

if((temp & 0x80) == 0x80)

{

LBuffer[(ByteCounter << 4) + (BitCounter << 1)] = ColorHigh;

LBuffer[(ByteCounter << 4) + (BitCounter << 1) + 1] = ColorLow;

}

else

{

37

LBuffer[(ByteCounter << 4) + (BitCounter << 1)] = 0x00;

LBuffer[(ByteCounter << 4) + (BitCounter << 1) + 1] = 0x00;

}

temp <<= 1;

}

}

for(Row = 0; Row < 16; Row++)

{

for(Line = 0; Line < 32; Line++)

{

X = (LCDShowPara.StartX << 5) + Line;

Y = (LCDShowPara.StartY << 4)+ Row;

LCDShowPara.LCDBuffer[X + 960 * Y] = LBuffer[Line + (Row << 5)];

38

}

}

}

/*******************************************************************************

* Function Name : LCDOutputShow

* Description : 显示多字符并自动换行

* Input : LCD显示字符相关信息及字数

* Output : None

* Return : None

*******************************************************************************/

void LCDOutputShow(LCDShowParameter LCDShowPara, U32 NUM)

{

U32 temp;

39

StringShow(LCDShowPara);

for(temp=1; temp < NUM; temp++)

{

LCDShowPara.StartX = LCDShowPara.StartX + 1;

if(LCDShowPara.StartX > 29)

{

LCDShowPara.StartY = LCDShowPara.StartY + 1;

LCDShowPara.StartX = 0;

}

LCDShowPara.LetterChar = &LCDShowPara.LetterChar[2];

StringShow(LCDShowPara);

}

}

40

/*******************************************************************************

* Function Name : USIInit

* Description : 初始化USI,设置GPIO口为USI模式,配置SCLK串行时钟

* Input : None

* Output : None

* Return : None

*******************************************************************************/

void USIInit(void)

{

REG_GPIO_CFG5 = 0x000AA000;

REG_USI_DIVIDER = 0x1;

REG_USI_CNTRL = 0x00000044;

REG_USI_SSR=0x0;

41

}

/*******************************************************************************

* Function Name : USICheckBusy

* Description : 检测Flash状态寄存器“忙”位

* Input : None

* Output : None

* Return : None

*******************************************************************************/

U8 USICheckBusy(void)

{

REG_USI_Tx0 = 0x05; //读状态寄存器命令

REG_USI_CNTRL = 0x00000044; //发送8位

REG_USI_SSR = 0x1;//CS=0

42

REG_USI_CNTRL = REG_USI_CNTRL | 0x01;//启动发送

while(REG_USI_CNTRL & 0x1);//判断是否发送完成

while(1)

{

REG_USI_Tx0 = 0xff;//发送ff提供接收时钟,把状态寄存器的数据读回接收寄存器

REG_USI_CNTRL = 0x00000044;//发送8位

REG_USI_SSR=0x1;//CS=0

REG_USI_CNTRL =REG_USI_CNTRL|0x01;//启动发送

if(((REG_USI_Rx0 & 0xff) & 0x01) != 0x01)//等待检测状态寄存器的忙状态

{

break;

}

}

43

printf(\"Busy=0x%x\\n\

REG_USI_SSR=0x0; //CS=1

return 0;

}

/*******************************************************************************

* Function Name : USIWriteEnable

* Description : 写使能,在写数据到flash存储器或者擦除操作时前要加上写使能

* Input : None

* Output : None

* Return : None

*******************************************************************************/

void USIWriteEnable(void)

{

44

REG_USI_Tx0 = 0x06;//写使能命令

REG_USI_CNTRL = 0x00000044;

REG_USI_SSR = 0x1;//CS=0

REG_USI_CNTRL = REG_USI_CNTRL | 0x01;//启动发送

while(REG_USI_CNTRL & 0x1);//等待发送结束

REG_USI_SSR = 0x0;//CS=1

}

/*******************************************************************************

* Function Name : USIRead

* Description : 从Flash读一个字节

* Input : None

* Output : None

* Return : None

45

*******************************************************************************/

void USIRead(U32 R_addr,U8 *Read_buff)

{

U32 Read_cnt;

U8 Rx_temp;

//传送8位命令

REG_USI_Tx0 = 0x03;//读数据命令

REG_USI_CNTRL = 0x00000044;

REG_USI_SSR = 0x1;

REG_USI_CNTRL = REG_USI_CNTRL | 0x01;

while(REG_USI_CNTRL&0x1);

//传送24位地址

REG_USI_Tx0 = R_addr;

46

REG_USI_CNTRL = 0x000000c4;

REG_USI_CNTRL = REG_USI_CNTRL | 0x01;

while(REG_USI_CNTRL & 0x1);

//读出flash某一页的数据

for(Read_cnt = 0; Read_cnt < 6; Read_cnt++)

{

REG_USI_Tx0 = 0xff;

REG_USI_CNTRL = 0x00000044;

REG_USI_CNTRL = REG_USI_CNTRL | 0x01;

while(REG_USI_CNTRL & 0x1);

Rx_temp=REG_USI_Rx0;

*(Read_buff++) =Rx_temp;

printf(\"Address\\0x%x: \\%d\\n\

47

}

REG_USI_SSR=0x0;

printf(\"接收完成.....\\n\");

}

/*******************************************************************************

* Function Name : USIWrite

* Description : 向Flash写一个字节

* Input : None

* Output : None

* Return : None

*******************************************************************************/

void USIWrite(U32 W_addr, U8 *W_buff)

{

48

U16 Write_cnt;

//传送8位命令

REG_USI_Tx0 = 0x02;//写命令

REG_USI_CNTRL = 0x00000044;

REG_USI_SSR = 0x1;

REG_USI_CNTRL = REG_USI_CNTRL | 0x01;

while(REG_USI_CNTRL & 0x1);

//传送24位地址

REG_USI_Tx0 = W_addr;

REG_USI_CNTRL = 0x000000c4;

REG_USI_CNTRL = REG_USI_CNTRL | 0x01;

while(REG_USI_CNTRL & 0x1);

//传送8位数据

49

for(Write_cnt=0;Write_cnt<6;Write_cnt++)

{

REG_USI_Tx0 = *(W_buff++);

REG_USI_CNTRL = 0x00000044;

REG_USI_CNTRL = REG_USI_CNTRL | 0x01;

while(REG_USI_CNTRL & 0x1);

}

REG_USI_SSR = 0x0;

while(USICheckBusy()); //检测是否写完

printf(\"写数据完成....\\n\");

}

/*******************************************************************************

* Function Name : USIRead_ID

50

* Description : 正确的ID=0xEF10

* Input : None

* Output : None

* Return : None

*******************************************************************************/

void USIRead_ID(void)

{

U8 instruction_code = 0x90;//读ID命令

U32 Device_ID;

REG_USI_SSR = 0x1;

REG_USI_CNTRL = 0x00000004;

REG_USI_Tx0 = instruction_code << 24;

REG_USI_CNTRL = REG_USI_CNTRL | 0x01;

51

while(REG_USI_CNTRL & 0x1);

REG_USI_Tx0 = 0xffff;//提供读数据时钟

REG_USI_CNTRL = REG_USI_CNTRL | 0x01;

while(REG_USI_CNTRL & 0x1);

Device_ID = REG_USI_Rx0;

REG_USI_SSR = 0x0;

printf(\"Device_ID=0x%x\\n\

}

/*******************************************************************************

* Function Name : chip_erease()

* Description :

* Input : None

* Output : None

52

* Return : None

*******************************************************************************/

void USISectorErease(U32 Erea_addr)

{

USIWriteEnable();

REG_USI_Tx0 = 0xD8;//扇区擦除命令

REG_USI_CNTRL = 0x00000044;

REG_USI_SSR=0x1;

REG_USI_CNTRL = REG_USI_CNTRL|0x01;

while(REG_USI_CNTRL & 0x1);

REG_USI_Tx0 = Erea_addr;

REG_USI_CNTRL = 0x000000C4;

REG_USI_CNTRL = REG_USI_CNTRL | 0x01;

53

while(REG_USI_CNTRL & 0x1);

REG_USI_SSR = 0x0;

while(USICheckBusy());//等待检测是否擦除结束

printf(\"擦除完成....\\n\");

}

/*******************************************************************************

* Function Name : Write_disable()

* Description : OK

* Input : None

* Output : None

* Return : None

*******************************************************************************/

void USIWriteDisable(void)

54

{

REG_USI_Tx0 = 0x04;//禁止写命令

REG_USI_CNTRL = 0x00000044;

REG_USI_SSR = 0x1;

REG_USI_CNTRL = REG_USI_CNTRL | 0x01;

while(REG_USI_CNTRL & 0x1);

REG_USI_SSR = 0x0;

}

/*******************************************************************************

* Function Name : KPIInit

* Description : KPI初始化

* Input : None

* Output : None

55

* Return : None

*******************************************************************************/

void KPIInit(void)

{

REG_GPIO_CFG2 |= 0x000aaaaa; //将GPIO设置为KPI模式

REG_GPIO_CFG2 &= 0xfffaaaaa;

REG_AIC_SCR29 = 0x00000045; //将KPI中断设置为高电平有效,优先级为5

REG_AIC_MECR = 0x20000000;

REG_KPICONF = 0x00142fff;

}

56

因篇幅问题不能全部显示,请点此查看更多更全内容