ARMARM嵌入式IIC实验led实验KEYBORAD实验中断测试Word格式.docx
《ARMARM嵌入式IIC实验led实验KEYBORAD实验中断测试Word格式.docx》由会员分享,可在线阅读,更多相关《ARMARM嵌入式IIC实验led实验KEYBORAD实验中断测试Word格式.docx(40页珍藏版)》请在冰豆网上搜索。
//初始化S3C2410的Interrupt,PortandUART
keyboard_test();
//调用keyboard_test()
while
(1);
}
TestKeyBoard.c
/*头文件和宏定义*/
#definerCPLDLEDADDR(*(volatileunsignedchar*)0x21180000)//LED对应的真实地址(物理地址)
voidkeyboard_test(void);
//void__irqkeyboard_int(void);
UINT8Tkey_set(UINT8TucChar);
/*外部函数*/
externvoidiic_write_keybd(UINT32TunSlaveAddr,UINT32TunAddr,UINT8TucData);
externvoidiic_read_keybd(UINT32TunSlaveAddr,UINT32TunAddr,UINT8T*pData);
externvoidiic_init_keybd(void);
/*全局变量*/
UINT32Tg_nKeyPress;
keyboard_init
按键板初始化
voidkeyboard_init(void)
iic_init_keybd();
//iic初始化
led_on
根据键值点亮相应led灯和超范围数据处理
voidled_on(UINT8TkeyNum)//led编码对应二进制数据
intlow8=0x0F|(1<
<
7);
//0x0F将低四位置1(1<
7)表示蜂鸣器的控制位
if(keyNum<
15)//数据0~E为正常范围
{
rCPLDLEDADDR|=low8;
//将低四位和第八位置1.低四位用于表示键值。
第八位为1表示蜂鸣器不工作
rCPLDLEDADDR&
=~keyNum;
//对led编码。
led的亮灭代表1和0.通过4个led的亮灭表示相应按键。
最右边为最低位
}
else
=~(1<
//数据超范围以报警处理,蜂鸣器发声
keyboard_test
测试按键板
voidkeyboard_test(void)
UINT8TucChar;
keyboard_init();
//按键板初始化
while
(1)
{
while
(1)//等待按键被按下(使用查询方式)有键被按下时跳出该循环
{
iic_read_keybd(0x70,0x00,&
ucChar);
//从从器件0x70的系统寄存器0x00读取数据
if(ucChar&
0x01)//判断从器件的系统寄存器0x00最低位SystemReg.0的值置1时表示有效的按键动作,清0表示无按键动作
break;
}
iic_read_keybd(0x70,0x1,&
//从从器件的键值寄存器读取按键信息
if(ucChar!
=0)//当ucChar!
=0时表示有键被压按
ucChar=key_set(ucChar);
//对获得的按键信息进行处理(根据需要编码)
led_on(ucChar);
//根据键值点亮对应的led灯
}
key_set
键值设置
UINT8Tkey_set(UINT8TucChar)//根据从器件的键值寄存器读取回来的数据改成自定义编码
switch(ucChar)
{
case1:
case2:
case3:
case4:
case5:
ucChar-=1;
break;
//如果读取数据为1~5范围,则减一以下类似
case9:
case10:
case11:
case12:
case13:
ucChar-=4;
case17:
case18:
case19:
case20:
case21:
ucChar-=7;
default:
ucChar=0;
//若不在以上的数据范围内,则赋值0,表示超出范围
returnucChar;
IICOfKeyBoard.c
IIC总线的初始化、读写、中断
/*函数声明*/
void__irqiic_int(void);
voidiic_init_keybd(void);
voidiic_read_keybd(UINT32TunSlaveAddr,UINT32TunAddr,UINT8T*pData);
/*全局变量*/
intf_nGetACK;
iic_init_keybd
初始化iic
voidiic_init_keybd(void)
f_nGetACK=0;
//初始化为0非应答
//中断初始化
rINTMOD=0x0;
//所有都设置为普通中断。
中断模式寄存器
rSRCPND=rSRCPND;
//这里是清掉所有标志位。
中断源挂起(标志)寄存器,对其标志位清0,其方法为写1.
rINTPND=rINTPND;
//与上一行同理。
中断服务(挂起)寄存器
rINTMSK&
=~(BIT_IIC);
//开放INT_IIC中断源
//iic初始化
rIICADD=0x10;
//S3C2410X从器件地址。
该地址由从器件的芯片资料和硬件接线图可获知00010000
rIICCON=0xaf;
//使能ACK和IIC总线中断,清除pending位以便响应中断。
设置IICCLK=MCLK/16。
10101111
rIICSTAT=0x10;
//0001000000:
从接收模式0:
写入0,产生停止条件使能“串行数据输出使能”低四位为状态位主要用来读出数据,写入没有作用
//应答位清0
pISR_IIC=(unsigned)iic_int;
//对INT_IIC中断入口地址初始化(将iic_int中断函数地址放到INT_IIC中断入口)
iic_write_keybd
向iic写数据
iic_read_keybd
从iic读数据
//根据IIC总线的读写控制逻辑编程
voidiic_read_keybd(UINT32TunSlaveAddr,UINT32TunAddr,UINT8T*pData)
charcRecvByte;
//初始化为0非应答
//Sendcontrolbyte
rIICDS=unSlaveAddr;
//写从器件地址到IICDS
rIICSTAT=0xf0;
//配置为主发送模式,产生起始条件
while(f_nGetACK==0);
//等应答
//应答清0
//Sendaddress
rIICDS=unAddr;
//写从器件的相应寄存器地址到IICDS
//使能ACK和IIC总线中断,清除未决条件并恢复中断响应
//Sendcontrolbyte
rIICSTAT=0xb0;
//配置为主接收模式,产生起始条件
//Getdata
cRecvByte=rIICDS;
//从IICDS读数据
rIICCON=0x2f;
//禁止应答
delay
(1);
//Getdata
//Endreceive
rIICSTAT=0x90;
//配置为主接收模式,产生停止条件(主接收停止)
//使能ACK和IIC总线中断,清除未决条件并恢复中断响应
delay(10);
//等待直到停止条件生效
*pData=cRecvByte;
iic_int
IIC中断函数
void__irqiic_int(void)
ClearPending(BIT_IIC);
//清除IIC中断标志位
f_nGetACK=1;
//应答位置1,表示有应答
深圳大学实验报告
课程名称:
嵌入式系统设计
实验项目名称:
KEYBORAD实验(中断测试)
学院:
专业:
自动化
指导教师:
报告人:
学号
实验时间:
2012.12.4
实验报告提交时间:
2012.12.5
教务部制
实验目的与要求:
实验要求:
1.熟悉中断(INT)的编程及使用;
2.熟悉EEPROM编程和使用;
3.自学熟悉KEYBOARD的运作过程;
4.建立工程文件;
5.把keyboard的输入在LED上显示,超范围的数据以报警处理。
实验内容:
1、建立工程文件
A相关文件的建立与引入
B工程文件配置
2、分析KEYBOARD的初始化程序
KEYBOARD的初始化程序主要是对IIC相关寄存器的初始化。
主要做了三个操作
1IIC中断:
INT_IIC中断源的初始化
2IIC相关寄存器初始化
3IIC中断入口地址初始化
下面逐个分析:
代码如下
总共配置了INT_IIC中断源的四个寄存器。
每一句程序详细分析如下:
AINTMOD---中断模式寄存器
//所有都设置为普通中断。
中断模式寄存器
BSRCPND---中断源挂起(标志)寄存器
rSRCPND=rSR