⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keyboard_led.c

📁 达盛的DSPVC5402和键盘连接
💻 C
字号:
/*************************************************************
 *Copyright (c) 2005,北京精仪达盛科技有限公司研发部
 *All rights reserved
 *
 *文件名称:keyboard_led.c
 *文件标示:
 *说    明:本文件内容为使用tms320uc5402 dsp时测试7279键盘LED
 *          接口的测试程序,将多通道缓存串口1引脚作为通用IO脚用
 *          
 *当前版本:1.0
 *作    者:王飞
 *完成日期:2005年2月21日
 *
 *取代版本:
 *原作者  :
 *完成日期:
 *备    注:详细见文档HD7279A.PDF,TI文档SPRU302、SPRU131F
 *************************************************************/

/************************文件预处理***************************/
#include "tms320uc5402.h"
/*************************************************************/

/********************全局变量定义与初始化*********************/
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 McBSP1_ini()               //初始化多通道缓存串口1为通用IO
{
    /*复位多通道串口0的接收*/
     SPSA1=SPCR1;
     SPSD1=0x0000; 
    /*复位多通道串口0的发送*/
     SPSA1=SPCR2;
     SPSD1=0x0000;
    /*定义CLKXM脚为io输出脚初始值0,BFSX脚为io输出脚
      初始值1,CLKRM脚为io输出脚初始值1*/
     SPSA1=PCR;
     SPSD1=0x3B09;
}     
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置高子程序
{
     SPSA1=PCR;  
     SPSD1|=0x0001;  
}

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

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

}

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

/*****************中断服务子程序声明与定义********************/
interrupt void int3()
{   /*读键值指令*/
     send_buff=0x15;     
     send();
     receive();
    /*数据左移指令*/
     send_buff=0xA1;     
     send();
     send_buff=0xC8;
     send();
    /*将接收到的键值送显示*/
     send_buff=rece_buff;
     send();
     return;
}
/*************************************************************/

/**************************主程序*****************************/
void main(void)
{ 
          sys_ini();    
          McBSP1_ini();
          int3_ini();          
                    
          delay_25ms();
         /*测灯指令*/
          send_buff=0xBF;    
          send();
          delay_long();
          delay_long();
         /*清除指令*/
          send_buff=0xA4;    
          send();  
         /*送出数据0x00~0x0F*/
          for(p=0;p<16;p++)  
          {
             send_buff=0xC8;    
             send();
             send_buff=p;
             send();
             delay_long();
            /*数据左移指令*/
             send_buff=0xA1; 
             send();    
          }
         /*清除指令*/
          send_buff=0xA4;    
          send(); 
          cs_high();
          for(;;)
          {
          } 
}
/***************************结束******************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -