[资料分享] DSP的键盘接口设计源码

Aguilera   2018-11-10 20:25 楼主
通过本次CCS2000环境下矩阵键盘扫描LCD显示的仿真实验,让我了解并熟悉了CCS2000软件的安装和调试方法,DSP实验箱下载调试的步骤以及CCS环境下的DSP的汇编语言程序编写方法,对于液晶显示模块控制程序的编写和矩阵键盘的信号识别原理也有了更深的认识,对今后DSP的进一步学习奠定了应用基础。运行程序后,在按下键盘上的按键时,会显示相对应的键号(键号为:0-9、A-D、#、* 共十六的键号),其显示是通过液晶显示器显示出来。了解了4*4矩阵键盘的设定及其IO口的配置方式,进一步掌握用汇编语言编写DSP程序的方法,及编译、除错能力。






主程序:
#include "tms320uc5402.h"
ioport short port8002;       //写lcd指令地址
ioport short port8003;       //写lcd数据地址
unsigned int p;
char send_buff=0x00;
char rece_buff=0x00;
unsigned int data_buff=0x0000;
void sys_ini()                   //系统初始化子程序
{
    /*全局禁止所有可屏蔽中断*/
     asm(" ssbx INTM");
    /*(DRAM映射到程序空间和数据空间)向量表映射到0x0080空间*/         
     PMST&=0x00FF;
    /*io空间7个等待周期,程序与数据空间0个等待周期*/            
     SWWSR=0x7000;
    /*设置pll为div模式*/      
    CLKMD=0x0000;              
    /*等待设置完成*/
     while(CLKMD==0x0001);      
    {
     }
    /*CLKOUT=(3+1)*CLKIN=40M,自动延时最长时间*/
     CLKMD=0x37FA;  
    /*CLKOUT=(1+1)*CLKIN=20M,自动延时最长时间*/            
     //CLKMD=0x17FA;                           
}
void delay_ms()            //延时40ms
{
  unsigned int k;
  for(k=0;k<60000;k++);
}


void delay_us()           //延时100us
{
  unsigned int k;
  for(k=0;k<200;k++);
}
void  delay(int number)
{
unsigned  int i,k;
for(i=0;i<50;i++);
for(k=0;k
}
void McBSP1_ini()               //初始化多通道缓存串口1为通用IO
{
    /*复位多通道串口0的接收*/
     SPSA2=SPCR1;
     SPSD2=0x0000;
    /*复位多通道串口0的发送*/
     SPSA2=SPCR2;
     SPSD2=0x0000;
/*定义CLKXM脚为io输出脚初始值0,BFSX脚为io输出脚初始值1,CLKRM脚为io输出脚初始值1*/
     SPSA2=PCR;
     SPSD2=0x3B09;
}  
void lcd_show(char a[])
{
  int x;
  char * string=a;  for(x=0;x
  {
     port8003=* string;
     string++;
     delay_us();
  }
}
void lcd_ini()
{
  delay_ms();                //延时40ms
  port8002=0x0030;           //8位控制界面,基本指令集
  delay_us();
  port8002=0x0030;           //8位控制界面,基本指令集
  delay_us();
  port8002=0x000C;           //整体显示,显示游标 ,显示游标位置
  delay_us();
  port8002=0x0001;           //清除显示
  delay_ms();
  port8002=0x0006;           //光标右移
  delay_us();
}
void int3_ini()                 //中断3初始化子程序
{
    /*使能外部中断3*/
     IMR=0x0100;               
    /*清除所有中断标志位*/
     IFR=0xFFFF;     
    /*全局使能可屏蔽中断*/
     asm(" rsbx INTM");        
}
void delay_8us()                //延时8us子程序
{
     unsigned int i;
     for(i=0;i<30;i++);
}
void delay_50us()               //延时50us子程序
{
     unsigned int j;
     for(j=0;j<170;j++);
}
void delay_25ms()               //延时25ms子程序
{
     unsigned int k;
     for(k=0;k<50000;k++);
     for(k=0;k<45000;k++);
}
void delay_long()               //长延时子程序
{
unsigned int n,s;
for(n=0;n<6000;n++)
   for(s=0;s<600;s++);     
}
void cs_high()                   //7279cs置高子程序
{
     SPSA2=PCR;
     SPSD2|=0x0001;
}
void cs_low()                    //7279cs置高子程序
{
     SPSA2=PCR;
     SPSD2&=0xFFFE;
}
void send()
{        
unsigned int m;
    cs_low();
    delay_50us();              
    for(m=0;m<8;m++)
    {
          SPSA2=PCR;
          switch(send_buff&0x80)
          {
                /*7279data置低*/
                case 0x00:SPSD2&=0xFFF7;break;
                  /*7279data置高*/
                  case 0x80:SPSD2|=0x0008;
           }
         /*7279clk置高*/
         SPSA2=PCR;
         SPSD2|=0x0002;
         delay_8us();
         /*7279clk置低*/
         SPSA2=PCR;
         SPSD2&=0xFFFD;
         delay_8us();
         send_buff<<=1;
    }
}
void receive()
{
         unsigned int s;
       /*将BFSX脚配置为io输入脚*/
         SPSA2=PCR;
         SPSD2&=0xF7FF;
        /*7279发数据*/
         asm(" rsbx xf");
         delay_50us();
         for(s=0;s<8;s++)
         {
           /*7279clk置高*/
            SPSA2=PCR;
            SPSD2|=0x0002;
            delay_8us();
            SPSA2=PCR;
            data_buff=data_buff|((SPSD2&0x0008)<<(12-s));//读BFSX引脚数据;
           /*7279clk置低*/
            SPSA2=PCR;
           SPSD2&=0xFFFD;
            delay_8us();
         }   
         rece_buff=data_buff>>8;
        /*清除data_buff*/
         data_buff=0x0000;           
        /*将BFSX脚配置为io输出脚*/
         SPSA2=PCR;
         SPSD2|=0x0800;
        /*7279收数据*/
         asm(" ssbx xf");
}
interrupt void int3()
{   
char b[]="a    ";
/*读键值指令*/
      send_buff=0x15;   
      send();
      receive();
      /*数据左移指令*/
      send_buff=0xA1;   
      send();
     send_buff=0xC8;
     send();
    /*将接收到的键值送显示*/
     send_buff=rece_buff;
    //send();
      if (rece_buff>=10)
   {
       b[0]=rece_buff+30+30+30-42+7;}
      // return;
   else
     b[0]=rece_buff+30+30+30-42;//-43-7;
     //b[1]=' ';
     lcd_show(b);
     delay(10000);
     delay(10000);
    // delay(10000);
//              delay(10000);
    // delay(10000);
    // delay(10000);
    port8002=0x0001;           //清除显示   
    delay(6000);
    lcd_show(b);
    return;
void main(void)
{
      sys_ini();   
      McBSP1_ini();
      int3_ini();         
      lcd_ini();        
      delay_25ms();
      /*测灯指令*/
       // send_buff=0x00;   
       //send();
       //delay_long();
       // delay_long();
       /*清除指令*/
       send_buff=0xA4;   
       send();
       /*送出数据0x00~0x0F*/
       //for(p=0;p<3;p++)
       //{
           // send_buff=0xC8;   
           // send();
           // send_buff=p;
            //send();
            // delay_long();
            /*数据左移指令*/
            // send_buff=0xA1;
             //send();   
         // }
        /*清除指令*/
        send_buff=0xA4;   
        send();
        cs_high();
        for(;;);
     }
}
复制代码






/*  
;* 文件名称 : keyboard.c        
;* 适用平台 : EXPIII+实验系统
;* CPU类型  : DSP TMS320VC54X
;* 软件环境 : CCS3.1 (5000系列)
;* 试验接线 : 1、实验箱的拨码开关SW2.4置OFF(54x的译码有效);54x CPU板的跳线J2的1、2短接
;*              (HPI 8位模式);SW1的2、6置ON,其余置OFF(HPI使能;DSP工作微处理器方式;
;*               CPU_CS=0);SW2全部置ON(FLASH工作在数据空间,LED灯D5的工作状态处于灭状态);
;*            2、SW2的sw2=OFF,sw1=OFF;对应2X的pdpintb和5X的int3中断分配给键盘中断使用;
;*               语音小板的拨码开关全部置OFF;
;* 试验现象 : LED全部点亮后,LED13和LED14显示出0123456789等字符,并逐渐左移,直到"F"出现后,
;*            LED 全部变暗。此时按键,便可从LED13和LED14上显示出123456789等按键对应的键值,
;*            每个键对应一个数,当按下一键时LED就会显示出相对应的数,且向左移动一位。
;*************************************************************/
/************************文件预处理***************************/
#include "tms320uc5402.h"
/*************************************************************/
ioport short port8002;       //写lcd指令地址
ioport short port8003;       //写lcd数据地址


/********************全局变量定义与初始化*********************/
unsigned int p;
char send_buff=0x00;
char rece_buff=0x00;
unsigned int data_buff=0x0000;
/*************************************************************/


/*******************函数、子程序声明与定义********************/
void sys_ini()                   //系统初始化子程序
{
    /*全局禁止所有可屏蔽中断*/
     asm(" ssbx INTM");
    /*(DRAM映射到程序空间和数据空间)向量表映射到0x0080空间*/           
     PMST&=0x00FF;  
    /*io空间7个等待周期,程序与数据空间0个等待周期*/            
     SWWSR=0x7000;
    /*设置pll为div模式*/        
     CLKMD=0x0000;               
    /*等待设置完成*/
     while(CLKMD==0x0001);      
     {
     }
    /*CLKOUT=(3+1)*CLKIN=40M,自动延时最长时间*/
     CLKMD=0x37FA;   
    /*CLKOUT=(1+1)*CLKIN=20M,自动延时最长时间*/            
     //CLKMD=0x17FA;                           
}
void delay_ms()            //延时40ms
{
  unsigned int k;
  for(k=0;k<60000;k++);
}


void delay_us()           //延时100us
{
  unsigned int k;
  for(k=0;k<200;k++);
}


void  delay(int number)
{


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


  for(k=0;k
  }
void McBSP1_ini()               //初始化多通道缓存串口1为通用IO
{
    /*复位多通道串口0的接收*/
     SPSA2=SPCR1;
     SPSD2=0x0000;
    /*复位多通道串口0的发送*/
     SPSA2=SPCR2;
     SPSD2=0x0000;
    /*定义CLKXM脚为io输出脚初始值0,BFSX脚为io输出脚
      初始值1,CLKRM脚为io输出脚初始值1*/
     SPSA2=PCR;
     SPSD2=0x3B09;
}  


void lcd_show(char a[])
{
  int x;
  char * string=a;
  for(x=0;x
  {
    port8003=* string;
    string++;
    delay_us();
  }
}
   


void lcd_ini()
{
  delay_ms();                //延时40ms
  port8002=0x0030;           //8位控制界面,基本指令集
  delay_us();
  port8002=0x0030;           //8位控制界面,基本指令集
  delay_us();
  port8002=0x000C;           //整体显示,显示游标 ,显示游标位置
  delay_us();
  port8002=0x0001;           //清除显示
  delay_ms();
  port8002=0x0006;           //光标右移
  delay_us();
}  
void int3_ini()                 //中断3初始化子程序
{
    /*使能外部中断3*/
     IMR=0x0100;               
    /*清除所有中断标志位*/
     IFR=0xFFFF;      
    /*全局使能可屏蔽中断*/
     asm(" rsbx INTM");         
}


void delay_8us()                //延时8us子程序
{
     unsigned int i;
     for(i=0;i<30;i++);
}


void delay_50us()               //延时50us子程序
{
     unsigned int j;
     for(j=0;j<170;j++);
}


void delay_25ms()               //延时25ms子程序
{
     unsigned int k;
     for(k=0;k<50000;k++);
     for(k=0;k<45000;k++);
}


void delay_long()               //长延时子程序
{
     unsigned int n,s;
     for(n=0;n<6000;n++)
     {
       for(s=0;s<600;s++)
       {
       }
     }     
}


void cs_high()                   //7279cs置高子程序
{
     SPSA2=PCR;  
     SPSD2|=0x0001;  
}


void cs_low()                    //7279cs置高子程序
{
     SPSA2=PCR;  
     SPSD2&=0xFFFE;
}


void send()
{         
          unsigned int m;
          cs_low();
          delay_50us();               
          for(m=0;m<8;m++)
          {
               SPSA2=PCR;
               switch(send_buff&0x80)
               {
                  /*7279data置低*/
                   case 0x00:SPSD2&=0xFFF7;break;
                  /*7279data置高*/
                   case 0x80:SPSD2|=0x0008;
               }
              /*7279clk置高*/
               SPSA2=PCR;
               SPSD2|=0x0002;
               delay_8us();
              /*7279clk置低*/
               SPSA2=PCR;
               SPSD2&=0xFFFD;
               delay_8us();
               send_buff<<=1;
           }


}


void receive()
{
         unsigned int s;
        /*将BFSX脚配置为io输入脚*/
         SPSA2=PCR;
         SPSD2&=0xF7FF;
        /*7279发数据*/
         asm(" rsbx xf");
         delay_50us();
         for(s=0;s<8;s++)
         {
           /*7279clk置高*/
            SPSA2=PCR;
            SPSD2|=0x0002;
            delay_8us();
            SPSA2=PCR;
            data_buff=data_buff|((SPSD2&0x0008)<<(12-s));//读BFSX引脚数据;  
           /*7279clk置低*/
            SPSA2=PCR;
            SPSD2&=0xFFFD;
            delay_8us();
         }   
         rece_buff=data_buff>>8;
        /*清除data_buff*/
         data_buff=0x0000;            
        /*将BFSX脚配置为io输出脚*/
         SPSA2=PCR;
         SPSD2|=0x0800;  
        /*7279收数据*/
         asm(" ssbx xf");
}   
/*************************************************************/


/*****************中断服务子程序声明与定义********************/
interrupt void int3()
{   char b[]="a    ";
/*读键值指令*/
     send_buff=0x15;     
    send();
     receive();
    /*数据左移指令*/
     send_buff=0xA1;     
    send();
     send_buff=0xC8;
    send();
    /*将接收到的键值送显示*/
     send_buff=rece_buff;
    //send();
     
    if (rece_buff>=10)
   {
       b[0]=rece_buff+30+30+30-42+7;}
    // return;
   else
   b[0]=rece_buff+30+30+30-42;//-43-7;
    //b[1]=' ';
    lcd_show(b);
    delay(10000);
    delay(10000);
   // delay(10000);
//        delay(10000);
   // delay(10000);
  // delay(10000);
  port8002=0x0001;           //清除显示   
  delay(6000);
  lcd_show(b);
     return;
}
/*************************************************************/


/**************************主程序*****************************/
void main(void)
{
         sys_ini();   
         McBSP1_ini();
          int3_ini();         
          lcd_ini();         
          delay_25ms();
         /*测灯指令*/
        // send_buff=0x00;   
         //send();
          //delay_long();
         // delay_long();
         /*清除指令*/
         send_buff=0xA4;   
          send();  
         /*送出数据0x00~0x0F*/
          //for(p=0;p<3;p++)  
          //{
           // send_buff=0xC8;   
           // send();
           // send_buff=p;
            //send();
            // delay_long();
            /*数据左移指令*/
            // send_buff=0xA1;
             //send();   
         // }
         /*清除指令*/
         send_buff=0xA4;   
         send();
          cs_high();
          for(;;);
      /*    char b[]="玉林师范学院";
  sys_ini();

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复