DSP技术及课程设计实验报告三 下载本文

#define SCANCODE_Num 0x77

四.实验步骤

1.打开例程“Lab402-Ledarray”工程,编译运行,观察交通灯流水亮灭。 实验程序:

#define LCDDELAY 1

#define LCDCMDTURNON 0x3f #define LCDCMDTURNOFF 0x3e #define LCDCMDSTARTLINE 0xc0 #define LCDCMDPAGE 0xb8

#define LCDCMDVERADDRESS 0x40 #define CTRGR *(int *)0x208000

#define CTRLCDCMDR *(int *)0x208001 #define CTRKEY *(int *)0x208001 #define CTRLCDCR *(int *)0x208002 #define CTRCLKEY *(int *)0x208002 #define CTRLCDLCR *(int *)0x208003 #define CTRLCDRCR *(int *)0x208004 #define CTRLA *(int *)0x208005 void main(void) {

int nCount,nCursorCount;

unsigned int nScanCode,nKeyCode; unsigned char cKey,cOldKey; unsigned int nSpeed;

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的计数单字符。 实验程序:

unsigned char ledkey[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 (;;) {