找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4938|回復(fù): 0
收起左側(cè)

基于DSP的鍵盤接口設(shè)計(jì)報(bào)告 含仿真與源碼

[復(fù)制鏈接]
ID:348166 發(fā)表于 2018-7-21 21:59 | 顯示全部樓層 |閱讀模式
電子與通信工程學(xué)院
專業(yè)課程設(shè)計(jì)報(bào)告
2017 ~ 2018 學(xué)年第2學(xué)期
基于DSP的鍵盤接口設(shè)計(jì)
專       業(yè):    電子與通信工程         
班       級(jí):      通信151

課程設(shè)計(jì)報(bào)告


【課題名稱】基于DSP的鍵盤接口設(shè)計(jì)

【摘    要】隨著21世紀(jì)的到來(lái),電子信息行業(yè)將是人類社會(huì)的高科技行業(yè)之一,式設(shè)施現(xiàn)代化的基礎(chǔ),也是人類通往科技巔峰的直通路。電子行業(yè)的發(fā)展從長(zhǎng)遠(yuǎn)來(lái)看很重要,但最主要的還是科技問(wèn)題。行列式鍵盤提高效率進(jìn)行按鍵操作管理有效方法,它可以提高系統(tǒng)準(zhǔn)確性,有利于資源的節(jié)約,降低對(duì)操作者本身素質(zhì)的要求。是它能準(zhǔn)時(shí)、實(shí)時(shí)、高效地顯示按鍵信息,以提高工作效率和資源利用率。行列式鍵盤乃是當(dāng)今使用最為廣泛的鍵盤模式之一,該系統(tǒng)以8個(gè)端口連接控制4*4個(gè)按鍵,即時(shí)在LCD數(shù)碼管上。單片機(jī)控制的據(jù)這是鍵盤顯示系統(tǒng),該系統(tǒng)可以對(duì)不同的按鍵進(jìn)行實(shí)時(shí)顯示,其核心是插上2407主控板的DSP實(shí)驗(yàn)箱和鍵盤矩陣電路部分,主要對(duì)按鍵與顯示電路的關(guān)系、矩陣式技術(shù)及設(shè)備系統(tǒng)的硬件、軟件等各個(gè)部分進(jìn)行實(shí)現(xiàn)。4*4矩陣式鍵盤采用插上2407主控板的DSP實(shí)驗(yàn)箱為核心,主要由矩陣式鍵盤電路、譯碼電路、顯示電路等組成,軟件選用匯編語(yǔ)言編程。單片機(jī)將檢測(cè)到的按鍵信號(hào)轉(zhuǎn)換成數(shù)字量,顯示于LCD顯示器上。該系統(tǒng)靈活性強(qiáng),易于操作,可靠性高,將會(huì)有更廣闊的開(kāi)發(fā)前景。


一、引言
便攜式嵌入設(shè)備包括各種手持設(shè)備及各種信息家電,在這類產(chǎn)品中既要有實(shí)時(shí)的信號(hào)處 理能力,又需要有強(qiáng)大的操作控制功能,因此基于DSP芯片的設(shè)計(jì)方案成為這些產(chǎn)品的主流。 目前在便攜音頻處理中,TI公司的TMS320VC54x系列應(yīng)用最為廣泛[1],但是54x系列芯片屬 于運(yùn)算高密度型DSP器件,因此其外設(shè)控制能力不強(qiáng),外部接口很少,給各種擴(kuò)展帶來(lái)不便, 本文介紹一種新的基于TMS320VC5416的鍵盤顯示擴(kuò)展設(shè)計(jì)方案,利用串行控制的 HD7279A鍵盤顯示擴(kuò)展芯片,僅占用DSP的2個(gè)IO口和1個(gè)中斷,能實(shí)現(xiàn)64鍵鍵盤和64路LED 的控制。

二、總體方案設(shè)計(jì)
1、通過(guò)4 * 4的行列式鍵盤,TMS320F2407的8個(gè)I / O口與之相連,用掃描法來(lái)進(jìn)行按鍵識(shí)別。使行線一直處于高電平,在某一時(shí)刻只讓一條列線處于低電平,而其余列線處于高電平。那么按下鍵的那列電平就會(huì)拉成低電平,判斷出哪列為低電平就可以判斷出按鍵號(hào)碼。
2、要求正確掌握CCS2000的安裝和調(diào)試方法,以及DSP實(shí)驗(yàn)箱下載調(diào)試的步驟; 2.要求正確掌握鍵盤信號(hào)的輸入和DSP I/O的使用; 3.要求鍵盤信號(hào)之間的時(shí)序能正確識(shí)別和引入。
3、根據(jù)行列式鍵盤的特點(diǎn),進(jìn)行鍵盤控制系統(tǒng)的整體研究與設(shè)計(jì);
4、熟練掌握CCS2000軟件的使用,并能夠按要求對(duì)設(shè)計(jì)的電路進(jìn)行仿真,實(shí)現(xiàn)相應(yīng)的功能;
5、.LCD液晶顯示屏實(shí)時(shí)顯示按鍵的信息;
6、采用軟件編程的方法實(shí)現(xiàn)按鍵信息的提取和顯示。

三、設(shè)計(jì)原理分析
1、設(shè)計(jì)原理
實(shí)驗(yàn)箱上提供一個(gè)4x4的行列式鍵盤。2407的8個(gè)I/O口與之相連,這里按鍵的識(shí)別方法是掃描法。鍵被按下時(shí),與此鍵相連的行線電平將由與此鍵相連的列線電平?jīng)Q定,而行線的電平在無(wú)按鍵按下時(shí)處于高電平狀態(tài)。如果讓所有的列線也處于高電平,那么鍵按下與否不會(huì)引起行線電平的狀態(tài)變化,始終為高電平。所以,讓所有的列線處于高電平是無(wú)法識(shí)別出按鍵的,F(xiàn)在反過(guò)來(lái),讓所有的列線處于低電平,很明顯,按鍵所在的行電平將被拉成低電平。根據(jù)此行電平的變化,便能判斷此行一定有按鍵被按下,但還不能確定是哪個(gè)鍵被按下。假如是5鍵按下,為了進(jìn)一步判定是哪一列的鍵被按下,可在某一時(shí)刻只讓一條列線處于低電平,而其余列線處于高電平。那么,按下鍵的那列電平就會(huì)拉成低電平,判斷出哪列為低電平就可以判斷出按鍵號(hào)碼。、
2、實(shí)現(xiàn)設(shè)備

2.1、一臺(tái)裝有CCS2000軟件的計(jì)算機(jī);

CCS2000具有以下特性:TI編譯器的完全集成的環(huán)境:CCS2000目標(biāo)管理系統(tǒng),內(nèi)建編輯器,所有的調(diào)試和分析能力集成在一個(gè)Windows環(huán)境中。對(duì)c和DSP匯編文件的目標(biāo)管理:目標(biāo)編輯器保持對(duì)所有文件及相關(guān)內(nèi)容的跟蹤。它只對(duì)最近一次編譯中改變過(guò)的文件重新編譯,以節(jié)省編譯時(shí)間。高集成的編輯器調(diào)整C和DSP匯編代碼:CCS2000的內(nèi)建編輯器支持C和匯編文件的動(dòng)態(tài)語(yǔ)法加亮顯示。使用戶能很容易地閱讀代碼和當(dāng)場(chǎng)發(fā)現(xiàn)語(yǔ)法錯(cuò)誤,對(duì)編輯和調(diào)試時(shí)的后臺(tái)編輯:用戶在使用編譯器和匯編器時(shí)沒(méi)有必要退出系統(tǒng)到DOS環(huán)境中,因?yàn)镃CS2000會(huì)自動(dòng)將這些工具裝載在它的環(huán)境中。在其窗口中,錯(cuò)誤會(huì)加亮顯示只要雙擊錯(cuò)誤就可以直接到達(dá)出錯(cuò)處。PDM允許將命令傳播給所有的或選擇的處理器。在任何算法點(diǎn)觀察信號(hào)的圖形窗口探針,圖形顯示窗口使用戶能夠觀察時(shí)域或頻域內(nèi)的信號(hào)。

2.2、 插上2407主控板的DSP實(shí)驗(yàn)箱;(仿真器模塊,顯示控制模塊,DSP評(píng)估板模塊,行列式鍵盤模塊)

ICETEK-LF2407-A板是一塊很獨(dú)立的目標(biāo)板,它非常適合檢驗(yàn)LF2407DSP的性能,此外,本目標(biāo)板提供了LF240x系列芯片進(jìn)行擴(kuò)展和運(yùn)行軟件的標(biāo)準(zhǔn)平臺(tái)。 ICETEK-LF2407-A板使用了TMS320LF2407DSP芯片,兼容所有LF2407的使用代碼,它具有2.5K字節(jié)的片上數(shù)據(jù)存儲(chǔ)器,128K板上存儲(chǔ)器,片上UART,DAC7625模數(shù)轉(zhuǎn)換器。此EVM板還提供了DSP的擴(kuò)展引腳,方便了用戶外搭所需電路。許多用戶接口可利用簡(jiǎn)單的代碼進(jìn)行擴(kuò)展,從而縮短了調(diào)試時(shí)間。 ICETEK-LF2407-A 板功能:它主要的接口包括目標(biāo)存儲(chǔ)器接口、模擬接口、CAN總線接口、并口、用戶指示燈和開(kāi)關(guān)、外部擴(kuò)展接口。

LF2407提供了128K的靜態(tài)存儲(chǔ)器,外部I/O口支持相應(yīng)的64k I/O端口,片上的CAN總線和RS232端口可用做擴(kuò)展連接。


五、總結(jié)和體會(huì)

通過(guò)本次CCS2000環(huán)境下矩陣鍵盤掃描LCD顯示的仿真實(shí)驗(yàn),讓我了解并熟悉了CCS2000軟件的安裝和調(diào)試方法,DSP實(shí)驗(yàn)箱下載調(diào)試的步驟以及CCS環(huán)境下的DSP的匯編語(yǔ)言程序編寫(xiě)方法,對(duì)于液晶顯示模塊控制程序的編寫(xiě)和矩陣鍵盤的信號(hào)識(shí)別原理也有了更深的認(rèn)識(shí),對(duì)今后DSP的進(jìn)一步學(xué)習(xí)奠定了應(yīng)用基礎(chǔ)。運(yùn)行程序后,在按下鍵盤上的按鍵時(shí),會(huì)顯示相對(duì)應(yīng)的鍵號(hào)(鍵號(hào)為:0-9、A-D、#、* 共十六的鍵號(hào)),其顯示是通過(guò)液晶顯示器顯示出來(lái)。了解了4*4矩陣鍵盤的設(shè)定及其IO口的配置方式,進(jìn)一步掌握用匯編語(yǔ)言編寫(xiě)DSP程序的方法,及編譯、除錯(cuò)能力。


程序:

  1. #include "tms320uc5402.h"
  2. ioport short port8002;       //寫(xiě)lcd指令地址
  3. ioport short port8003;       //寫(xiě)lcd數(shù)據(jù)地址
  4. unsigned int p;
  5. char send_buff=0x00;
  6. char rece_buff=0x00;
  7. unsigned int data_buff=0x0000;
  8. void sys_ini()                   //系統(tǒng)初始化子程序
  9. {
  10.     /*全局禁止所有可屏蔽中斷*/
  11.      asm(" ssbx INTM");
  12.     /*(DRAM映射到程序空間和數(shù)據(jù)空間)向量表映射到0x0080空間*/         
  13.      PMST&=0x00FF;
  14.     /*io空間7個(gè)等待周期,程序與數(shù)據(jù)空間0個(gè)等待周期*/            
  15.      SWWSR=0x7000;
  16.     /*設(shè)置pll為div模式*/      
  17.     CLKMD=0x0000;              
  18.     /*等待設(shè)置完成*/
  19.      while(CLKMD==0x0001);      
  20.     {
  21.      }
  22.     /*CLKOUT=(3+1)*CLKIN=40M,自動(dòng)延時(shí)最長(zhǎng)時(shí)間*/
  23.      CLKMD=0x37FA;  
  24.     /*CLKOUT=(1+1)*CLKIN=20M,自動(dòng)延時(shí)最長(zhǎng)時(shí)間*/            
  25.      //CLKMD=0x17FA;                           
  26. }
  27. void delay_ms()            //延時(shí)40ms
  28. {
  29.   unsigned int k;
  30.   for(k=0;k<60000;k++);
  31. }

  32. void delay_us()           //延時(shí)100us
  33. {
  34.   unsigned int k;
  35.   for(k=0;k<200;k++);
  36. }
  37. void  delay(int number)
  38. {
  39. unsigned  int i,k;
  40. for(i=0;i<50;i++);
  41. for(k=0;k<number;k++);
  42. }
  43. void McBSP1_ini()               //初始化多通道緩存串口1為通用IO
  44. {
  45.     /*復(fù)位多通道串口0的接收*/
  46.      SPSA2=SPCR1;
  47.      SPSD2=0x0000;
  48.     /*復(fù)位多通道串口0的發(fā)送*/
  49.      SPSA2=SPCR2;
  50.      SPSD2=0x0000;
  51. /*定義CLKXM腳為io輸出腳初始值0,BFSX腳為io輸出腳初始值1,CLKRM腳為io輸出腳初始值1*/
  52.      SPSA2=PCR;
  53.      SPSD2=0x3B09;
  54. }  
  55. void lcd_show(char a[])
  56. {
  57.   int x;
  58.   char * string=a;  for(x=0;x<strlen(a);x++)
  59.   {
  60.      port8003=* string;
  61.      string++;
  62.      delay_us();
  63.   }
  64. }
  65. void lcd_ini()
  66. {
  67.   delay_ms();                //延時(shí)40ms
  68.   port8002=0x0030;           //8位控制界面,基本指令集
  69.   delay_us();
  70.   port8002=0x0030;           //8位控制界面,基本指令集
  71.   delay_us();
  72.   port8002=0x000C;           //整體顯示,顯示游標(biāo) ,顯示游標(biāo)位置
  73.   delay_us();
  74.   port8002=0x0001;           //清除顯示
  75.   delay_ms();
  76.   port8002=0x0006;           //光標(biāo)右移
  77.   delay_us();
  78. }
  79. void int3_ini()                 //中斷3初始化子程序
  80. {
  81.     /*使能外部中斷3*/
  82.      IMR=0x0100;               
  83.     /*清除所有中斷標(biāo)志位*/
  84.      IFR=0xFFFF;     
  85.     /*全局使能可屏蔽中斷*/
  86.      asm(" rsbx INTM");        
  87. }
  88. void delay_8us()                //延時(shí)8us子程序
  89. {
  90.      unsigned int i;
  91.      for(i=0;i<30;i++);
  92. }
  93. void delay_50us()               //延時(shí)50us子程序
  94. {
  95.      unsigned int j;
  96.      for(j=0;j<170;j++);
  97. }
  98. void delay_25ms()               //延時(shí)25ms子程序
  99. {
  100.      unsigned int k;
  101.      for(k=0;k<50000;k++);
  102.      for(k=0;k<45000;k++);
  103. }
  104. void delay_long()               //長(zhǎng)延時(shí)子程序
  105. {
  106. unsigned int n,s;
  107. for(n=0;n<6000;n++)
  108.    for(s=0;s<600;s++);     
  109. }
  110. void cs_high()                   //7279cs置高子程序
  111. {
  112.      SPSA2=PCR;
  113.      SPSD2|=0x0001;
  114. }
  115. void cs_low()                    //7279cs置高子程序
  116. {
  117.      SPSA2=PCR;
  118.      SPSD2&=0xFFFE;
  119. }
  120. void send()
  121. {        
  122. unsigned int m;
  123.     cs_low();
  124.     delay_50us();              
  125.     for(m=0;m<8;m++)
  126.     {
  127.           SPSA2=PCR;
  128.           switch(send_buff&0x80)
  129.           {
  130.                 /*7279data置低*/
  131.                 case 0x00:SPSD2&=0xFFF7;break;
  132.                   /*7279data置高*/
  133.                   case 0x80:SPSD2|=0x0008;
  134.            }
  135.          /*7279clk置高*/
  136.          SPSA2=PCR;
  137.          SPSD2|=0x0002;
  138.          delay_8us();
  139.          /*7279clk置低*/
  140.          SPSA2=PCR;
  141.          SPSD2&=0xFFFD;
  142.          delay_8us();
  143.          send_buff<<=1;
  144.     }
  145. }
  146. void receive()
  147. {
  148.          unsigned int s;
  149.        /*將BFSX腳配置為io輸入腳*/
  150.          SPSA2=PCR;
  151.          SPSD2&=0xF7FF;
  152.         /*7279發(fā)數(shù)據(jù)*/
  153.          asm(" rsbx xf");
  154.          delay_50us();
  155.          for(s=0;s<8;s++)
  156.          {
  157.            /*7279clk置高*/
  158.             SPSA2=PCR;
  159.             SPSD2|=0x0002;
  160.             delay_8us();
  161.             SPSA2=PCR;
  162.             data_buff=data_buff|((SPSD2&0x0008)<<(12-s));//讀BFSX引腳數(shù)據(jù);
  163.            /*7279clk置低*/
  164.             SPSA2=PCR;
  165.            SPSD2&=0xFFFD;
  166.             delay_8us();
  167.          }   
  168.          rece_buff=data_buff>>8;
  169.         /*清除data_buff*/
  170.          data_buff=0x0000;           
  171.         /*將BFSX腳配置為io輸出腳*/
  172.          SPSA2=PCR;
  173.          SPSD2|=0x0800;
  174.         /*7279收數(shù)據(jù)*/
  175.          asm(" ssbx xf");
  176. }
  177. interrupt void int3()
  178. {   
  179. char b[]="a    ";
  180. /*讀鍵值指令*/
  181.       send_buff=0x15;   
  182.       send();
  183.       receive();
  184.       /*數(shù)據(jù)左移指令*/
  185.       send_buff=0xA1;   
  186.       send();
  187.      send_buff=0xC8;
  188.      send();
  189.     /*將接收到的鍵值送顯示*/
  190.      send_buff=rece_buff;
  191.     //send();
  192.       if (rece_buff>=10)
  193.    {
  194.        b[0]=rece_buff+30+30+30-42+7;}
  195.       // return;
  196.    else
  197.      b[0]=rece_buff+30+30+30-42;//-43-7;
  198.      //b[1]=' ';
  199.      lcd_show(b);
  200.      delay(10000);
  201.      delay(10000);
  202.     // delay(10000);
  203. //              delay(10000);
  204.     // delay(10000);
  205.     // delay(10000);
  206.     port8002=0x0001;           //清除顯示   
  207.     delay(6000);
  208.     lcd_show(b);
  209.     return;
  210. void main(void)
  211. {
  212.       sys_ini();   
  213.       McBSP1_ini();
  214.       int3_ini();         
  215.       lcd_ini();        
  216.       delay_25ms();
  217.       /*測(cè)燈指令*/
  218.        // send_buff=0x00;   
  219.        //send();
  220.        //delay_long();
  221.        // delay_long();
  222.        /*清除指令*/
  223.        send_buff=0xA4;   
  224.        send();
  225.        /*送出數(shù)據(jù)0x00~0x0F*/
  226.        //for(p=0;p<3;p++)
  227.        //{
  228.            // send_buff=0xC8;   
  229.            // send();
  230.            // send_buff=p;
  231.             //send();
  232.             // delay_long();
  233.             /*數(shù)據(jù)左移指令*/
  234.             // send_buff=0xA1;
  235.              //send();   
  236.          // }
  237.         /*清除指令*/
  238.         send_buff=0xA4;   
  239.         send();
  240.         cs_high();
  241.         for(;;);
  242.      }
  243. }
復(fù)制代碼



  1. /*  
  2. ;* 文件名稱 : keyboard.c        
  3. ;* 適用平臺(tái) : EXPIII+實(shí)驗(yàn)系統(tǒng)
  4. ;* CPU類型  : DSP TMS320VC54X
  5. ;* 軟件環(huán)境 : CCS3.1 (5000系列)
  6. ;* 試驗(yàn)接線 : 1、實(shí)驗(yàn)箱的撥碼開(kāi)關(guān)SW2.4置OFF(54x的譯碼有效);54x CPU板的跳線J2的1、2短接
  7. ;*              (HPI 8位模式);SW1的2、6置ON,其余置OFF(HPI使能;DSP工作微處理器方式;
  8. ;*               CPU_CS=0);SW2全部置ON(FLASH工作在數(shù)據(jù)空間,LED燈D5的工作狀態(tài)處于滅狀態(tài));
  9. ;*            2、SW2的sw2=OFF,sw1=OFF;對(duì)應(yīng)2X的pdpintb和5X的int3中斷分配給鍵盤中斷使用;
  10. ;*               語(yǔ)音小板的撥碼開(kāi)關(guān)全部置OFF;
  11. ;* 試驗(yàn)現(xiàn)象 : LED全部點(diǎn)亮后,LED13和LED14顯示出0123456789等字符,并逐漸左移,直到"F"出現(xiàn)后,
  12. ;*            LED 全部變暗。此時(shí)按鍵,便可從LED13和LED14上顯示出123456789等按鍵對(duì)應(yīng)的鍵值,
  13. ;*            每個(gè)鍵對(duì)應(yīng)一個(gè)數(shù),當(dāng)按下一鍵時(shí)LED就會(huì)顯示出相對(duì)應(yīng)的數(shù),且向左移動(dòng)一位。
  14. ;*************************************************************/
  15. /************************文件預(yù)處理***************************/
  16. #include "tms320uc5402.h"
  17. /*************************************************************/
  18. ioport short port8002;       //寫(xiě)lcd指令地址
  19. ioport short port8003;       //寫(xiě)lcd數(shù)據(jù)地址

  20. /********************全局變量定義與初始化*********************/
  21. unsigned int p;
  22. char send_buff=0x00;
  23. char rece_buff=0x00;
  24. unsigned int data_buff=0x0000;
  25. /*************************************************************/

  26. /*******************函數(shù)、子程序聲明與定義********************/
  27. void sys_ini()                   //系統(tǒng)初始化子程序
  28. {
  29.     /*全局禁止所有可屏蔽中斷*/
  30.      asm(" ssbx INTM");
  31.     /*(DRAM映射到程序空間和數(shù)據(jù)空間)向量表映射到0x0080空間*/           
  32.      PMST&=0x00FF;  
  33.     /*io空間7個(gè)等待周期,程序與數(shù)據(jù)空間0個(gè)等待周期*/            
  34.      SWWSR=0x7000;
  35.     /*設(shè)置pll為div模式*/        
  36.      CLKMD=0x0000;               
  37.     /*等待設(shè)置完成*/
  38.      while(CLKMD==0x0001);      
  39.      {
  40.      }
  41.     /*CLKOUT=(3+1)*CLKIN=40M,自動(dòng)延時(shí)最長(zhǎng)時(shí)間*/
  42.      CLKMD=0x37FA;   
  43.     /*CLKOUT=(1+1)*CLKIN=20M,自動(dòng)延時(shí)最長(zhǎng)時(shí)間*/            
  44.      //CLKMD=0x17FA;                           
  45. }
  46. void delay_ms()            //延時(shí)40ms
  47. {
  48.   unsigned int k;
  49.   for(k=0;k<60000;k++);
  50. }

  51. void delay_us()           //延時(shí)100us
  52. {
  53.   unsigned int k;
  54.   for(k=0;k<200;k++);
  55. }

  56. void  delay(int number)
  57. {

  58. unsigned  int i,k;
  59. for(i=0;i<50;i++);

  60.   for(k=0;k<number;k++);
  61.   }
  62. void McBSP1_ini()               //初始化多通道緩存串口1為通用IO
  63. {
  64.     /*復(fù)位多通道串口0的接收*/
  65.      SPSA2=SPCR1;
  66.      SPSD2=0x0000;
  67.     /*復(fù)位多通道串口0的發(fā)送*/
  68.      SPSA2=SPCR2;
  69.      SPSD2=0x0000;
  70.     /*定義CLKXM腳為io輸出腳初始值0,BFSX腳為io輸出腳
  71.       初始值1,CLKRM腳為io輸出腳初始值1*/
  72.      SPSA2=PCR;
  73.      SPSD2=0x3B09;
  74. }  

  75. void lcd_show(char a[])
  76. {
  77.   int x;
  78.   char * string=a;
  79.   for(x=0;x<strlen(a);x++)
  80.   {
  81.     port8003=* string;
  82.     string++;
  83.     delay_us();
  84.   }
  85. }
  86.    

  87. void lcd_ini()
  88. {
  89.   delay_ms();                //延時(shí)40ms
  90.   port8002=0x0030;           //8位控制界面,基本指令集
  91.   delay_us();
  92.   port8002=0x0030;           //8位控制界面,基本指令集
  93.   delay_us();
  94.   port8002=0x000C;           //整體顯示,顯示游標(biāo) ,顯示游標(biāo)位置
  95.   delay_us();
  96.   port8002=0x0001;           //清除顯示
  97.   delay_ms();
  98.   port8002=0x0006;           //光標(biāo)右移
  99.   delay_us();
  100. }  
  101. void int3_ini()                 //中斷3初始化子程序
  102. {
  103.     /*使能外部中斷3*/
  104.      IMR=0x0100;               
  105.     /*清除所有中斷標(biāo)志位*/
  106.      IFR=0xFFFF;      
  107.     /*全局使能可屏蔽中斷*/
  108.      asm(" rsbx INTM");         
  109. }

  110. void delay_8us()                //延時(shí)8us子程序
  111. {
  112.      unsigned int i;
  113.      for(i=0;i<30;i++);
  114. }

  115. void delay_50us()               //延時(shí)50us子程序
  116. {
  117.      unsigned int j;
  118.      for(j=0;j<170;j++);
  119. }

  120. void delay_25ms()               //延時(shí)25ms子程序
  121. {
  122.      unsigned int k;
  123.      for(k=0;k<50000;k++);
  124.      for(k=0;k<45000;k++);
  125. }

  126. void delay_long()               //長(zhǎng)延時(shí)子程序
  127. {
  128.      unsigned int n,s;
  129.      for(n=0;n<6000;n++)
  130.      {
  131.        for(s=0;s<600;s++)
  132.        {
  133.        }
  134.      }     
  135. }

  136. void cs_high()                   //7279cs置高子程序
  137. {
  138.      SPSA2=PCR;  
  139.      SPSD2|=0x0001;  
  140. }

  141. void cs_low()                    //7279cs置高子程序
  142. {
  143.      SPSA2=PCR;  
  144.      SPSD2&=0xFFFE;
  145. }

  146. void send()
  147. {         
  148.           unsigned int m;
  149.           cs_low();
  150.           delay_50us();               
  151.           for(m=0;m<8;m++)
  152.           {
  153.                SPSA2=PCR;
  154.                switch(send_buff&0x80)
  155.                {
  156.                   /*7279data置低*/
  157.                    case 0x00:SPSD2&=0xFFF7;break;
  158.                   /*7279data置高*/
  159.                    case 0x80:SPSD2|=0x0008;
  160.                }
  161.               /*7279clk置高*/
  162.                SPSA2=PCR;
  163.                SPSD2|=0x0002;
  164.                delay_8us();
  165.               /*7279clk置低*/
  166.                SPSA2=PCR;
  167.                SPSD2&=0xFFFD;
  168.                delay_8us();
  169.                send_buff<<=1;
  170.            }

  171. }

  172. void receive()
  173. {
  174.          unsigned int s;
  175.         /*將BFSX腳配置為io輸入腳*/
  176.          SPSA2=PCR;
  177.          SPSD2&=0xF7FF;
  178.         /*7279發(fā)數(shù)據(jù)*/
  179.          asm(" rsbx xf");
  180.          delay_50us();
  181.          for(s=0;s<8;s++)
  182.          {
  183.            /*7279clk置高*/
  184.             SPSA2=PCR;
  185.             SPSD2|=0x0002;
  186.             delay_8us();
  187.             SPSA2=PCR;
  188.             data_buff=data_buff|((SPSD2&0x0008)<<(12-s));//讀BFSX引腳數(shù)據(jù);  
  189.            /*7279clk置低*/
  190.             SPSA2=PCR;
  191.             SPSD2&=0xFFFD;
  192.             delay_8us();
  193.          }   
  194.          rece_buff=data_buff>>8;
  195.         /*清除data_buff*/
  196.          data_buff=0x0000;            
  197.         /*將BFSX腳配置為io輸出腳*/
  198.          SPSA2=PCR;
  199.          SPSD2|=0x0800;  
  200.         /*7279收數(shù)據(jù)*/
  201.          asm(" ssbx xf");
  202. }   
  203. /*************************************************************/

  204. /*****************中斷服務(wù)子程序聲明與定義********************/
  205. interrupt void int3()
  206. {   char b[]="a    ";
  207. /*讀鍵值指令*/
  208.      send_buff=0x15;     
  209.     send();
  210.      receive();
  211.     /*數(shù)據(jù)左移指令*/
  212.      send_buff=0xA1;     
  213.     send();
  214.      send_buff=0xC8;
  215.     send();
  216.     /*將接收到的鍵值送顯示*/
  217.      send_buff=rece_buff;
  218.     //send();
  219.      
  220.     if (rece_buff>=10)
  221.    {
  222.        b[0]=rece_buff+30+30+30-42+7;}
  223.     // return;
  224.    else
  225.    b[0]=rece_buff+30+30+30-42;//-43-7;
  226.     //b[1]=' ';
  227.     lcd_show(b);
  228.     delay(10000);
  229.     delay(10000);
  230.    // delay(10000);
  231. //        delay(10000);
  232.    // delay(10000);
  233.   // delay(10000);
  234.   port8002=0x0001;           //清除顯示   
  235.   delay(6000);
  236.   lcd_show(b);
  237.      return;
  238. }
  239. /*************************************************************/

  240. /**************************主程序*****************************/
  241. void main(void)
  242. {
  243.          sys_ini();   
  244.          McBSP1_ini();
  245.           int3_ini();         
  246.           lcd_ini();         
  247.           delay_25ms();
  248.          /*測(cè)燈指令*/
  249.         // send_buff=0x00;   
  250.          //send();
  251.           //delay_long();
  252.          // delay_long();
  253.          /*清除指令*/
  254.          send_buff=0xA4;   
  255.           send();  
  256.          /*送出數(shù)據(jù)0x00~0x0F*/
  257.           //for(p=0;p<3;p++)  
  258.           //{
  259.            // send_buff=0xC8;   
  260.            // send();
  261.            // send_buff=p;
  262.             //send();
  263.             // delay_long();
  264.             /*數(shù)據(jù)左移指令*/
  265.             // send_buff=0xA1;
  266.              //send();   
  267.          // }
  268.          /*清除指令*/
  269.          send_buff=0xA4;   
  270.          send();
  271.           cs_high();
  272.           for(;;);
  273.       /*    char b[]="玉林師范學(xué)院";
  274.   sys_ini();
  275. ……………………

  276. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼



0.png 0.png


全部資料51hei下載地址:
DSP課程設(shè)計(jì)201508402146.zip (125.09 KB, 下載次數(shù): 35)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表