嵌入式实验报告.docx
《嵌入式实验报告.docx》由会员分享,可在线阅读,更多相关《嵌入式实验报告.docx(23页珍藏版)》请在冰豆网上搜索。
嵌入式实验报告
嵌入式系统实验报告
姓名:
班级:
学号:
教师:
流水灯实验
一、实验目的
1.理解并掌握ARM的端口操作
2.熟悉HC595工作原理
二、实验内容
1掌握端口操作
2让流水灯依次显示
3、实验原理
1.端口操作原理
A.端口功能选择
由于ARM中端口基本上都有复用,所以对端口操作时首先要确定用该端口的什么功能,一般端口用作输入输出都是GPIO功能!
确定为GPIO功能的实现方法一般为对对应端口PINSEL清0,实现方法范例如下:
PINSEL0&=KEYBOARD_SMAT;如果KEYBOARD_SMAT等于0xffff00ff,那么P0.4~P0.7端口为GPIO功能!
首先是对PINSEL0操作说明是对于P0端口中的P0.0~P0.15操作,每个端口对应两bit,因为某些端口功能多于两种;所以例子中是对P0.4~P0.7操作。
(端口功能介绍见LPC2292数据手册)
B.端口方向选择
对端口确认为GPIO功能后,则需要确定该端口是输入输出,ARM中是通过IOXDIR寄存器实现!
如:
IO0DIR|=KEYBOARD_SCK;说明是对端口P0操作,在这里其操作的范围为整个端口P0,每一个端口只有输出输入判断,估在IOXDIR一个端口只需要一个bit就可以做出判断。
如果KEYBOARD_SCK=0X00000010,说明是对P0.4设置为输出。
如IO0DIR&=(KEYBOARD_KEY^0XFFFFFFFF);为相应的输入实现方式
C.清零与置位
在端口为输出时,对于一个端口可以置位也可以清0,在ARM中的实现方式如下!
如:
IO0CLR=KEYBOARD_SI;此语句是对KEYBOARD_SI为1的位全部清0,如果KEYBOARD_SI等于0x00000040,那么P0.6端口则清0,如果KEYBOARD_SI等于0xFFFFFFFF则是对整个P0清0;对应的IOxSET也是同样的方式,不同的它对相应端口置1;
D.输入电平判断
在端口为输入时,判断以个端口是低电平还是高电平则是通过IOXPIN这类寄存器实现的。
如:
if((IO0PIN&KEYBOARD_KEY)!
=0),如果KEYBOARD_KEY等于0x00000020说明是对于P0.5做判断,如果(IO0PIN&KEYBOARD_KEY)等于0,说明该端口为返回值为低电平!
同理高电平也是通过此类判断!
2.HC595工作原理
VCC:
接电源;GND接地
SCLR(10脚):
低电平时将移位寄存器数据清零,通常接VCC.
QH(9脚):
级联输出端,接下以个595的SI
G(13脚):
高电平时禁止输出(高阻态)。
QA~QH:
为八位并行输出端RCK,SCK,SI如下:
实际中我们主要是对595控制RCK,SCK,SI来实现595的功能的。
将一个八位数据转换到QA~QH上,以0,1的方式出现在QA~QH八个端口。
通过8次SCK上升沿的移位信号用SI口接收每位数据,实现将一个字节的数据装入595中。
SCK的上升沿发出一个移位信号,每位数据都移动到下一个移位寄存器中;遇到同步发送脉冲RCK(上升沿有效)时,将这个字节的数据输出,形成一个相当于8位或多位的并行数据;
4、实验流程图
五.代码实现
#include"config.h"
voidDelayNS(uint32dly)
{
uint32i;
for(;dly>0;dly--)
{
for(i=0;i<4000;i++);
}
}
intmain(void)
{
PINSEL0=0x01000000;
IO0DIR=0x1000000;
//IO0CLR=0x100000;
while
(1)
{
IO0SET=0x01000000;
DelayNS(1010);
IO0CLR=0x01000000;
DelayNS(1010);
}
}
阵屏汉字显示实验
一、实验目的
1.了解点阵屏显示基本原理
2熟悉74HC595芯片的原理,以及如何利用74HC595写程序实现串并转换。
3熟悉使用字模软件
4进一步熟悉ARM的端口操作
二、实验内容
1建立汉字字库
2在点阵屏上显示汉字
3、实验原理
点阵屏涉及到4个引脚,分别是P0.20~P0.17。
P0.4,P0.17,P0.18和P0.19,P0.20分别作为74HC595的SCK,SI,RCK。
(结合74HC595手册理解)通过SI口接收每位数据,P0.18和P0.19分别对应SI-X,SI-Y,用于控制行和列的显示;SCK的高电平发出移位信号,每位数据都移动到下一个移位寄存器中;遇到同步发送脉冲RCK时,将多位数据一次发送到寄存器中,形成一个相当于16位或多位的并行数据。
点阵显示是这样实现的。
利用串并转换将两个16位数据分别发送给P0.18和P0.19所对应的SI-X和SI-Y。
它们分别控制片选位和显示数据位。
(至于行列哪个作片选位哪个做数据显示位可由自己定,一般便于观察和结合字模软件,将点阵屏相对于实验箱正向的行作为数据显示位,列作为片选位)通过控制片选和数据显示位可以实现固定行显示固定的亮灭信息。
再通过扫描算法(与LED灯相似)实现点阵屏显示任意数据信息。
4、实验流程图
5、代码实现
time.c
/****************************************Copyright(c)**************************************************/
/**
;**日期:
2007.8.17
;**描述:
time.c,定时器初始化及控制文件。
用于初始化定时器和启动定时器,对应的宏为
;**Timer0_Enable和Timer1_Enalbe。
根据定时器的使用来定义TIMER0和TIEMR1,
;**在TARGET.c中的targetint函数中,可调用相应的TIMER0INIT(div,ovf)或TIMER1INIT(div,ovf)
;**进行初始化,其中Div为分频系数,可以任何数据,表示PCLK的div+1记数,ovf为溢出数据
;**,定时期采用以ovf为边界的循环记数,同时产生中断,T0_InterruptSetand
;**T1_InterruptSet两个函数为两定时器的中断设置,包括中断类型设置,中断优先级的设置
;**,中断使能等.
;**
;**--------------time.c文件
;**------------------------------------------------------------------------------------------------------*/
/************************************************
*Headerfilesegment*
***********************************************/
#include"config.h"
#include"latic.h"
#include"time.h"
/************************************************
*Functiondefinitionsegment*
***********************************************/
/*-----------------------------------------------------------------*/
/*--------------------------定时器0部分----------------------------*/
/*-----------------------------------------------------------------*/
#ifdefTime0_Enable
/************************************************************
函数名:
IRQ_Timer0Interrupt(void)
描述:
定时器0中断溢出处理程序,直接添加中断服务代码于此
************************************************************/
uint8counter=0;//控制移动
void__irqIRQ_Time0Interrupt(void)
{
/*------------------可在此添加中断服务程序--------------------*/
if(counter==0x8f)
{
counter=0;
LaticMove();//移动字符
}
counter++;
LaticScan();//点阵扫描
/*------------------------------------------------------------*/
T0IR=0x01;//复位MR0中断
VICVectAddr=0x00;//清除地址
}
/***************************************************************
函数名:
Timer0_InterruptSet
功能:
定时器0中断设置,包括中断类型,中断优先级,地址分配,中断使能
****************************************************************/
voidTime0_InterruptSet(void)
{
VICIntSelect&=0xffffffef;//设置中断类型(定时器0中断为IRQ,其它为FIQ)
VICVectCntl2=0x24;//优先级分配
(2).定时器0中断为4号中断,且使能定时器0中断
VICVectAddr2=(int)IRQ_Time0Interrupt;//传送中断服务程序的入口地址
VICIntEnable=0x00000010;//允许定时器0中断源产生中断
}
/***************************************************************
函数名:
Time0Init(uint32div,uint32ovf)
功能:
定时器0初始化函数,根据需要设置分频值
和定时器溢出值,定时器工作方式组合可以在里面设置
****************************************************************/
voidTime0Init(uint32div,uint32ovf)
{
T0PR=div;//分频值(定时器计数时钟频率=Fpclk/(div+1))
T0MCR=0x03;//MR0与TC值的匹配将产生中断,并使TC复位
T0MR0=ovf;//匹配值,可以认为是定时器的溢出值
//T0TCR=0x03;//TC0开始计数并复位.
Time0_InterruptSet();
}
/****************************************************************
函数名:
Timer0Start(void)
功能:
定时器0启动,在应用程序需要处调用
*****************************************************************/
voidTime0Start(void)
{
T0TCR=0x01;
}
#endif
/*-----------------------------------------------------------------*/
/*--------------------------定时器1部分----------------------------*/
/*-----------------------------------------------------------------*/
#ifdefTime1_Enable
/************************************************************
函数名:
IRQ_Timer1Interrupt(void)
功能:
定时器1中断溢出处理程序,直接添加中断服务代码于此
************************************************************/
void__irqIRQ_Time1Interrupt(void)
{
/*------------------可在此添加中断服务程序--------------------*/
T1IR=0x01;//清除中断
VICVectAddr=0x00;//清除地址
}
/***************************************************************
函数名:
Timer1_InterruptSet(void)
功能:
定时器1中断设置,包括中断类型,中断优先级,地址分配,中断使能
****************************************************************/
voidTime1_InterruptSet(void)
{
VICIntSelect&=0xffffffdf;//设置中断类型(定时器1中断为IRQ,其它为FIQ)
VICVectCntl3=0x25;//优先级分配(3).定时器1中断为5号中断,且使能定时器1中断
VICVectAddr3=(int)IRQ_Time1Interrupt;//传送中断服务程序的入口地址
VICIntEnable=0x00000020;//允许定时器1中断源产生中断
}
/***************************************************************
函数名:
Timer1Init(uint16div,uint32ovf)
功能:
定时器1初始化函数,根据需要设置分频值
和定时器溢出值,定时器工作方式组合可以在里面设置
****************************************************************/
voidTimer1Init(uint32div,uint32ovf)
{
T1PR=div;//分频值(定时器计数时钟频率=Fpclk/(div+1))
T1MCR=0x03;//MR0与TC值的匹配将产生中断,并使TC复位
T1MR0=ovf;//匹配值,可以认为是定时器的溢出值
//T0TCR=0x03;//TC0开始计数并复位.
Time1_InterruptSet();
}
/****************************************************************
函数名:
Timer1Start(void)
功能:
定时器1启动,在应用程序需要处调用
*****************************************************************/
voidTime1Start(void)
{
T1TCR=0x01;//定时器1开始计数
}
#endif
/******************************************************************************
*EndofEntireFile*
*****************************************************************************/
time.h
/****************************************Copyright(c)**************************************************/
/**
;**日期:
2007.8.17
;**描述:
time.h定时器定义头文件。
为time.c文件提供宏以及为其他函数提供调用参数
;**
;**
;**--------------time.h文件
;**------------------------------------------------------------------------------------------------------*/
#include"config.h"
#ifndef_TIME_H_
#define_TIME_H_
#defineTime0_Enable//定时器0功能定义允许
//#defineTime1_Enable//定时器1功能定义允许
/************************************************
*Functiondeclarationsegment*
***********************************************/
externvoidTime0Init(uint32div,uint32ovf);//初始化定时器0
externvoidTime0Start(void);//启动定时器0
externvoidTimer1Init(uint32div,uint32ovf);//初始化定时器1
externvoidTime1Start(void);//启动定时器1
#endif
/******************************************************************************
*EndofEntireFile*
*****************************************************************************/
main.c
#include"config.h"
#include"time.h"
#include"latic.h"
intmain(void)
{
Time0Init(2,5000);
LaticInit();
Time0Start();
while
(1)
{
;
}
}
latic.c
/****************************************Copyright(c)**************************************************/
/**
;**日期:
2007.8.18
;**描述:
latic.c西南科技大学计算机学院CS-II型实验Latic工作程序,控制
;**两个595来实现16X16点阵的显示,该文件给latic.h提供底层接口
;**
;**--------------latic.c文件
;**------------------------------------------------------------------------------------------------------*/
/************************************************
*Headerfilesegment*
***********************************************/
#include"config.h"
#include"latic.h"
#ifdefLatic_Enable
/************************************************
*Globalevariablesegment*
***********************************************/
constuint16LaticCharacter[][16]={
/*--文字:
西--*/
/*--宋体12;此字体下对应的点阵为:
宽x高=16x16--*/
0x0002,0x7FF2,0x2812,0x2412,0x2212,0x21FE,0x2012,0x2012,0x2012,0x21FE,0x2212,0x2212,0x2212,0x7FF2,0x0002,0x0000,
/*--文字:
南--*/
/*--宋体12;此字体下对应的点阵为:
宽x高=16x16--*/
0x0004,0x0004,0x7FE4,0x0424,0x0524,0x0564,0x05B4,0x7F2F,0x0524,0x05A4,0x0564,0x2524,0x4424,0x3FE6,0x0004,0x0000,
/*--文字:
科--*/
/*--宋体12;此字体下对应的点阵为:
宽x高=16x16--*/
0x0410,0x0212,0x0192,0x0072,0xFFFE,0x0051,0x0491,0x0400,0x0422,0x02CC,0x0200,0x0200,0xFFFF,0x0100,0x0100,0x0000,
/*--文字:
技--*/
/*--宋体12;此字体下对应的点阵为:
宽x高=16x16--*/
0x0108,0x4108,0x8088,0x7FFF,0x0048,0x4028,0x4000,0x20C8,0x1348,0x0C48,0x0C7F,0x1248,0x21C8,0x6048,0x2008,0x0000,
/*--文字:
大--*/
/*--宋体12;此字体下对应的点阵为:
宽x高=16x16--*/
0x0020,0x8020,0x4020,0x2020,0x1020,0x0C20,0x03A0,0x007F,0x01A0,0x0620,0x0820,0x3020,0x6020,0xC020,0x4020,0x0000,
/*--文字:
学--*/
/*--宋体12;此字体下对应的点阵为:
宽x高=16x16--*/
0x0040,0x0230,0x0210,0x0212,0x025C,0x0254,0x4250,0x8251,0x7F5E,0x0