• 领导讲话
  • 自我介绍
  • 党会党课
  • 文秘知识
  • 转正申请
  • 问题清单
  • 动员大会
  • 年终总结
  • 工作总结
  • 思想汇报
  • 实践报告
  • 工作汇报
  • 心得体会
  • 研讨交流
  • 述职报告
  • 工作方案
  • 政府报告
  • 调研报告
  • 自查报告
  • 实验报告
  • 计划规划
  • 申报材料
  • 当前位置: 勤学考试网 > 公文文档 > 动员大会 > 正文

    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的运行有了很深的了

    解,对其机理有了自己的看法和认识。因此,这次实验,我们掌握了更多,也收获了更多。内容详见我上 文的总结和思考。

    • 考试时间
    • 范文大全
    • 作文大全
    • 课程
    • 试题
    • 招聘
    • 文档大全

    推荐访问