总体报告

  • 格式:doc
  • 大小:247.50 KB
  • 文档页数:24

D S P短学期课程设计报告课程名称:DSP芯片应用系统设计设计题目:基于2812的电动控制系统设计专业:电气工程及自动化班级:自动化081设计者:阿力青.阿布都克力木学号:084773901指导教师:设计时间:2011.7.18宁波大学信息科学与工程学院一、设计目的DSP芯片的主要应用有:信号处理、通信、语音、图形/图像、军事、仪器仪表、自动控制、医疗、家用电器等。

目前,国外众多厂商涉足我国DSP产品市场,我国的DSP应用已有了相当的基础。

从应用范围来说,数字信号处理器市场前景看好通过本次课程设计,进一步掌握DSP 的工作原理;了解并掌握直流电机的工作原理及其控制方法;利用DSP与键盘、LED 、扩展I/O端口外围设备的配合,实现相应的功能;熟练掌握利用汇编语言和C语言编写DSP程序,掌握使用通用定时器的控制原理及中断服务程序的编程方法;在Emulator方式下调试程序,培养调试和查错的能力。

最终掌握在DSP软硬件环境下的程序开发流程,达到学以致用的目的。

二、设计任务•利用小键盘控制直流电机的停转、转速和转向,并在液晶上实时显示电机当前运行状态以及设计者信息。

(1)主程序的编写建议采用C语言;(2)系统启动后,液晶屏显示欢迎界面;(3)通过矩阵式键盘控制电机的转速,具体要求如下:•按‘0’键,启动电机(需设默认状态,如慢速正转);•按‘1’键,电机正转(不改变当前转速);•按‘2’键,电机反转(不改变当前转速);•按‘3’键,调整电机转速为快档(不改变当前转向);•按‘4’键,调整电机转速为慢档(不改变当前转向);•按‘9’键,电机停止转动;(4)在液晶片上正确显示当前电机的转向和转速;(5)完成设定动作后,蜂鸣器给出提示音•三、系统构成及流程图在电机控制领域, TI公司推出了2000系列电机控制嵌入式DSP。

其中的TMS320F2812属于高端产品,适合于工业控制、机床控制等高精度应用。

目前涉及到2000序列的芯片在电气传动中的应用的文献以侧重介绍TMS320LF240x为主,介绍应用TMS320F(C)28x的比较少。

TMS320F(C)28x比24x系列的DSP具有更完备的外围控制接口和更丰富的电机控制外设电路,其指令执行时间或完成一次动作的时间仅为6.67纳秒,流水线采样最高速率60ns,交直转换通道12位AD达16个,PWM输出通道达12个[1]。

片上资源可以足够同时控制两台三相电机,使控制系统的价格大大降低而体积缩小、可靠性提高,可以在高度集成环境中实现高性能的电机控制。

本文将着重阐述作者基于TMS320F2812设计的DSP控制器的设计中点1. 主程序的编写建议采用C语言;2.系统启动后,液晶屏显示欢迎界面;3.通过矩阵式键盘控制电机的转速,具体要求如下:按‘0’键,电机工作在慢速反转状态按‘1’键电机工作在慢速正转状态。

液晶显示器的流程图四、子模块工作原理1,TMS320F2812数字信号处理器(简称F2812)是TI公司最新推出的32位定点DSP,是控制领域最先进的处理器之一。

芯片内核为32位C28x CPU,具有高达150MHz的工作频率和8级指令流水线。

表1是传统控制用DSP TMS320LF2407A(简称F2407)和F2812的主要性能比较[1]:表1表明: F2812关键技术指标与F2407相比有质的飞跃,两者之间性能相差一代。

F2812更适合于高精度,高复杂度性和需要大批量数据处理的实时控制领域。

DSP 的EV 模块中的QEP 电路可以用于连接一个光电编码器获得旋转电机的位置和速率信息,QEP 电路的方向检测逻辑确定哪个脉冲序列相位超前,然后产生一个方向信号作为通用定时器2 的方向输入,如果CAP1 / QEP1 引脚的脉冲输入是相位超前的序列,那么定时器就进行递增计数;相反,如果CAP2 / QEP2 引脚的输入脉冲序列是相位超前的,那么定时器就进行减计数。

正交编码脉冲电路对编码输入脉冲的上升沿和下降沿进行计数。

因此,由QEP 电路产生的通用定时器的时钟输入是每个输入脉冲序列频率的四倍。

这个正交时钟作为通用定时器的输入时钟。

正交编码脉冲、提供的时钟以及计数方向之间的关系如图5 所示。

图5 正交编码脉冲、译码定时器时钟及方向信号本方案采用霍尔电流传感器法。

选用电流霍尔传感器型号为CSM025A,测量电流为0~25A,输出0~25mA,匝数比是1: 1000。

因为F2812 上的ADC 要求输入0~3V,所以采样、调理、限幅电路须将霍尔传感器输出的电流信号调整成0~3V 的电压信号,这样方能直接送入F2812 的ADC 若设定电机的最大启动电流为±Imax,当检测电流为I=+Imax时,对应的调理模块送出电压应为3V。

当检测电流为I=-Imax时,对应的调理模块送出电压应为0V。

2,直流励磁的磁路在电工设备中的应用,除了直流电磁铁(直流继电器、直流接触器等)外,最重要的就是应用在直流旋转电机中。

在发电厂里,同步发电机的励磁机、蓄电池的充电机等,都是直流发电机;锅炉给粉机的原动机是直流电动机。

此外,在许多工业部门,例如大型轧钢设备、大型精密机床、矿井卷扬机、市内电车、电缆设备要求严格线速度一致的地方等,通常都采用直流电动机作为原动机来拖动工作机械的。

直流发电机通常是作为直流电源,向负载输出电能;直流电动机则是作为原动机带动各种生产机械工作,向负载输出机械能。

在控制系统中,直流电机还有其它的用途,例如测速电机、伺服电机等。

虽然直流发电机和直流电动机的用途各不同,但是它们的结构基本上一样,都是利用电和磁的相互作用来实现机械能与电能的相互转换。

3,文字图像在液晶上点阵显示的数据是按照一定的规则编码后通过液晶显示的驱动模块在液晶上显示的。

点阵液晶上的像素只能显示黑与白,所以要显示的图像必须先转化为黑白的,否则显示效果会相差很多。

编码的步骤如下:Step 1:像素化要对文字图像取模,也就是把文字图像像素化。

比如一个“口”字,我们要在液晶上显示的大小为16×16像素,则应该对其按16×16的模像素化,如图5-2。

把文字“口”放在16×16的模板上,黑色的点形成文字,所以黑色的点就是我们要显示点。

Step 2:分页液晶屏是以8行为一页的,所以16×16的点阵必须分两页才能完整显示出来。

实验箱上的液晶是按每8行分为一页的,所以我们把前8行作为第一页,后8行作为第二页。

对于行数大于16行的,只须按照每8行分一页即可。

由于液晶的大小是128×64,所以图像的行数最多为64行,列数最多为128列。

Step 3 编码液晶的图像编码按照取字节方向有横向格式和纵向格式。

横向格式是指LCD显示数据是以横向的连续8个像素为一个字节的数据格式,例如东芝公司的T6963C或爱普森公司的SED1330和SED1331等LCD控制芯片的显示数据均为横向格式。

纵向格式是指LCD显示数据是以纵向的连续8个像素为一个字节的数据格式,其取模的走向正好符合LCD写入显示数据的顺序。

按照横向格式,第一个字节为横向的8位,纵向格式则为纵向的8位。

如图5-3:实验箱上的液晶是按照纵向取模方式的。

按照取字节的顺序,有顺序方式和倒序方式。

顺序方式是字节的8位按照由上到下的方式取,倒序则按照由下到上的方式。

例如“口”字的第三列,点阵上的8位值为:0011 1111。

按照顺序方式,编码第三个字节的值应该为0x3f,按照倒序方式则为0xfc。

4,液晶显示模块的访问、控制是由DSP 对扩展I/O 接口的操作完成。

控制I/O口的寻址:命令控制I/O 接口的地址为0x8001,数据控制I/O接口的地址为0x8003 和0x8004,辅助控制I/O 接口的地址为0x8002。

液晶显示模块中有两片显示缓冲存储器,分别对应屏幕显示的象素,向其中写入数值将改变显示,写入“1”则显示一点,写入“0”则不显示。

表1 地址与象素对应表发送控制命令:向液晶显示模块发送控制命令的方法是通过向命令控制I/O 接口写入命令控制字,然后再向辅助控制接口写入0。

下面给出的是基本命令字、解释和C 语言控制语句举例。

显示开关:0x3f 打开显示;0x3e 关闭显示;设置显示起始行:0x0c0+起始行取值,其中起始行取值为0 至63;设置操作页:0x0b8+页号,其中页号取值为0-7;设置操作列:0x40+列号,其中列号为取值为0-63;写显示数据:在使用命令控制字选择操作位置(页数、列数)之后可以将待显示的数据写入液晶显示模块的缓存。

将数据发送到相应数据控制I/O接口即可。

五实验内容#include "DSP281x_Device.h" // DSP281x Headerfile Include File#include "DSP281x_Examples.h" // DSP281x Examples Include File// Prototype statements for functions found within this file. interrupt void cpu_timer0_isr(void);void Delay(unsigned int nTime);void Gpio_select(void);void error(int);void program_stop();void Gpio_PortA(void);void Gpio_PortB(void);void Gpio_PortF(void);void Gpio_PortDEG(void);char ConvertScanToChar(unsigned char cScanCode);void RefreshLEDArray(); // 刷新显示void SetLEDArray(int nNumber); // 修改显示内容void display(int zs,int hang,int lie,unsigned char (*a)[32]);void displayshuzi(int sz,int hang,int lie,unsigned char (*b)[8]); void displayr(int zs,int hang,int lie,unsigned char (*c)[32]); void displayshuzir(int sz,int hang,int lie,unsigned char (*d)[8]); #define T46uS 0x0d40#define LCDDELAY 100#define LCDCMDTURNON 0x3f#define LCDCMDTURNOFF 0x3e#define LCDCMDSTARTLINE 0xc0#define LCDCMDPAGE 0xb8#define LCDCMDVERADDRESS 0x40#define SCANCODE_0 0x70#define SCANCODE_1 0x69#define SCANCODE_2 0x72#define SCANCODE_3 0x7A#define SCANCODE_4 0x6B#define SCANCODE_5 0x73#define SCANCODE_6 0x74#define SCANCODE_7 0x6C#define SCANCODE_8 0x75#define SCANCODE_9 0x7D#define SCANCODE_Del 0x49#define SCANCODE_Enter 0x5A#define SCANCODE_Plus 0x79#define SCANCODE_Minus 0x7B#define SCANCODE_Mult 0x7C#define SCANCODE_Divid 0x4A#define SCANCODE_Num 0x77#define CTRGR *(int *)0x108000#define CTRLCDCMDR *(int *)0x108001#define CTRKEY *(int *)0x108001#define CTRLCDCR *(int *)0x108002#define CTRCLKEY *(int *)0x108002#define CTRLCDLCR *(int *)0x108003#define CTRLCDRCR *(int *)0x108004#define CTRLA *(int *)0x108005#define CTRLR *(int *)0x108007void showkey();void cost(unsigned int cKey);void Delay(unsigned int nTime); // 延时子程序void TurnOnLCD(); // 打开显示void LCDCLS(); // 清除屏幕显示内容void show_chinese (unsigned int han,unsigned int lie,unsigned int zhihan);//汉字显示代码void show_chinese1 (unsigned int han,unsigned int lie,unsigned int zhihan);Uint16 var1 = 0;Uint16 var2 = 0;Uint16 var3 = 0;Uint16 test_count = 0;Uint16 Test_flag = 0;Uint16 Test_var = 0;Uint16 Test_status[32];Uint16 PASS_flag = 0;unsigned int uWork,nCount;unsigned int pwm1[8]={ 0x8e,0x8c,0x8d,0x89,0x8b,0x83,0x87,0x86 };unsigned int pwm2[8]={ 0x86,0x87,0x83,0x8b,0x89,0x8d,0x8c,0x8e };int nAddStep,nStep;int jishu=0;unsigned int uWork,nCount=0,nCount2=0,nCount1,nDir,i=0,ckey1,k=0,nCount3=0; int uN,uN1,t;unsigned int uPort8000;unsigned int nScreenBuffer[1024];unsigned char ledbuf[8],ledx[8];unsigned char ledkey[10][8]={{0x00,0x00,0x7C,0x82,0x82,0x82,0x7C,0x00},{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}};unsigned char name[][32]= //:{{0x00, 0xfe, 0x12, 0x2a, 0xc6, 0x00, 0xe2, 0x22, 0x22, 0x22, 0xe2, 0x02, 0xfe, 0x02, 0x02, 0x00,0x00, 0xff, 0x02, 0x04, 0x03, 0x00, 0x03, 0x02, 0x02, 0x02, 0x43, 0x80, 0x7f, 0x00, 0x00, 0x00, },{0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xff, 0x10, 0x10, 0x10, 0x10, 0x10, 0xf0, 0x00, 0x00,0x00, 0x00, 0x80, 0x40, 0x20, 0x18, 0x06, 0x01, 0x00, 0x00, 0x40, 0x80, 0x40, 0x3f, 0x00, 0x00, },{0x40, 0x40, 0x44, 0x54, 0x54, 0x54, 0x54, 0x7f, 0x54, 0x54, 0x54, 0x54, 0x44, 0x40, 0x40, 0x00,0x00, 0x00, 0x00, 0xff, 0x15, 0x15, 0x15, 0x15, 0x15, 0x55, 0x95, 0x7f, 0x00, 0x00, 0x00, 0x00, }};unsigned char qidong[][32]={{0x00, 0x00, 0x00, 0xf8, 0x48, 0x48, 0x48, 0x49, 0x4e, 0x4a, 0x48, 0x48, 0x48, 0x78, 0x00, 0x00,0x40, 0x20, 0x18, 0x07, 0x00, 0x7e, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x7e, 0x00, 0x00 //启4},{0x20, 0x24, 0x24, 0xe4, 0x24, 0x24, 0x24, 0x20, 0x10, 0x10, 0xff, 0x10, 0x10, 0xf0, 0x00, 0x00,0x08, 0x1c, 0x0b, 0x08, 0x0c, 0x05, 0x4e, 0x24, 0x10, 0x0c, 0x03, 0x20, 0x40, 0x3f, 0x00, 0x00 //动5},};unsigned char jiashu[][32]={{0x00, 0x08, 0x08, 0x08, 0xff, 0x08, 0x08, 0xf8, 0x00, 0xf8, 0x08, 0x08, 0x08, 0xf8, 0x00, 0x00,0x40, 0x20, 0x18, 0x07, 0x00, 0x20, 0x40, 0x3f, 0x00, 0x7f, 0x10, 0x10, 0x10, 0x3f, 0x00, 0x00 //加7},{0x40, 0x42, 0xcc, 0x00, 0x04, 0xe4, 0x24, 0x24, 0xff, 0x24, 0x24, 0x24, 0xe4, 0x04, 0x00, 0x00, //速80x40, 0x20, 0x1f, 0x20, 0x48, 0x49, 0x45, 0x43, 0x7f, 0x41, 0x43, 0x45, 0x4d, 0x40, 0x40, 0x00},};unsigned char jianshu[][32]={{0x00, 0x02, 0xec, 0x00, 0xf8, 0x28, 0x28, 0x28, 0x28, 0x28, 0xff, 0x08, 0x8a, 0xec, 0x48, 0x00, //减100x02, 0x5f, 0x20, 0x18, 0x07, 0x00, 0x1f, 0x49, 0x5f, 0x20, 0x13, 0x0c, 0x13, 0x20, 0x78, 0x00},{0x40, 0x42, 0xcc, 0x00, 0x04, 0xe4, 0x24, 0x24, 0xff, 0x24, 0x24, 0x24, 0xe4, 0x04, 0x00, 0x00, //速110x40, 0x20, 0x1f, 0x20, 0x48, 0x49, 0x45, 0x43, 0x7f, 0x41, 0x43, 0x45, 0x4d, 0x40, 0x40, 0x00},};unsigned char zhengxiang[][32]={{0x00, 0x02, 0x02, 0xc2, 0x02, 0x02, 0x02, 0x02, 0xfe, 0x82, 0x82, 0x82, 0x82, 0x82, 0x02, 0x00, //正130x20, 0x20, 0x20, 0x3f, 0x20, 0x20, 0x20, 0x20, 0x3f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00},{0x00, 0x00, 0xfc, 0x04, 0x04, 0xe6, 0x25, 0x24, 0x24, 0x24, 0xe4, 0x04, 0x04, 0xfc, 0x00, 0x00, //向140x00, 0x00, 0x7f, 0x00, 0x00, 0x0f, 0x04, 0x04, 0x04, 0x04, 0x0f, 0x20, 0x40, 0x3f, 0x00, 0x00},};unsigned char fanxiang[][32]={{0x00, 0x00, 0xfe, 0x12, 0x72, 0x92, 0x12, 0x12, 0x12, 0x11, 0x91, 0x71, 0x01, 0x00, 0x00, 0x00, //反160x40, 0x30, 0x4f, 0x40, 0x20, 0x21, 0x12, 0x0c, 0x0c, 0x12, 0x11, 0x20, 0x60, 0x20, 0x00, 0x00},{0x00, 0x00, 0xfc, 0x04, 0x04, 0xe6, 0x25, 0x24, 0x24, 0x24, 0xe4, 0x04, 0x04, 0xfc, 0x00, 0x00, //向170x00, 0x00, 0x7f, 0x00, 0x00, 0x0f, 0x04, 0x04, 0x04, 0x04, 0x0f, 0x20, 0x40, 0x3f, 0x00, 0x00},};unsigned char tingzhi[][32]={{0x80, 0x40, 0x20, 0xf8, 0x07, 0x02, 0x04, 0x74, 0x54, 0x55, 0x56, 0x54, 0x74, 0x04, 0x04, 0x00, //停190x00, 0x00, 0x00, 0xff, 0x00, 0x03, 0x01, 0x05, 0x45, 0x85, 0x7d, 0x05, 0x05, 0x05, 0x03, 0x00},0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xff, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, //止200x40, 0x40, 0x40, 0x40, 0x7f, 0x40, 0x40, 0x40, 0x7f, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00},};void main(void){//int nCount=0;char cKey,cOldKey;unsigned int nScanCode,nKeyCode;unsigned int nSpeed;int nBW=0;PieCtrlRegs.PIEIER1.bit.INTx7 = 1;/ EINT; // Enable Global interrupt INTMERTM; // Enable Global realtime interrupt DBGMnStep=0; nAddStep=0;CTRGR=0x80; // 初始化ICETEK-CTRCTRGR=0x0;CTRGR=0x80;CTRLR=0; // 关闭东西方向的交通灯CTRLR=0x40; // 关闭南北方向的交通灯CTRLR=0xC0;CTRGR=0x81;CTRLCDCMDR=LCDCMDSTARTLINE; // 设置显示起始行CTRLCDCR=0;Delay(LCDDELAY);TurnOnLCD(); // 打开显示LCDCLS(); // 清除显示内存uPort8000=CTRCLKEY;uWork=*(int *)0x108002;showkey();Gpio_PortA();Gpio_PortB();nSpeed=T46uS;uN=0; nCount=nCount1=0; nDir=0; cKey=cOldKey=0;StartCpuTimer0(); //启动定时器while (1){nScanCode=*(int *)0x108001; // 读扫描码nScanCode&=0x0ff; // 低8位uPort8000=*(int *)0x108002;//Delay(5);if ( nScanCode!=0 ){cKey=nScanCode;switch ( cKey ){case 1: ckey1=1;uN=60;displayr(2,6,0,qidong);break;case 9: ckey1=9;uN=0;displayr(2,6,0,tingzhi);break;default:cost(cKey);break;}}CTRLCDCMDR=LCDCMDSTARTLINE; // 设置显示起始行CTRLCDCR=0;CTRLCDCR=0;Delay(LCDDELAY);CTRLCDCMDR=LCDCMDPAGE+1; // 设置操作页=0Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);CTRLCDCMDR=LCDCMDVERADDRESS+48; // 起始列=0Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);nCount2=uN%10; nCount=uN/10;for ( i=0;i<8;i++ ){CTRLCDLCR=(ledkey[nCount][i]); // 屏幕左侧第1至8行第i列赋值port8002=0; // (赋值后当前操作列自动加1,所以不需设置)Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);}for ( i=0;i<8;i++ ){CTRLCDCMDR=0x0b8;CTRLCDCMDR=LCDCMDVERADDRESS+56; // 起始列=0CTRLCDLCR=(ledkey[nCount2][i]); // 屏幕左侧第1至8行第i列赋值port8002=0; // (赋值后当前操作列自动加1,所以不需设置)Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);}Delay(4096); //延时子程序//Delay(4);}StopCpuTimer0();CTRGR=0;}interrupt void cpu_timer0_isr(void){CpuTimer0.InterruptCount++;// Acknowledge this interrupt to receive more interrupts from group 1PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;CpuTimer0Regs.TCR.bit.TIF = 1;CpuTimer0Regs.TCR.bit.TRB = 1;GpioDataRegs.GPBSET.bit.GPIOB4=1;GpioDataRegs.GPBDAT.bit.GPIOB4=( nCount1<uN )?1:0;nCount1++; nCount1%=100;*(int *)0x108007=pwm2[nStep];nStep+=nAddStep;if ( nStep<0 ) nStep=7;else if ( nStep>7 ) nStep=0;StopCpuTimer0();Delay(6);*(int *)0xc0000 ^=0x1;StartCpuTimer0();}void Delay(unsigned int nDelay){int ii,jj,kk=0;for ( ii=0;ii<nDelay;ii++ ){for ( jj=0;jj<64;jj++ ){//RefreshLEDArray();kk++;}}}void cost(unsigned int cKey){if(ckey1==1){switch ( cKey ){case 2:uN+=10;if(uN>90)uN=90;displayr(2,6,0,jiashu);break;case 3:uN-=10;if(uN<30)uN=30;displayr(2,6,0,jianshu);break;case 4:uN1=uN;uN=0; // 降速Delay(128);GpioDataRegs.GPADAT.bit.GPIOA4 = 1;////CpuTimer0Regs.PRD.all = nSpeed;//CpuTimer0Regs.PRD.all = 182*50;nDir=0;Delay(128);uN=uN1;displayr(2,6,0,zhengxiang);t=0;break;case 5:uN1=uN;uN=0; // 降速Delay(128);GpioDataRegs.GPADAT.bit.GPIOA4 = 0;Delay(128);//CpuTimer0Regs.PRD.all=nSpeed;nDir=1;Delay(128);uN=uN1;displayr(2,6,0,fanxiang);t=1;break;}}}void RefreshLEDArray(){int i;for ( i=0;i<8;i++ ){CTRGR=ledx[i];CTRLA=ledbuf[i];}}void showkey(void){display(3,0,0,name);displayshuzi(1,2,0,ledkey);display(2,2,1,qidong);displayshuzi(2,4,0,ledkey);display(2,4,1,jiashu);displayshuzi(3,6,0,ledkey);display(2,6,1,jianshu);displayshuzir(4,0,0,ledkey);displayr(2,0,1,zhengxiang);displayshuzir(5,2,0,ledkey);displayr(2,2,1,fanxiang);displayshuzir(9,4,0,ledkey);displayr(2,4,1,tingzhi);}void Gpio_PortA(void){var1= 0x0000; // sets GPIO Muxs as I/Osvar2= 0x00FF; // sets GPIO 15-8 DIR as inputs, 7-0 DIR as outputsvar3= 0x0000; // Don't set any input qualifierGpio_select();test_count = 0;Test_status[Test_var] = 0x0002;Test_var++;Test_status[Test_var] = 0xD0BE; // Set the default value of status // to "PASSED"GpioDataRegs.GPACLEAR.all = 0x00FF; // Test Clearasm(" RPT #5 ||NOP");GpioDataRegs.GPASET.bit.GPIOA4=1;}void Gpio_PortB(void){var1= 0x0000; // sets GPIO Muxs as I/Osvar2= 0x00FF; // sets GPIO 15-8 DIR as inputs, 7-0 DIR as outputsvar3= 0x0000; // Don't set any input qualifierGpio_select();test_count = 0;Test_status[Test_var] = 0x0002;Test_var++;Test_status[Test_var] = 0xD0BE; // Set the default value of status // to "PASSED"GpioDataRegs.GPBCLEAR.all = 0x00FF; // Test Clearasm(" RPT #5 ||NOP");GpioDataRegs.GPBSET.bit.GPIOB4=1;}void Gpio_select(void){EALLOW;GpioMuxRegs.GPAMUX.all=var1; // Configure MUXs as digital I/Os or GpioMuxRegs.GPBMUX.all=var1; // peripheral I/OsGpioMuxRegs.GPDMUX.all=var1;GpioMuxRegs.GPFMUX.all=var1;GpioMuxRegs.GPEMUX.all=var1;GpioMuxRegs.GPGMUX.all=var1;GpioMuxRegs.GPADIR.all=var2; // GPIO PORTs as outputGpioMuxRegs.GPBDIR.all=var2; // GPIO DIR select GPIOs as outputGpioMuxRegs.GPDDIR.all=var2;GpioMuxRegs.GPEDIR.all=var2;GpioMuxRegs.GPFDIR.all=var2;GpioMuxRegs.GPGDIR.all=var2;GpioMuxRegs.GPAQUAL.all=var3; // Set GPIO input qualifier valuesGpioMuxRegs.GPBQUAL.all=var3;GpioMuxRegs.GPDQUAL.all=var3;GpioMuxRegs.GPEQUAL.all=var3;EDIS;}void TurnOnLCD(){CTRLCDCMDR=LCDCMDTURNON;Delay(LCDDELAY);CTRLCDCR=0;Delay(2048);CTRLCDCMDR=LCDCMDSTARTLINE;Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);}void LCDCLS()int i,j;CTRLCDCMDR=LCDCMDSTARTLINE; Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);for ( i=0;i<8;i++ ){CTRLCDCMDR=LCDCMDPAGE+i; Delay(LCDDELAY); CTRLCDCR=0;Delay(LCDDELAY); CTRLCDCMDR=LCDCMDVERADDRESS; Delay(LCDDELAY); CTRLCDCR=0;Delay(LCDDELAY);for ( j=0;j<64;j++ ){CTRLCDLCR=0;Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);}CTRLCDCMDR=LCDCMDPAGE+i; Delay(LCDDELAY); CTRLCDCR=0;Delay(LCDDELAY); CTRLCDCMDR=LCDCMDVERADDRESS; Delay(LCDDELAY); CTRLCDCR=0;Delay(LCDDELAY);for ( j=0;j<64;j++ ){CTRLCDRCR=0;Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);}}void display(int zs,int hang,int lie,unsigned char (*a)[32]){for(k=0;k<zs;k++){CTRLCDCMDR=LCDCMDPAGE+hang; // 设置操作页=0Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);CTRLCDCMDR=LCDCMDVERADDRESS+16*(k+lie); // 起始列=0Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);for ( i=0;i<16;i++ ){CTRLCDLCR=(a[k][i]); // 屏幕左侧第1至8行第i列赋值port8002=0; // (赋值后当前操作列自动加1,所以不需设置)Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);}CTRLCDCMDR=LCDCMDPAGE+hang+1; // 设置操作页=0Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);CTRLCDCMDR=LCDCMDVERADDRESS+16*(k+lie); // 起始列=0Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);for ( i=16;i<32;i++ ){CTRLCDLCR=(a[k][i]); // 屏幕左侧第1至8行第i列赋值port8002=0; // (赋值后当前操作列自动加1,所以不需设置)Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);}Delay(4096);}}void displayshuzi(int sz,int hang,int lie,unsigned char (*b)[8])//显示数字{CTRLCDCMDR=LCDCMDPAGE+hang; // 设置操作页=0Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);CTRLCDCMDR=LCDCMDVERADDRESS+8*lie; // 起始列=0Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);for ( i=0;i<8;i++ ){CTRLCDLCR=b[sz][i];CTRLCDCR=0;Delay(LCDDELAY);}Delay(4096); //延时子程序}void displayr(int zs,int hang,int lie,unsigned char (*c)[32]){for(k=0;k<zs;k++){CTRLCDCMDR=LCDCMDPAGE+hang; // 设置操作页=0Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);CTRLCDCMDR=LCDCMDVERADDRESS+16*(k+lie); // 起始列=0Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);for ( i=0;i<16;i++ ){CTRLCDRCR=(c[k][i]); // 屏幕左侧第1至8行第i列赋值port8002=0; // (赋值后当前操作列自动加1,所以不需设置)Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);}CTRLCDCMDR=LCDCMDPAGE+hang+1; // 设置操作页=0Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);CTRLCDCMDR=LCDCMDVERADDRESS+16*(k+lie); // 起始列=0Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);for ( i=16;i<32;i++ ){CTRLCDRCR=(c[k][i]); // 屏幕左侧第1至8行第i列赋值port8002=0; // (赋值后当前操作列自动加1,所以不需设置)Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);}Delay(4096);}}void displayshuzir(int sz,int hang,int lie,unsigned char (*d)[8])//显示数字{CTRLCDCMDR=LCDCMDPAGE+hang; // 设置操作页=0Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);CTRLCDCMDR=LCDCMDVERADDRESS+8*lie; // 起始列=0Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);for ( i=0;i<8;i++ ){CTRLCDRCR=d[sz][i];CTRLCDCR=0;Delay(LCDDELAY);}Delay(4096); //延时子程序}char ConvertScanToChar(unsigned char cScanCode){char cReturn;cReturn=0;switch ( cScanCode ){case SCANCODE_0: cReturn='0'; break;case SCANCODE_1: cReturn='1'; break;case SCANCODE_2: cReturn='2'; break;case SCANCODE_3: cReturn='3'; break;case SCANCODE_4: cReturn='4'; break;case SCANCODE_5: cReturn='5'; break;case SCANCODE_6: cReturn='6'; break;case SCANCODE_7: cReturn='7'; break;case SCANCODE_8: cReturn='8'; break;case SCANCODE_9: cReturn='9'; break;// case SCANCODE_F1:case SCANCODE_Plus: cReturn='+'; break;// case SCANCODE_F2:case SCANCODE_Minus: cReturn='-'; break;}return cReturn;}六、设计进度安排1. 集中辅导: 7月11日2. 查阅资料完成设计报告: 7月11日-7月12日3. 课程设计调试: 7月13日-7月22日(双休日除外)4. 课程设计调试报告提交: 7月21日-7月22日七、实验结果•利用小键盘控制电机的停转、转速和转向,并在液晶上实时显示电机当前运行状态以及设计者信息。