DSP实验二TMSF按键输入控制LED亮灭
- 格式:doc
- 大小:80.50 KB
- 文档页数:3
最近很多朋友开始学习DSP了(小双同志也加入这个团伙),本人基本上入门。
在此给他家分享一下DSP的入门经验。
其实DSP和我们本科所使用的单片机基本上架构一致,只是在它的内部集成了一系列的运算单元和逻辑移位单元,并且安排了指令流水,这样在运算性能上大大的提高,可以完成一系列的复杂计算。
当然DSP内部也集成了一系列外设,我这儿使用的是TMS320C6713 DSP,这块DSP主频可以达到450M,可以安排8级指令流水,在同一时刻可以同时执行8条指令,当然这要求的是CPU内部的运算单元不能冲突!好了,在此我就不多介绍了,免得把大家说得晕呼呼的!我们刚才是入门了解这些基本上没用,我们得一步一步的按着简单的东西一步一步的做实验。
所以我们今天开始一个最简单的实验—LED灯的点亮!我们一般学习是要买一块开发板,在此我不做推销,其实每一块开发板都基本上差不多,很多就是按照TI公司的Demo板,而设计的。
如果没有学习板,自己看书看了半年,还不如我拿到板子调试一个月的效果,因为很多东西是要在实际中才知道他的作用。
我们用一个板子一般要几样东西:一、原理图(知道每一根信号线的走向,比如我们的LED就连接到DSP的GPIO的13脚)二、芯片资料(芯片的总的芯片Datasheet和子模块的Datasheet,一般在芯片资料中总的芯片资料会告诉大家芯片的整体规划,比如内存分布,特殊寄存器的分布和具体的地址,而子模块资料会把这个模块的功能和使用介绍得更为详细)三、电路板和仿真器(这个是投入较大的一笔了)四、编译软件和计算机(希望在做实验之前大家用过编译器,不一定是CCS,因为所有基于windows上的编译软件都是一个样)我们来开始第一步,查看我们的电路板上的LED灯的位置和DSP的信号线的连接:从左边的几个原理图的截图我们可以清晰的看到LED灯接到了GPIO的13脚,中间用了一个缓冲器过度了一下,实际的控制信号还是来自DSP的GPIO13。
用按键控制LED灯的亮灭,当按键按下时,LED灯亮,当按键松开时,LED灯灭。
#include"msp430f6638.h"unsigned char flag;void main(void){WDTCTL = WDTPW+WDTHOLD; // Stop WDTP4DIR &=~(BIT2);P4DIR |= BIT4+BIT5+BIT6; // P4.4,P4.5,P4.6 set as outputP4OUT &=~(BIT4+BIT5+BIT6); // set led offP2IE |= BIT6; // enable P2.6 interruptP2IFG &= ~(BIT6); // clean interrupt flag__enable_interrupt(); // enable interruptwhile(1){ if((P4IN & 0x04)==0){ P2IFG |= BIT6;}else{P2IFG &=~BIT6;}}} // PORT2 interrupt service routine#pragma vector=PORT2_VECTOR__interrupt void port_2(void){P4OUT ^=(BIT4+BIT5+BIT6); // set led onP2IFG &=~BIT6; // clean interrupt flag}用按键控制LED灯的亮灭,当按键按下时,LED灯亮,当按键松开时,LED灯灭。
(查询)#include"msp430f6638.h"void main(void){WDTCTL = WDTPW+WDTHOLD; // Stop WDT//setting directionP4DIR &= ~(BIT2); //setting IO for inputP4DIR |= BIT4+BIT5+BIT6; // P4.4,P4.5,P4.6 set as outputwhile (1){if ((P4IN & 0x04) == 0) //If key is pressed{P4OUT |= BIT4+BIT5+BIT6; //led on}else{P4OUT &=~(BIT4+BIT5+BIT6); // led off}}}将ACLK配置为VLOCLK(约为10K),并将ACLK通过P1.0口输出#include<msp430f6638.h>void main(void){WDTCTL = WDTPW + WDTHOLD; //关看门狗UCSCTL4 |= SELA_1; //将ACLK时钟源配置为VLO;P1DIR |= BIT0;P1SEL |= BIT0; //将ACLK通过P1.0输出__bis_SR_register(LPM3_bits);//进入LPM3,SMCLK和MCLK停止,ACLK活动}设ACLK = XT1 = 32768Hz,并通过P1.0输出。
D S P实验二、T M S320F28335按键输入控制L E D亮灭继续我的第二个实验;实现按键控制LED亮灭:功能描述:上电默认LD3亮;触动一次按键SW12,LD3灭再按一次按键SW12, LD3亮再触动一次按键SW12,LD3灭再按一次按键SW12, LD3亮。
实现每触动一次按键,LED执行一次由亮到灭,或者由灭到亮,也就是实现一次状态反转。
电路连接说明:LD3 设置为通用GPIO 上拉输出初始化后默认为输出LD3亮状态;LD3控制LED灯的负极,如下图;SW12 设置为通用GPIO 上拉输入该引脚应用滤波功能,且仅在按键抬起时控制LD3状态发生变化。
按键电路如上图,GPIO53须输出0,当按键按下时,读取GPIO50端口值,为0,当按键未按下时,GPIO50因为上上拉作用,其端口值为1。
程序设计说明:按键的读取采用实时扫描的方式(非中断方式),功能要求在按键抬起后发生LED状态翻转;所以要记录上一次按键值,并且将当前值==0&&上一次值==1时,做为按键抬起有效,控制LED发生状态翻转。
主要程序如下:while(1){EALLOW;last_Key_SW12 = new_Key_SW12; //保存旧值new_Key_SW12 = Key_SW12();//读取新值if( last_Key_SW12==0 && new_Key_SW12==1)LD3_TOGGLE();EDIS;}经实际测试,上述程序可以实现LD3的翻转,基本达到设计要求。
但是在测试过程中,时好时坏,有时能够看见LED快速翻转,说明按键有抖动的情况,这里可以考虑IO口滤波,即在初始化时,设置IO采样周期以及量化串口,设置如下:采样周期设置为200时,不再出现抖动现象,按键稳定操作。
源程序如下:#include"DSP2833x_Device.h"// DSP2833x Headerfile Include File#include"DSP2833x_Examples.h"// DSP2833x Examples Include File#define LD3_ON() GpioDataRegs.GPACLEAR.bit.GPIO0 = 1#define LD3_OFF() GpioDataRegs.GPASET.bit.GPIO0 = 1#define LD3_TOGGLE() GpioDataRegs.GPATOGGLE.bit.GPIO0 = 1#define LD4_ON() GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1#define LD4_OFF() GpioDataRegs.GPBSET.bit.GPIO34 = 1#define Key_SW12() GpioDataRegs.GPBDAT.bit.GPIO50/** main.c*/int main(void) {unsigned char last_Key_SW12=1;//保留上一次扫描结果,上电默认为未按下状态unsigned char new_Key_SW12=1;//保留当前扫描结果,上电默认为未按下状态InitSysCtrl();DINT;IER = 0x0000;IFR = 0x0000;InitPieCtrl();InitPieVectTable();InitGpio();EALLOW;//GPIO0 LD3 控制LED负极GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;//0 gpio modeGpioCtrlRegs.GPADIR.bit.GPIO0 = 1;//1 output 0 inputGpioCtrlRegs.GPAPUD.bit.GPIO0 = 0;//1 enable pullup 0 disable pullup//GPIO34 LD4 控制LED负极GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0;//0 gpio modeGpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;//1 output 0 inputGpioCtrlRegs.GPBPUD.bit.GPIO34 = 0;//1 enable pullup 0 disable pullup//GPIO50 按键矩阵SW12输入端GpioCtrlRegs.GPBMUX2.bit.GPIO50 = 0;//0 gpio modeGpioCtrlRegs.GPBDIR.bit. GPIO50 = 0;//1 output 0 inputGpioCtrlRegs.GPBPUD.bit. GPIO50 = 0;//1 enable pullup 0 disable pullupGpioCtrlRegs.GPBCTRL.bit.QUALPRD2= 200;//采样周期=2*Tsysclkout*200GpioCtrlRegs.GPBQSEL2.bit.GPIO50 = 2;//采样窗内3次采样结构相同//GPIO53 按键矩阵负极输出0GpioCtrlRegs.GPBMUX2.bit.GPIO53 = 0;//0 gpio modeGpioCtrlRegs.GPBDIR.bit. GPIO53 = 1;//1 output 0 inputGpioCtrlRegs.GPBPUD.bit. GPIO53 = 0;//1 enable pullup 0 disable pullupGpioDataRegs.GPBCLEAR.bit.GPIO53 = 1;LD3_ON();//默认输出亮状态LD4_OFF();EDIS;while(1){EALLOW;last_Key_SW12 = new_Key_SW12; //保存旧值new_Key_SW12 = Key_SW12();//读取新值if( last_Key_SW12==0 && new_Key_SW12==1)LD3_TOGGLE();EDIS;}}。
#pragma CODE_SECTION(vect,"vect") unsigned int *pmem=0;#define IMR *(pmem+0x0000)#define IFR *(pmem+0x0001)#define PMST *(pmem+0x001d)#define SWCR *(pmem+0x002b)#define SWWSR *(pmem+0x0028)#define CLKMD *(pmem+0x0058)#define ST1 *(pmem+0x007)#define PRD0 *(pmem+0x0025)/* timer0 period register */#define TCR0 *(pmem+0x0026)/* timer0 control register */ioport unsigned portc002; //键盘地址ioport unsigned portc001; //指示灯地址ioport unsigned portc000; //数码显示地址//数据线的高8位是位码,低8位是段码void cpu_init() /*初始化DSP*/ { asm(" ssbx intm");asm(" ssbx xf "); //总清零PMST=0xe8;SWWSR=0x7fff;SWCR=0x0001;IMR=0x010c;IFR=0xffff;CLKMD=0x1000;asm(" rsbx xf "); //打开数据口asm(" rsbx intm");}void delay10ms(){int i,j,k;for (i=0;i<2;i++)for (j=0;j<2;j++)for (k=0;k<2;k++);}//主测试程序void main(){ cpu_init();for(;;){ };}interrupt void keyint0() //键盘测试{ int a;a=portc001;a=a&0xff00;if(a!=0xff00){delay10ms();a=portc001;a=a&0xff00;switch(a){case 0xfe00: portc000=0x0106;//显示1portc002=0xFE00;asm(" nop");break;case 0xfd00: portc000=0x025b;//显示2 portc002=0xFD00;asm(" nop");break;case 0xfb00: portc000=0x044f;//显示3 portc002=0xFB00;asm(" nop");break;case 0xf700: portc000=0x0866;//显示4 portc002=0xF700;asm(" nop");break;case 0xef00: portc000=0x106d;//显示5portc002=0xef00;asm(" nop");break;case 0xdf00: portc000=0x207d;//显示6portc002=0xdf00;asm(" nop");break;case 0xbf00: portc000=0x4007;//显示7 portc002=0xbf00;asm(" nop");break;case 0x7f00: portc000=0x807f;//显示8 portc002=0x7f00;break;}}}void vect(){ asm(" .ref _c_int00");asm(" .ref _keyint0");asm(" b _c_int00"); /* reset */asm(" nop");asm(" nop");asm(" rete"); /* nmi */ asm(" nop");asm(" nop");asm(" nop");asm(" rete"); //asm(" nop");asm(" nop");asm(" nop");asm(" rete");asm(" nop");asm(" nop");asm(" nop");asm(" rete");asm(" nop");asm(" nop");asm(" nop");asm(" rete");asm(" nop");asm(" nop");asm(" nop");asm(" rete");asm(" nop");asm(" nop");asm(" nop");asm(" rete");asm(" nop");asm(" nop");asm(" nop");asm(" rete");asm(" nop");asm(" nop");asm(" nop");asm(" rete");asm(" nop");asm(" nop");asm(" nop");asm(" rete");asm(" nop");asm(" nop"); asm(" nop");asm(" rete");asm(" nop");asm(" nop");asm(" nop");asm(" rete");asm(" nop");asm(" nop");asm(" nop");asm(" rete");asm(" nop");asm(" nop");asm(" nop");asm(" rete");asm(" nop");asm(" nop");asm(" nop");asm(" rete");asm(" nop");asm(" nop");asm(" nop");asm(" rete "); /* int0 */ asm(" nop");asm(" nop");asm(" nop");asm(" rete"); /* int1 */ asm(" nop");asm(" nop");asm(" nop");asm(" b _keyint0"); /* int2 */ asm(" nop");asm(" nop");asm(" nop");asm(" nop"); /* tint0 */ asm(" nop");asm(" nop");asm(" rete"); /* brint0 */ asm(" nop");asm(" nop");asm(" nop");asm(" rete"); /* bxint0 */ asm(" nop");asm(" nop");asm(" nop");asm(" rete"); /* dmac0 */asm(" nop");asm(" nop");asm(" nop");asm(" rete"); /* tint1 */asm(" nop");asm(" nop");asm(" nop");asm(" nop");asm(" nop"); /* int3 */asm(" nop");asm(" nop");asm(" rete"); /* hpint */asm(" nop");asm(" nop");asm(" nop");asm(" rete "); /* brint1 */asm(" nop");asm(" nop");asm(" nop");asm(" rete"); /* bxint1 */asm(" nop");asm(" nop");asm(" nop");asm(" rete"); /* dmac4 */asm(" nop");asm(" nop");asm(" nop");asm(" rete"); /* dmac5 */ asm(" nop");asm(" nop");asm(" nop");asm(" nop");asm(" nop");asm(" nop");asm(" nop");} 这个cmd程序可以不打,每次一样的的-c-h.obj-m test.map-l rts.lib-stack 0x800MEMORY{PAGE 0: PROG: origin = 080h, length = 4000hPAGE 1: DA TA: origin = 8000h, length = 4000h}SECTIONS{ .text > PROG PAGE 0.cinit > PROG PAGE 0.switch > PROG PAGE 0vect > 80h PAGE 0.data > DATA PAGE 1.const > DATA PAGE 1.bss > DA TA PAGE 1.sysmem > DATA PAGE 1.stack > DATA PAGE 1}。
设计4按键与LED控制实验
一、设计目的:
掌握按键与LED的控制、锻炼分析VHDL语言的能力。
学会对实验板上的FPGA进行编程下载,硬件验证自己的设计项目。
二、原理说明:
如图5-1所示,要控制发光二极管DK1~DK4的亮灭,我们只须控制LED1~LED4的电平。
从图中可以看出,当LED1~LED4中任意一位为低电平,对应的LED将被点亮。
当LED1~LED4全部为高电平时DK1~DK4全灭,全部为低电平时DK1~DK4全亮。
图5-1 LED电路原理图
图5-2为按键电路,按键SK1~SK4任意一个按下时,控制信号KEY1~KEY4中相应的信号变为低电平,如没有按键按下,则KEY1~KEY4都为高电平。
图5-2 按键电路
三、设计内容:
1、分析图5-3中的各语句功能、设计原理、逻辑功能。
图5-3 按键与LED控制VHDL源程序
2、对上述程序进行时序仿真,分析其电路的功能。
(注:信号sk1为实验板
上sk1的输入信号)。
3、仿真通过后,对程序进行下载(JTAG下载方式),硬件验证该程序。
(注:表1为锁定引脚对照表)。
4
等闪的频率,顺序等)的功能。
四、思考题:
根据本次试验的思想,给出霓虹灯控制的方法?五、设计报告:
根据以上的要求,将实验内容及思考题写入实验报告。
《DSP技术》课程实验报告学生姓名:所在班级:指导教师:记分及评价:一、实验名称:拨码开关实验二、实验目的了解DSP开发系统的组成和结构;了解IO的基本编程方法三、实验内容修改例子程序,实现以下功能:(1)调试例子程序,理解程序设计思想;(2)修改例子程序,实现每个拨码开关控制一种不同的LED花样显示。
(3)实现LED流水灯的功能,并且实现由拨码开关键值控制LED流水灯的频率(按键值与LED流水灯频率关系自定义,至少提供两种不同的LED流水灯变化的频率)(加分)四、实验程序与结果分析void Delay(int n){int i=0,j;for(j=0; j<n; j++)for(i=0;i<1000;i++);}void main(void){unsigned int temp,m;unsigned int temp1[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};temp = 0;InitSysCtrl();//初始化PLL,WatchDog,使能外围时钟,该初始化文件在"DSP281x_SysCtrl.c"中DINT;//关闭CPU中断// Initialize PIE control registers to their default state.// The default state is all PIE interrupts disabled and flags// are cleared.InitPieCtrl();IER = 0x0000;//关闭中断和清除所有中断标志IFR = 0x0000;// Initialize the PIE vector table with pointers to the shell Interrupt // Service Routines (ISR).InitPieVectTable();for(;;){asm(" nop ");temp = *(int *)0x2200&0x00ff;switch(temp){case 0xfe: * (int *)0x2200 = temp1[0];break;case 0xfd: * (int *)0x2200 = temp1[1];break;case 0xfb: * (int *)0x2200 = temp1[2];break;case 0xf7: * (int *)0x2200 = temp1[3];break;case 0xef: * (int *)0x2200 = temp1[4];break;case 0xdf: * (int *)0x2200 = temp1[5];break;case 0xbf: * (int *)0x2200 = temp1[6];break;case 0x7f: * (int *)0x2200 = temp1[7];break;}asm(" nop ");if(temp==1){for(m=0; m<8; m++){Delay(1200);* (int *)0x2200 = ~(1<<m);Delay(200);}}if(temp==3){for(m=0; m<8; m++){Delay(800);* (int *)0x2200 = ~(1<<m);Delay(100);}}//temp值输出0x2200地址的LED灯asm(" nop ");}}五、小结通过这次试验让我明白不同模块可以共用同一个地址,这应该是时分复用的功劳吧,其次0x200这地址允许读写操作,这次的试验箱改变以往地址低位在后的设计应该是别出心裁的,目的应该是考验学生对地址的理解。
DSP对LED控制实训指导书1.实验目的(1)学会打开一个工程(2)学会编译、调试(3)了解DSP IO口的使用2.实验设备(1)PC机一台(2)HKTY-1型离网/并网逆变系统实验箱一台3.实验内容控制开发箱内实验板上的LED指示灯闪烁,学习DSP的IO口作为输出管脚使用。
上图为LED驱动电路图。
此电路中采用倒灌式输入方式,其目的是为了增加IO的驱动电流。
本实验我们配置DSP的GPIO60和GPIO61为普通IO口模式,方向为输出。
当IO口电平为低时LED亮,IO口电平为高时LED熄灭。
使用DSP的IO口和单片机的IO口有许多的不同之处。
首先,在DSP 使用IO 口之前,要先配置GPXMUX 寄存器,将该寄存器的利用的相应位置为0;既然配置为通用IO 口后就要配置器方向是作为输入还是作为输出的,这些都要在初始化中配置。
具体实例看实验代码。
4.实验步骤(1)在仿真器USB接口连接到PC机以后,将仿真器的JTAG接头与开发板JTAG接口相连,闭合开发箱左上角的红色电源开关。
核心板上的电源指示灯亮。
(2)运行CCStudiov3.3,如下图所示。
窗口左下角会显示表示还没有与目标板建立连接。
(3)选择Project->Open,打开需要运行的实验工程,本实验代码的路径为D:\DSP28335_Code\GPIO_LED。
(注:代码路径不能出现任何的中文字符)如下图:(4)打开工程后,可以在左边的files窗口中查看工程里的文件,如下图:(5)选择Project->RebuildAll编译源程序,当你只是修改了一个文件,可以只是单独编译这个文件,这样可以提高调试速度,点下图中的incrementalbuild。
(6)编译完成后连接目标板,选择Debug->Connect(或按组合键ALT+C),程序窗口左下角会显示,表示已经与目标板连接成功。
(7)下载程序,选择File->LoadProgram..(或按CTRL+L),打开LoadProgram 窗口,打开Debug文件夹选择xxx.out文件下载。
评定成绩:审阅教师:东南大学自动化学院实验报告第三次实验实验名称:基于DSP 系统的实验——液晶屏、键盘外设控制实验姓 名:院(系八自动化 专 业: 自动化同组人员: 实验时间: 2017年3月30日课程名称:DSP 原理及C 程序开发 学 号:《DSP技术及课程设计》实验报書学1;・08014102一-实验目的二-实验S备三-实验原理四.基本实验内容五.提高要求六.实验小结12《DSP技术及课程设计》实验报倂学号08014102一.实验目的通过实验学习使用F28335ADSP的扩展端I I控制外W设备的方法• 了解(1)发光一•极tf的控制编程方法(2)液晶显示器编程方法(3)键盘外设控制编程方法。
二.实验设备计算机,ICETEK・F28335・EDU实验箱(或ICETEK仿真器+ICETEK - F28335-A系统板+相关连线及电源)。
三.实验原理1.发光二极管显示阵列(交通灯)控制TMS32OF28335DSP的扩展存储器接I l(5MnO用来与大多数外W设备进行连接.典型应用如连接片外扩展存储器等。
这一接II提供地址连线、数据连线和一组控制线。
ICETEK-F28335-A将这些扩展线引到了板上的扩展插座上供扩展使用。
实验箱中ICETEK.CTR板上的发光二极管显示阵列(交通灯)的显示是由扩展端I 1控制,扩展在EMIF接口的两个寄存器提供具体控制。
CTRGR为全W控制寄存器,地址为0x208000, 作用为对液晶控制板上的设备进行初始化。
CTRLR为辅助控制寄存器,地址为0x208007,作用为対交通灯进行控制。
交通灯一共12个,使其顺序亮灭的例程(labHC2)如下所示:#defuie LEDS * (iiit *)0xc0000#defiiie CTRGR ♦ (int *)0x208000 //page 29 expeTiinent instructor #defiiie CTRLCDCMDR * (iiit *)0x208001 #defiiie CTRKEY » (iiit *)0x208001 ftdefiiie CTRLCDCR * (int *)0x208002#defiiie CTRCLKEY * (int *)0x208002 ftdefiiie CTRLCDLCR ♦(int *)0x208003 #d€fine CTRLCDRCR * (iiit *)0x208004 #defiiie CTRLA • (iiit *)0x208005 f tdefiiie CTRLR ♦ (int *)0x208007 luisigned nituLed[12][2] = {{0x01,0x40},{0x02,0x40},{0x04,0x40},{0x00,0x48}, {0x00,0x50},{0x00,0x60}, {0x08,0x40},{0x10,0x40 )40x20,0x40}.{0x00,0x41}, {0x00,0x42}, {0x00,0x44},void inaui(void)intnCoiintInitSysCtrlQ;InitXintfl6GpioO:CTRGR = 0x80;// 初始化ICETEK 一CTR《DSP技术及课程设计>实验报書学1;・08014102CTRGR = 0x0;CTRGR = 0x80;CTRLR = 0;//关闭东酋方向的交通灯CTRLR = 0x40; //关闭南北方向的交通灯11 Count = 0;* (iiit *)0x208007 = uLed[nCoimt][0];〃设置指示灯状态» (iiit *)0x208007 = uLed[nCoimt][l];nCount + +; nCoiinl% =12;Dehy(512);全局控W寄存S CTRGROS:全局控制标志位:BUZZE:蜂鸣器使能:PWME: PWM控制使能:lOPE:通用I/O端「lCPA・LED)n接控制交通灯北方向红灯使能:DCME:直流电机使能;例如需要使能II 流电机•町以用以卞C 语言语句:CTRGR=1:CTRLR 寄存器对应端【I 地址为:0x208007>需要连续两次写入8位数据。
DSP实验三、TMS320F28335定时器控制LED亮灭继续我的第三个实验;实现定时器控制LED亮灭:学习⽬的:定时器的寄存器设置及准确定时功能,F28335共有三个定时器:timer0、timer1、timer2(timer2也可⽤于DSP/BIOS);功能描述:上电默认LD4灭;初始化完成后,LD4以1HZ(1S)频率做状态翻转;电路连接说明:LD4设置为通⽤GPIO 上拉输出初始化后默认为输出LD4灭状态;LD4控制LED灯的负极,如下图;本次实验选⽤定时器0,程序时刻读取计数器的值,当值为0时,LD4状态翻转,计数器重载;程序设计说明:定时器0的预定标寄存器和计数器设置:定时器时钟为sysclkout=135MHz,预定标寄存器设为1350,计数器设为100000;135Mhz/(1350*100000=1Hz)主要程序如下:CpuTimer0Regs.TPR.bit.TDDR = 0x546 & 0xFF;//0x546 预定标寄存器(预分频器)CpuTimer0Regs.TPRH.bit.TDDRH = (0x546>>8) & 0x00FF;//0x546 预定标寄存器(预分频器)注意:在对分配寄存器设置是出现问题,TDDR、TDDRH是两个8位寄存器组成的16位寄存器。
源程序如下:#include"DSP2833x_Device.h"// DSP2833x Headerfile Include File#include"DSP2833x_Examples.h"// DSP2833x Examples Include File#define LD3_ON() GpioDataRegs.GPACLEAR.bit.GPIO0 = 1#define LD3_OFF() GpioDataRegs.GPASET.bit.GPIO0 = 1#define LD3_TOGGLE() GpioDataRegs.GPATOGGLE.bit.GPIO0 = 1#define LD4_ON() GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1#define LD4_OFF() GpioDataRegs.GPBSET.bit.GPIO34 = 1#define LD4_TOGGLE() GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1#define Key_SW12() GpioDataRegs.GPBDAT.bit.GPIO50/** main.c*/int main(void) {InitSysCtrl();IER = 0x0000;IFR = 0x0000;InitPieCtrl();InitPieVectTable();InitGpio();EALLOW;//GPIO0 LD3 控制LED负极GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;//0 gpio modeGpioCtrlRegs.GPADIR.bit.GPIO0 = 1;//1 output 0 inputGpioCtrlRegs.GPAPUD.bit.GPIO0 = 0;//1 enable pullup 0 disable pullup//GPIO34 LD4 控制LED负极GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0;//0 gpio modeGpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;//1 output 0 inputGpioCtrlRegs.GPBPUD.bit.GPIO34 = 0;//1 enable pullup 0 disable pullup//GPIO50 按键矩阵SW12输⼊端GpioCtrlRegs.GPBMUX2.bit.GPIO50 = 0;//0 gpio modeGpioCtrlRegs.GPBDIR.bit. GPIO50 = 0;//1 output 0 inputGpioCtrlRegs.GPBPUD.bit. GPIO50 = 0;//1 enable pullup 0 disable pullup GpioCtrlRegs.GPBCTRL.bit.QUALPRD2= 200;//采样周期=2*Tsysclkout*200GpioCtrlRegs.GPBQSEL2.bit.GPIO50 = 2;//采样窗内3次采样结构相同//GPIO53 按键矩阵负极输出0GpioCtrlRegs.GPBMUX2.bit.GPIO53 = 0;//0 gpio modeGpioCtrlRegs.GPBDIR.bit. GPIO53 = 1;//1 output 0 inputGpioCtrlRegs.GPBPUD.bit. GPIO53 = 0;//1 enable pullup 0 disable pullupGpioDataRegs.GPBCLEAR.bit.GPIO53 = 1;LD3_ON();//默认输出亮状态LD4_OFF();EDIS;//定时器0 设为1Hz = 135MHz/(1350*100000)CpuTimer0Regs.PRD.all = 100000;//0x186A0 周期寄存器CpuTimer0Regs.TPR.bit.TDDR = 0x546 & 0xFF;//0x546 预定标寄存器(预分频器)CpuTimer0Regs.TPRH.bit.TDDRH= (0x546>>8) & 0x00FF;//0x546 预定标寄存器(预分频器)CpuTimer0Regs.TCR.bit.TSS = 1;//1停⽌定时器⼯作 0启动定时器CpuTimer0Regs.TCR.bit.TRB = 1;//重载定时器计数器和预分频器CpuTimer0Regs.TCR.bit.TSS = 0;//1停⽌定时器⼯作 0启动定时器{if(CpuTimer0Regs.TIM.all==0){LD4_TOGGLE() ;CpuTimer0Regs.TCR.bit.TSS = 1;//1停⽌定时器⼯作 0启动定时器CpuTimer0Regs.TCR.bit.TRB = 1;//重载定时器计数器和预分频器CpuTimer0Regs.TCR.bit.TSS = 0;//1停⽌定时器⼯作 0启动定时器}}}主循环应该采⽤⽤下⾯的语句更合理,即采⽤判断定时器中断标志的⽅式,来判断计数器为0,计数结束,如下:while(1){if(CpuTimer0Regs.TCR.bit.TIF==1){ //中断标志位,即使没有使能中断,但是定时计数器减到0时,该位置1,该位写1清0 CpuTimer0Regs.TCR.bit.TIF=1;//清中断标志位LD4_TOGGLE() ;}}。
汇编按键控制led灯亮灭编写程序概述1. 引言1.1 概述本文旨在介绍使用汇编语言编写程序,以实现按键控制LED灯亮灭的功能。
通过该实验,我们可以深入了解汇编语言的基本原理和操作方法,并学会将其应用于具体的电路控制中。
1.2 文章结构本文主要分为四个部分,分别是引言、汇编按键控制LED灯亮灭编写程序、程序测试与调试过程及结果分析以及总结和展望。
在引言部分,我们将简要介绍文章的背景和目的,为读者提供整个实验的概览。
接下来的部分将逐步介绍硬件准备工作、程序设计思路、关键代码解读与实现步骤等内容。
随后,我们将介绍测试环境搭建、测试过程记录以及结果分析与优化方案等内容。
最后,在总结和展望部分,我们将对整个实验进行总结,并提出改进方向和未来发展方向。
1.3 目的本文的目的是帮助读者了解如何使用汇编语言编写按键控制LED灯亮灭的程序,通过这一示例项目引导读者熟悉汇编语言的基础知识,并培养其分析和解决问题的能力。
通过实验过程,读者可以了解硬件准备工作、程序设计思路以及测试调试过程,并能够根据实际需求进行结果分析和优化方案的提出。
此外,本文还展望了未来发展方向,希望读者能够在此基础上进一步探索和应用汇编语言的相关知识。
以上是文章“1. 引言”部分的内容,旨在概述本文的背景、结构和目的。
如果需要更加详细的内容,请继续阅读后续章节。
2. 汇编按键控制LED灯亮灭编写程序:2.1 完成硬件准备工作:在开始编写汇编程序之前,首先需要进行硬件准备工作。
我们将使用一个单片机来控制LED灯的亮灭,并通过按键来触发控制操作。
为此,我们需要将LED与单片机的输出引脚连接,并将按键与单片机的输入引脚连接。
确保电路连接正确无误后,我们可以开始进行程序设计。
2.2 程序设计思路:在本部分中,我们将介绍如何使用汇编语言设计一个按键控制LED灯亮灭的程序。
该程序的基本原理是通过检测按键状态来改变LED的亮度状态,即当按键被按下时,LED亮起;当按键未被按下时,LED熄灭。
继续我的第二个实验;实现按键控制L E D亮灭:
功能描述:
上电默认LD3亮;
触动一次按键SW12,LD3灭
再按一次按键SW12,LD3亮
再触动一次按键SW12,LD3灭
再按一次按键SW12,LD3亮。
实现每触动一次按键,LED执行一次由亮到灭,或者由灭到亮,也就是实现一次状态反转。
电路连接说明:
LD3设置为通用GPIO上拉输出初始化后默认为输出LD3亮状态;LD3控制LED灯的负极,如下图;
SW12 设置为通用GPIO上拉输入该引脚应用滤波功能,且仅在按键抬起时控制LD3状态发生变化。
按键电路如上图,GPIO53须输出0,当按键按下时,读取GPIO50端口值,为0,当按键未按下时,GPIO50因为上上拉作用,其端口值为1。
程序设计说明:
按键的读取采用实时扫描的方式(非中断方式),功能要求在按键抬起后发生LED状态翻转;所以要记录上一次按键值,并且将当前值==0&&上一次值==1时,做为按键抬起有效,控制LED发生状态翻转。
主要程序如下:
while(1)
{
EALLOW;
last_Key_SW12=new_Key_SW12;//保存旧值
new_Key_SW12=Key_SW12();//读取新值
if(last_Key_SW12==0&&new_Key_SW12==1)
LD3_TOGGLE();
EDIS;
}
经实际测试,上述程序可以实现LD3的翻转,基本达到设计要求。
但是在测试过程中,时好时坏,有时能够看见LED快速翻转,说明按键有抖动的情况,这里可以考虑IO口滤波,即在初始化时,设置IO采样周期以及量化串口,设置如下:采样周期设置为200时,不再出现抖动现象,按键稳定操作。
源程序如下:
#include"DSP2833x_Device.h"//DSP2833xHeaderfileIncludeFile
#include"DSP2833x_Examples.h"//DSP2833xExamplesIncludeFile
#define LD3_ON() =1
#define LD3_OFF() =1
#define LD3_TOGGLE() =1
#define LD4_ON() =1
#define LD4_OFF() =1
#define Key_SW12() 50
/*
*main.c
*/
int main(void){
unsignedchar last_Key_SW12=1;//保留上一次扫描结果,上电默认为未按下状态
unsignedchar new_Key_SW12=1;//保留当前扫描结果,上电默认为未按下状态
InitSysCtrl();
DINT;
IER=0x0000;
IFR=0x0000;
InitPieCtrl();
InitPieVectTable();
InitGpio();
EALLOW;
//GPIO0LD3控制LED负极
GpioCtrlRegs.GPAMUX1.bit.GPIO0=0;//0gpiomode
GpioCtrlRegs.GPADIR.bit.GPIO0=1;//1output0input
GpioCtrlRegs.GPAPUD.bit.GPIO0=0;//1enablepullup0disablepullup
//GPIO34LD4控制LED负极
GpioCtrlRegs.GPBMUX1.bit.GPIO34=0;//0gpiomode
GpioCtrlRegs.GPBDIR.bit.GPIO34=1;//1output0input
GpioCtrlRegs.GPBPUD.bit.GPIO34=0;//1enablepullup0disablepullup
//GPIO50按键矩阵SW12输入端
GpioCtrlRegs.GPBMUX2.bit.GPIO50=0;//0gpiomode
GpioCtrlRegs.GPBDIR.bit.GPIO50=0;//1output0input
GpioCtrlRegs.GPBPUD.bit.GPIO50=0;//1enablepullup0disablepullup GpioCtrlRegs.GPBCTRL.bit.QUALPRD2=200;//采样周期=2*Tsysclkout*200 GpioCtrlRegs.GPBQSEL2.bit.GPIO50=2;//采样窗内3次采样结构相同
//GPIO53按键矩阵负极输出0
GpioCtrlRegs.GPBMUX2.bit.GPIO53=0;//0gpiomode
GpioCtrlRegs.GPBDIR.bit.GPIO53=1;//1output0input
GpioCtrlRegs.GPBPUD.bit.GPIO53=0;//1enablepullup0disablepullup GpioDataRegs.GPBCLEAR.bit.GPIO53=1;
LD3_ON();//默认输出亮状态
LD4_OFF();
EDIS;
while(1)
{
EALLOW;
last_Key_SW12=new_Key_SW12;//保存旧值
new_Key_SW12=Key_SW12();//读取新值
if(last_Key_SW12==0&&new_Key_SW12==1)
LD3_TOGGLE();
EDIS;
}
}。