2020年新版微机原理键盘控制与显示实验报告x
时间:2020-10-21 01:08:33 来源:勤学考试网 本文已影响 人
別f尹丿占实验报告
专业: 姓名: 学号: 日期: 地点:
电气工程及其自动化
课程名称: 微机原理(实验) 指导老师: _徐习东 成绩:
实验名称: 键盘控制与显示 实验类型: 软件实验 同组学生姓名:
一、实验目的和要求(必填)三、主要仪器设备(必填)
一、实验目的和要求(必填)
三、主要仪器设备(必填)
五、实验数据记录和处理
二、实验内容和原理(必填) 四、操作方法和实验步骤
六、实验结果与分析(必填)
七、讨论、心得
【实验目的】
通过实验掌握TMS320F2812 通用输入/输出管脚直接控制外围设备的方法
了解发光二极管的控制编程方法。
了解SPI的使用。
了解如何使用GpioA 口进行数据的锁存
通过实验掌握TMS320F2812 的扩展端口接收外围设备信息的方法
了解键盘的使用原理及编程方法
【实验内容】
按键显示程序,对按键记录次数,以二进制显示在 16个LED上。
定时器编程,并用按键控制各位时分秒,使其能完成加减操作
【实验仪器】
TMS320F2812 数字信号处理器与学生用集成板。
【实验步骤】
撰写代码
调试代码
实现功能
【实验代码】
、疋时器
宏定义和全局变量定义
R犍蛊控制曲钟
nclude "DSP281x_De(vic? .h"
卍枝键对应值
ffdef me #def me #def me#define #def
ffdef me #def me #def me
#define #def me #def me #def me tfdefine ^define #dsfina #def me #def me #def me ine #dsfine
3 4 5 6 7 8 9 1111 1 1 1 _Fx 7X 7rx Tr\ / =c* 7X fv ■€- _c CB p= LI rHX Lr- Lx el ll p- t£ it p- p p
0 12 3 4 5 6
OkFFFE OxFFFD OkFFFB 0kFFF7 DxFFEF OxFFDF OkFFBF 0xFF7F OkFEFF OxFDFF DxFBFF OxFZFF QkEFFF
LlxBB'F?1
OjjBFFF 0x7FFF
分析:这段代码是初始宏定义, 用于定义按键对应的编码与地址,然后同时定义了全局变量,包括时、分、
分析:这段代码是初始宏定义, 用于定义按键对应的编码与地址,
然后同时定义了全局变量,
包括时、分、
Uint16
LEEReg;
UintlS
KeyReg 1:
Uitit32
1 = 0;
Uint16
Ctrl ;
int 16
Sec=0;
1 Tltl6
Mil=0;
int 16
Hor-Cl;
UintlS
Light[3];
秒,按键编码,LED编码和控制位。
UidtlC LE^Code[
UidtlC LE^Code[]
Ok jOOO.Oxf 900, OxA4OOJ.0iBDOO,0x9900,0x5200, OMfl^OD^OxFSOD, OkB000y 0x9000.0zBBOO,Oz3300,OxcEDO,Oxa IDO,OxB&OD^OssEciOO , 0x5G(J0,Uxbf DU, Osa7UQ,OzffOa,0x4000,CK79Da,DM240DrDx^ 000, 0 itl900, OkISOQ, 0s DEOO,Oz 7000,030000,0x1000);
分析:由于这次实验要用到数码管,所以我们要定义一个数码管共阳端字形码,使每一个代码对应一种显 示状态。
SPI初始化子程序
vuj d ()
Cl,L.:Rvas,U?IC2R.cll - j::?Or : 丹 使SF册于复位玄或.于障魁,八位毀握
SpieR&ns.SPICTL.BLl - nscnDOa;"壬苑頻式* —眾眉絶模式■猿魏焙W吴闭SF冲鹼. SpLaRcss.SPIBRR - Li: JQ?F; .「噩宣鴻叢霁
Spio^BBS.SFICCR.ell = SpiflE^s&.SFICCR^ll | gCXJBCi; "遼出翼垃找态
EALLOW;
Gp LoMusifegs r GPFMJX-A 11 = nxfl 'irF; 宀。京更遇用弓;靈为 EFF孑康
EDIS;
I
分析:这一段是本次实验的重点,就是 SPI初始化。
SPICCR :用于控制SPI的状态,上下降沿发送,还有几位的数据。其中第 7位,即SPICCR.6是控制 SPI在上下沿发送,1代表下降沿,2代表上升沿;第8位,即SPICCR.7是控制复位的,0代表为复位状 态;低4位控制数据长度,长度等于 n+1。
SPICTL : SPICTL.3用来设定时钟是否延迟半个周期,此程序中此位为 0,即不延迟半个周期,其中
SPICTL.2是控制主从模式的,然后 1为主设备,0为从设备,SPICTL.1是设置Talk功能,1为使能。
SPIBRR :配置波特率,即控制串行外设发送和接受的速度。
然后,将GPIO的F 口低四位设置为专门外设引脚, 即为SPI引脚。设置MUX控制是否为专门外设。
GPIO初始化
vuid gpid_iDi L()
(
EALLDW;
3piciMiis?Regs .GPAMUX.bit _TDIRA_0PIOA 11-ti: 决直迤一般f心口
GpiaMuKRegs .GPADIR.bit-GFI0A1L-1: 宀把GFFMH说置*濾出
?町囁辟珀EirajQE展置为一般"◎口輸■碾”蚀押碍
GplcMuKRcgc .GPEMUX.al 1 - Gpi.GPEMUX.all & J::ff£E;
Op l oMiizR^gs . GPFDIR . a 11 - Gp i nMii zRf-[j=: .GPEDIR . 11 | 'M\m :
心律濡置为一殻和空口 *彊严酎
□pLQMuxR&gs.GPBMU:^ ?弭1 -匹1°血眾旳兮?GPBMUX ?al L&DidJCIFF;
EDIh
GpioDataR&gs .GPADAT-bit .GPI0A11 = 1; t^{JFrUAII=fJ;该瑞口冶子卷忙亍号議春信号
分析:此部分为为 GPIO初始化,即设置 GPIO的功能,此部分里 A11设置为通用I/O,在实际电路中是
为了连接锁存口。另外 GPIOE与B的设置见注释,分别作为片选和红灯的控制。
键扫描程序
int Kj&yRcan2(void i
EALLOW,
?"獲倂1血观氏沪人¥7遊避,^膨片
□pioMuKRssa.aPBDIR*al 1 - UplcNusRegs.GP3DIR.o 1 ] & hOMf; EDTS:
Gp iQDataRfeg 5 .GPEDAT -o 11 = OzfffS; 々选通换高睢
for (1=0; i<10D; i++)n "延田
if ((GpiaEanaRegs.GPHDM丁 .日11 | r^inf p) <= f)
' for (i-0; lOOOnO; i++H> /伍时湾毀
if ( (GpiaDataPe^s .GFEDAT .a 11 | ClKnQf £ i I = i:;f f-£ ]
feyRecfl - GpiciDctaRe95.GP3DAT.all ;?-:逮鯉崔
while ((GpiaDarake^e .JPEDAT .all | LsdUi t ) I -Orf f Ef ) 抡輿直是否松看 {
GpicDdLaRyga .GPDDAT-bit .GPIOD L = IGpioDaItiRBys,(?PDDAT.bit,GFTDD U for (i=0: 1 < 1 JO Li; l++) {
}
return iI);
return [uJ;
■丄 彳
分析:键扫描程序为int类型,所以必须返回整形数据, 此程序中返回1或者0表示是否检测到键被按下。
首先通过E 口控制选通的是低 8位还是高8为。然后后面的If和for语句为延时消抖,这是检测程序中
的关键,就是检测 B 口是否有低电平出现,如果有说明有键被按下,但是我们无法判断,这个键是否被误
码里还有一个细节,就是按下,所以要进行一个空循环,如果再检测到,说明这个键按下不是因为按键自身的抖动。另外,这段代
码里还有一个细节,就是
D 口的出现,这句话只是为了进行一个空操作,进行检测按键是否松开。
控制调时子程序
分析:KEYFUNCTION 程序是为了做一个控制时钟的功能,按下一个键对应一个功能选项。由于选择项
比较多,所以用 switch比较好。然后 CTRL代表选定的位,是时,还是分,还是秒。然后通过三位的数
值到LEDCODE中查表获得数码管显示的值。 其中上调或者下降哪一位要根据 CTRL的值判断。LIGHT代
表数码管的代号。
Ml
Ml “0; 用寅分轉盼 昭上邇遍变磁阳分
void KeyFunctio&?(un3iAD4d int
bwi Lub (KttyF?j-^ 11
{
anno KI勺:
Ctrl =K14; 心潟務送宦*拉键A
bnsfik;
cas# K15!
Ctrl-KI 5; z调井转选定』裁辭
braat;
cas K16:
C~rl-Kl&j 「嘔小賊选定?按碎
break;
case K11 : 下谶?枝逞吉
iFfCtrl—R14 I
f
Sec—;
i£ (Sec:——-L)
吕X丈勺: "爛杪时, 血秒下谡暫威皇裁
>
LightL'/J -LOCedeLS&cZL J: 心臬迤数码爸丘示粒个过
Light [ b ] =LEDCod&lSecz : 11 ] : 4?第池殴码臂3示砂十位
it(Ctrl==K15i
{
Min一;
i£(MLn— 1)
血“:勺; ? &诵分賛时,凶为F调变成宜吩聲
\ _
Light [4] ^LEDCcde [biin^il 3]; 『:?看Wk裁耳等晶讥涉抒-介疗
Lisfht[3] =LEDCode [MinzLJ]; 齐 第 0十数码管晁示汾轉 ~r/t
_ — l . j. —■?- * ▼ j 罗 r* -T-A-ua^vr / u "?~""^丿■八 ?■■ ? jm
1
If (Ctrl=-K16)
{
Hol.
If(Hor==-1)
[
Hor-2:: 丹'谗小起肘,盘3卜时下逓夷或3塗^
LigAt IU^LEDCodw [Hbr^lC ]; ”:缜1:位盘码管曇示曲' .'住
Light I0]-LEDCod? :胶rd ] : {第』垃毅码管且示时十住
break;
KL2; 几土富鹫盹
if(CtrL==K14)
{
Sec+■?■;
itL( Sec--fall)
{ s^c=o; s幽环5略上调询吏成洽瓚
\
L igh匚[一]^LEDCode [Sec^l 0 ]: 心籌極数狷管豊示秒,位
LLght L b ] =LELCods [S*=zll j u第 f住數谒首克不砂+巒
iE(Ctrl—K15)
{
Mir";
iF(Min—fiO)
{
Liffht [4 ] =LEDCode [Min^lO ]; 儿第M它数码善磊示护暑々伶
Li^ht ['?] =LEDCode [Min/10]; 宀第嗔i数码警显示另氓十位
} '
i£(Ctrl—K16)
{
Hor++;
if(Hor--24)
{
Hor-0; "调小时时,EM小肘上调变成E耐
}
Light [ 1 ] =LEDCode[HorXlO]; "第2&数码管显示肘个位 Light [u ] -LEDCod*[Hor^lu:: 心帯》位數福备豆示討牛位
bre^k; default: break;
显示模块
void display ()
{
O^icnataRogc.GPADAT.bit.GPIOAll = 0; 宀給匸氏黑信号_ 个低医平
for(i -I 11 < 1 ++)
{
SpiaRajjs.SFITXBUF - Lisfht[il ;
whi le (SpioRegs. SP I^IE .b i t. I1JT_FLA0 '- 1)门 SpiaRQSB.SPIRXBUF - SpiaRdse.SPIBXBUF;
} V或殍簟诺憑
(jpioDeiaRess.GFADAT^iC.GFlOAll = 1; 心智閉用信号一令吝电毛为钢存子綁A沾
fcr(i- 丄十?■)?}-…磨时
}
分析:显示程序中就要用到 SPI的串行功能了,需要先对数据进行锁存,然后是上升沿有效,即上升沿时
将数据送到数码管的引脚上。如何发送数据即通过 SPI,先将数据写入 SPITXBUF,即发送缓存器中,然
后发送缓存器会将数据传送过去。 SPISTS.bit.lNT_FLAG 代表中断标志位,如果数据从 SPIDAT移出后,
这个中断标志位会置 1。此时while语句的功能就是说如果数据没有被发送出去,则一直会进行空操作,
直到数据被发送出去为止。
中断 分析:此时的中断是进行定时器的自增过程,即实现时钟功能。
interrupt void cpu_timerO_isr(void)
CpuTimerO FInterruptCount++;
i f (CpuTimerO - In七匚04口七==:「) ?"当寄打器为MW时$ 即B*
{
Sec++; 秒加』
CpuTimerO .Int6rr-uptCount=n;片寄存器清零
if(Sec—60) C当秒增加到&耐,分加4 秒清零
{
Min++;
— I * if(Min-=BD) "当分加到总醐,水时加葺 分涓零
{
Hor++;
Min=i ;
垃gf==2廿々当小时加到刘时,小时清零
{
Hor-0;
}
Light [ 1 ^LEDCode [Hor^lO ];"数码管第?位显不小时个位 Light [u] =LEDC0de[Hor/lO] j八數码替第迖立品示小位
Liyht[^]=LEDCod-[Min5£ ];:.数碍曽箒h位丘.亦分小堑
Light [3] =LEDCode [Min^lO ];宀報霑管第4位显示并+位
}
Light [7] =LEDCad& [SecXIO] ; &数码管第总位显示秒个位
Light[6]-LEDCode [S&c/lO];"数码管第了位显宗初十位 displayf); &毀四管息示
PieCtrlRegs.FIEACK_all-PIEACK_GROUP1;
、键盘显示
定义编码
ant LEECfcde [. j1={UeCUUU,Uxl-,':iu J^LkAJU JT .^111100,,019500,01^200,(11£0200^0^?600011^100, 乂邨 tn 9 0xeaDn>(]zS3CDJt[h(nEDaj,DKALOa^OrBSaD^DxeEDD, /'Zif it C ei E F
in q-.iii F I-.-1 iii /i ,r ■■ 11 n i .1 l 4 「”:乌 mi“ - 11 , !-■ mr F
Osi qmxi2(KhmiM(][]? 0x7800,010000 ?m: nno
分析:此向量表与第一个程序相同,即作为索引用,编入数码管可显示内容的编码。
main函数
分析:首先初始化程序,然后就不断得执行一个 while循环,就是检测有没有按键被按下,如果被按下就
继续执行显示程序。然后 LEDOUT函数与前几次程序一样,作为点灯模块,作为计数的显示。
Uintl6 kt?/Num - 0x00JO;
InitSysCtrl i): 心dissbg 』沏他” enable EVA. SPI clacks
DINT* 「僚中斷
spi_intial[):
gpio_intiali):
:fR = 0x0000;
IFR = Csaono:
L^dOul (kfci/KIiiiti);
f or (1 = .;i<8; i+1-J
JSpzabtegs.SPITXfcUK = LtDCodeLU];
wiiilefSpia口dgdEPISTS角it MtTT_FIAG I二丄)£}
Sp-cIfeijs.SPIT/IBUF =Spi aReys -SFITXBUF ;
GpxoDataRe^t. ^GPADAT. h i t .GPI0A11-1;
f or (1 =L ;1 < 1J; 14-+ ) { }
while[1)
i E ' Ejoy^can 1()== 一)
<
keyMum++;
KeyFunci:! on 1 (KeyRe^ 1 j ;
display(LEBReg);
LcdOuit (keyNuin):
}
if(Koy^can?(j ==1)
{
kRyNnni++;
EsyFunctionS(KeyE^^w];
display(LEDReg);
Lod3u*t (kefvtTum);
} ^ ^
三、总结编程要点
①可删语句
SpiaRegs.SPIRXBUF = SpiaRegs.SPIRXBUF;
if((GpioDataRegs.GPBDAT.all|0x00FF) != OxFFFF)
{ for(i=0;i<3000;i++);} //依据你需要防抖延时的时间根据,此语句的多少。
A,E, F,B对应端口
A11的通用接口用于连接锁存器
E 口的低三位为74LVC138的控制信号,进行片选
F的第四位专用外设对应于 SPI
B 口的通用10输出对应于红灯
SPI的使用
初始化SPI,确定SPI的上升/下降沿,是否延迟半个周期,主从控制器,是否处于复位状态,数据 的位数等等。
将GPIOF的第四位设为1,即专用外设引脚。
写入数据发送,用 SPITXBUF,读用SPIRXBUF,判断是否已经发送可以检测中断使能标记
防抖延时
防抖延时的作用就是在检测到低电平时加一个空循环进行排除。很多时候,一个动作,不论是人为 还是程序内部,处理都需要时间,所以空循环的应用十分重要。
【问题的提出与解决】
为什么每次按下键盘,输出有延迟一次?
因为一句语句 SPITXBUF=SPITXBUF。由于这句话代表 SPITXBUF中又被写入相同的内容, 所以又被
传输了一次,又因为有锁存,所以输出呈现延迟一次的情况。
为什么要用GpioA 口?
用GpioA 口是因为其11位对应于锁存器,要用到锁存信号,所以要用 GpioA 口。
为什么要用 GpioDataRegs.GPDDAT.bit.GPIOD仁!GpioDataRegs.GPDDAT.bit.GPIOD1 ?
进行一个空循环,本身没有什么意义。
【实验心得】
本次实验微机原理实验,我们组准备比较充分,因此也比较早的完成。然而我们在结束后对每句代
码进行注释和解读。这个过程让我们收获很多,不仅要学会模仿程序,我们更应该要学会读懂程序,然后
DSP的运行有了很深的了
DSP的运行有了很深的了
解,对其机理有了自己的看法和认识。因此,这次实验,我们掌握了更多,也收获了更多。内容详见我上 文的总结和思考。