📄 keyboard_led.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 + -