作者的话
ADI的双核DSP,最早的一颗是Blackfin系列的BF561,这颗DSP我用了很久,比较熟悉,且写过一些给新手的教程。
硬件准备
ADZS-BF561-EZKIT开发板:ADI原厂评估板
AD-ICE20000仿真器:ADI现阶段性能最好的DSP仿真器
产品链接:https://item.taobao.com/item.htm?id=753233120844
软件准备
Visual DSP++5.1.2
CCES2.11.1
硬件环境的搭建
程序实现功能
学习键盘扫描原理,学习 ADSP-BF561 处理器利用 CPLD 的 I/O 资源,扩展键盘的设计方法及程序设计。
实现原理
利用 ADSP-BF561 处理器 EBIU 读取 CPLD 内部的键盘控制器键值寄存器,并将相应的键值信息打印出来。
BF561 通过 EBIU 接口和 CPLD 连接,利用 CPLD 在内部设计出键盘控制器,进行键值的行列扫描,将键值返回给键值寄存器,BF561 通过读取键值寄存器获得键盘的键值,根据键值作相应的处理。
图 是矩阵键盘的硬件连接图,PA3~PA0 为行线输入端,PA7~PA4 为列线输出端, PA0-PA7 全部接上拉电阻。PA7~PA4 向所有的列线分别且循环输出低电平即 0111,1011,1101,1110;读取各行线 PA3~PA0 的状态,若行线状态全为高电平,则表明无键按下,若行线状态中有低电平,则表明有键按下。即:PA7~PA4 四条列扫描线在每次输出低电平期间,同时读取各行线 PA3~PA0 的状态,确定键值。例如:PA7~PA4 输出"1011",此时若
读取 PA3~PA0 的状态为"1110",则表明按键 S2 被按下。
将键盘 8 条扫描线与 BF561 地址空间的 0x2C3E0000 相连接,对应如下表(逻辑 1 表示高电平,逻辑 0 表示低电平)。
在程序中不断向该地址循环写入 0xfe,0xfd,0xfb,0xf7,经短暂延时后,在读取该地址的值。最后根据得到的值,判断被按下的键。
核心代码分析
void scanfkb(void)
{
int keypressflag ;
unsigned char oldkbdat,kbdat;
int i;
uint8_t row=0x1;
for(i = 0;i < 4;i++){
*pCtrIn_Kb = ~row; //列线循环输出 1110,1101,1011,0111
mdelay(50);
oldkbdat = *pCtrIn_Kb; //读取扫描数据
row = row << 1; //准备输出下一个列线值
if((oldkbdat&0xf0)!=0xf0){ //判断行线输入是否有低电平
kbdat = *pCtrIn_Kb;
keypressflag = 1;
if(oldkbdat == kbdat){
do{
kbdat = *pCtrIn_Kb;
}while ((kbdat&0xf0)!=0xf0); //等待按键被释放
keydecode(keypressflag,oldkbdat);
keypressflag = 0;
}
}
}
row = 0x01;
}
程序运行结果
按 4*4 键盘的任一键可打印该键值。