DSP技术及课程设计实验报告三.docx
《DSP技术及课程设计实验报告三.docx》由会员分享,可在线阅读,更多相关《DSP技术及课程设计实验报告三.docx(15页珍藏版)》请在冰豆网上搜索。
DSP技术及课程设计实验报告三
东南大学自动化学院
实验报告
课程名称:
DSP原理及C程序开发
第三次实验
实验名称:
液晶屏、键盘外设控制实验
院(系):
自动化专业:
自动化
姓名:
学号:
实验室:
实验组别:
同组人员:
实验时间:
2012年4月25日
评定成绩:
审阅教师:
实验3:
基于DSP系统的实验
——液晶屏、键盘外设控制实验
一.实验目的
通过实验学习使用28335ADSP的扩展端口控制外围设备的方法,了解
(1)发光二极管的控制编程方法、
(2)液晶显示器编程方法、(3)键盘外设控制编程方法。
二.实验设备
计算机,ICETEK-F28335-EDU实验箱(或ICETEK仿真器+ICETEK–F28335-A系统板+相关连线及电源)。
三.实验原理
1.发光二极管显示阵列(交通灯)控制
TMS320F28335DSP的扩展存储器接口(EMIF)用来与大多数外围设备进行连接,典型应用如连接片外扩展存储器等。
这一接口提供地址连线、数据连线和一组控制线。
ICETEK-F28335-A将这些扩展线引到了板上的扩展插座上供扩展使用。
实验箱中ICETEK-CTR板上的发光二极管显示阵列(交通灯)的显示是由扩展端口控制,扩展在EMIF接口的两个寄存器提供具体控制。
交通灯一共12个,使其顺序亮灭的例程如下所示:
unsignedintuLedmy[12]={0x1,0x2,0x04,0x48,0x50,0x60,0x8,0x10,0x20,0x41,0x42,0x44};
voidmain(void)
{
intnCount;
InitSysCtrl();
InitXintf16Gpio();
CTRGR=0x80;//初始化ICETEK-CTR
CTRGR=0x0;
CTRGR=0x80;
CTRLR=0;//关闭东西方向的交通灯
CTRLR=0x40;//关闭南北方向的交通灯
nCount=0;
for(;;)
{
*(int*)0x208007=uLedmy[nCount];//设置指示灯状态
nCount++;nCount%=12;
Delay(512);
}
}
2.液晶显示器控制显示
液晶显示模块的访问、控制是由28335ADSP对扩展接口的操作完成。
控制口的寻址:
命令控制接口的地址为0x208001,数据控制接口的地址为0x208003和0x208004,辅助控制接口的地址为0x208002。
液晶显示模块中有两片显示缓冲存储器,分别对应屏幕显示的象素,向其中写入数值将改变显示,写入“1”则显示一点,写入“0”则不显示。
液晶屏是64*64点阵的,一个基本字符占用8*8点阵。
其地址与象素的对应方式如下:
列
左侧显示内存
右侧显示内存
0
1
…
63
0
1
…
63
行
0
DB0
DB0
DB0
DB0
DB0
DB0
1
DB1
DB1
DB1
DB1
DB1
DB1
…
…
…
…
…
…
…
7
DB7
DB7
DB7
DB7
DB7
DB7
8
DB0
DB0
DB0
DB0
DB0
DB0
9
DB1
DB1
DB1
DB1
DB1
DB1
…
…
…
…
…
…
…
15
DB7
DB7
DB7
DB7
DB7
DB7
…
…
63
发送控制命令:
向液晶显示模块发送控制命令的方法是通过向命令控制接口写入命令控制字,然后再向辅助控制接口写入0。
下面给出的是基本命令字、解释和C语言控制语句举例:
●显示开关:
0x3f打开显示;0x3e关闭显示;
●设置显示起始行:
0x0c0+起始行取值,其中起始行取值为0至63;
●设置操作页:
0x0b8+页号,其中页号取值为0-7;
●设置操作列:
0x40+列号,其中列号为取值为0-63;
写显示数据:
在使用命令控制字选择操作位置(页数、列数)之后,可以将待显示的数据写入液晶显示模块的缓存。
将数据发送到相应数据控制I/O接口即可。
3.键盘输入
键盘的扫描码由DSP的扩展地址0x208001给出,当有键盘输入时,读此端口得到扫描码,当无键被按下时读此端口的结果为0。
各按键的扫描码排列如下所示(scancode.h)。
#defineSCANCODE_00x70
#defineSCANCODE_10x69
#defineSCANCODE_20x72
#defineSCANCODE_30x7A
#defineSCANCODE_40x6B
#defineSCANCODE_50x73
#defineSCANCODE_60x74
#defineSCANCODE_70x6C
#defineSCANCODE_80x75
#defineSCANCODE_90x7D
#defineSCANCODE_Del0x49
#defineSCANCODE_Enter0x5A
#defineSCANCODE_Plus0x79
#defineSCANCODE_Minus0x7B
#defineSCANCODE_Mult0x7C
defineSCANCODE_Divid0x4A
#defineSCANCODE_Num0x77
四.实验步骤
1.打开例程“Lab402-Ledarray”工程,编译运行,观察交通灯流水亮灭。
实验程序:
#defineLCDDELAY1
#defineLCDCMDTURNON0x3f
#defineLCDCMDTURNOFF0x3e
#defineLCDCMDSTARTLINE0xc0
#defineLCDCMDPAGE0xb8
#defineLCDCMDVERADDRESS0x40
#defineCTRGR*(int*)0x208000
#defineCTRLCDCMDR*(int*)0x208001
#defineCTRKEY*(int*)0x208001
#defineCTRLCDCR*(int*)0x208002
#defineCTRCLKEY*(int*)0x208002
#defineCTRLCDLCR*(int*)0x208003
#defineCTRLCDRCR*(int*)0x208004
#defineCTRLA*(int*)0x208005
voidmain(void)
{
intnCount,nCursorCount;
unsignedintnScanCode,nKeyCode;
unsignedcharcKey,cOldKey;
unsignedintnSpeed;
InitSysCtrl();
InitXintf16Gpio();
CTRGR=0x80;//初始化ICETEK-CTR
CTRGR=0x0;
CTRGR=0x80;
CTRLR=0;//关闭东西方向的交通灯
CTRLR=0x40;//关闭南北方向的交通灯
CTRLR=0xc1;
uPort8000=CTRLCDCR;//清键盘缓冲区
RefreshLEDArray();
nCount=nCursorCount=0;
/**************************************************************************************
Task1:
编写一段循环程序,用交通灯实现流水点亮,可利用本程序中的Delay()函数
**************************************************************************************/
for(;;)
{
CTRLR=uLedmy[nCount];//设置指示灯状态
nCount++;
nCount%=12;
Delay(1024);
}
}
2.打开例程“Lab405-lcd”工程,编译运行,可以观察到液晶屏左侧顶部第一个8*8单元显示从0到9的计数单字符。
实验程序:
unsignedcharledkey[10][8]=
{
{0x00,0x00,0x7C,0x82,0x82,0x82,0x7C,0x00},//0
{0x00,0x00,0x00,0x84,0xFE,0x80,0x00,0x00},//1
{0x00,0x00,0x84,0xC2,0xA2,0x92,0x8C,0x00},//2
{0x00,0x00,0x44,0x92,0x92,0x92,0x6C,0x00},
{0x00,0x00,0x30,0x28,0x24,0xFE,0x20,0x00},
{0x00,0x00,0x4E,0x92,0x92,0x92,0x62,0x00},
{0x00,0x00,0x7C,0x92,0x92,0x92,0x64,0x00},
{0x00,0x00,0x02,0xC2,0x32,0x0A,0x06,0x00},
{0x00,0x00,0x6C,0x92,0x92,0x92,0x6C,0x00},
{0x00,0x00,0x4C,0x92,0x92,0x92,0x7C,0x00}
};
for(;;)
{
for(j=0;j<10;j++)
{
CTRLCDCMDR=LCDCMDPAGE;//设置操作页=0
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
CTRLCDCMDR=LCDCMDVERADDRESS;//起始列=0
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
for(i=0;i<8;i++)
{/***********************************************************************
Task:
推算ledkey数组值的含义;
给屏幕左侧第1至8行第i列赋值。
另外,可利用变量nBW来控制背景/前景色取反;即:
CTRLCDLCR=
**********************************************************************/
CTRLCDLCR=ledkey[j][i];
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
}
Delay(4096);//延时子程序
nCount++;
if(nCount==10)
{
nCount=0;
nBW=1-nBW;
}
}
}
3.打开例程“Lab404-key”工程,编译运行,可以观察到发光二极管阵列显示键盘输入字符。
实验程序:
/**************************************************************************************
Task2:
完善如下一段循环程序,查询小键盘,用按键点亮对应的交通灯,例如按下“1”点亮左交通灯的红灯
提示:
用cOldKey和cKey变量分别保存上次键值和本次键值
**************************************************************************************/
for(;;)
{
nScanCode=CTRLCDCMDR;
nScanCode&=0x0ff;
uPort8000=CTRLCDCR;
if(nScanCode!
=0)
{
cOldKey=cKey;
cKey=nScanCode;
if(cOldKey!
=cKey)
{
CTRLR=0x40;//关闭南北方向的交通灯
CTRLR=0;;
CTRLR=uLedmy[cKey];
}
}
Delay(25);
}
五.问题与思考
1.修改例程“Lab405-lcd”工程,使得液晶屏右侧顶部第一个8*8单元显示从0到9的计数单字符。
实验程序:
for(;;)
{
for(j=0;j<10;j++)
{
CTRLCDCMDR=LCDCMDPAGE;//设置操作页=0
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
CTRLCDCMDR=LCDCMDVERADDRESS;//起始列=0
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
for(i=0;i<8;i++)
{/***********************************************************************
Task:
推算ledkey数组值的含义;
给屏幕右侧第1至8行第i列赋值。
另外,可利用变量nBW来控制背景/前景色取反;即:
CTRLCDRCR=
**********************************************************************/
CTRLCDRCR=ledkey[j][i];
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
}
Delay(4096);//延时子程序
nCount++;
if(nCount==10)
{
nCount=0;
nBW=1-nBW;
}
}
}
2.结合例程“Lab405-lcd”与“Lab404-key”,更改程序中对液晶屏页、列的设置,实现不同位置的显示,显示键盘按键结果1-9数字。
实验程序:
for(;;)
{
CTRLCDCMDR=0xb9;//设置操作页=1
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
CTRLCDCMDR=0x50;//起始列=16
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
nScanCode=CTRLCDCMDR;
nScanCode&=0x0ff;
uPort8000=CTRLCDCR;
if(nScanCode!
=0)
{
cOldKey=cKey;
cKey=nScanCode;
if(cOldKey!
=cKey)
{
LCDCLS();
for(i=0;i<8;i++)
{
CTRLCDRCR=ledkey[nScanCode][i];
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
}
Delay(4096);//延时子程序
}
}
Delay(25);
nCount++;
if(nCount==10)
{
nCount=0;
nBW=1-nBW;
}
}
六、实验总结
1.给控制寄存器CTRLCDCMDR写不同的数值功能不同:
例如:
显示开关:
0x3f打开显示;0x3e关闭显示;
CTRLCDCMDR=0x3f;CTRLCDCR=0;//将液晶显示打开
CTRLCDCMDR=0x3e;CTRLCDCR=0;//将液晶显示关闭
设置显示起始行:
0x0c0+起始行取值,其中起始行取值为0至63;
CTRLCDCMDR=0x0c0;CTRLCDCR=0;//设置从存储器第0行开始显示
CTRLCDCMDR=0x0c8;CTRLCDCR=0;//设置从存储器第8行开始显示
设置操作页:
0x0b8+页号,其中页号取值为0-7;
CTRLCDCMDR=0x0b8;CTRLCDCR=0;//设置即将操作的存储器第0页
CTRLCDCMDR=0x0b9;CTRLCDCR=0;//设置即将操作的存储器第1页
设置操作列:
0x40+列号,其中列号为取值为0-63;
CTRLCDCMDR=0x40;CTRLCDCR=0;//设置即将操作的存储器第0列
CTRLCDCMDR=0x44;CTRLCDCR=0;//设置即将操作的存储器第4列。
2.读某些寄存器和写某些寄存器功能不同:
例如读命令寄存器CTRLCDCMDR(nScanCode=CTRLCDCMDA)功能为把键盘扫描码读取,写CTRLCDCMDR(CTRLCDCMDR=0x3f)功能为发送控制命令;读辅助寄存器CTRLCDCR(uPort8000=CTRLCDCR)功能为清空键盘缓存区,写CTRLCDCR(CTRLCDCR=0)功能为发送控制命令。
3.左右两块液晶屏共用命令寄存器,使用不同的数据寄存器:
给CTRLCDRCR赋值右侧屏幕显示,给CTRLCDLCR赋值左侧屏幕显示。
4.液晶屏每次显示之前要清屏,否则之前显示的数字不会被清除,下个数字会显示在相邻的位置上;同样在查询小键盘用按键点亮对应的交通灯时每次也必须先关闭所有灯再点亮,否则上次状态不会被及时清除。
5.总之,这门课的关键就是学会各种寄存器的使用,了解各种外设的原理并学会使用。