1、DSP课程设计精基于TMS320LF2407按键计数器设计一说明在控制电路中,通常需要以按键来控制程序执行流程或是输入数据。在图4.1中,4个按键K1K4分别对应TMS320LF2407芯片的引脚IOPF3IOPF4作为I/O端口的输入,8只发光二极管LED1I LED8通过SW-DIP8拨码开关和74HC273锁存器芯片分别对应TMS320LF2407芯片的引脚IOPF0IOPF7作为I/O端口的输出。本设计仅使用一条I/O引脚,借助软件查询方法点亮8只发光二极管。本设计中的K1键对应的TMS320LF2407输入I/O引脚为IOPF3,当按下K1键,则将所对应的端口F数据和方向控制寄存器(
2、PFDATDIR)的第3位为(IOPF3引脚)0,同时点亮发光二极管。二内容1设计并调试用于TMS320LF2407芯片的计数程序,要求由按键K1作输入并对其进行计数,计数的结果由LED7LED0发光二极管以二进制方式显示。2对程序稍作改动,用K4按键完成上述功能。三硬件电路图4.1 TMS320LF2407与键盘、LED接口电路四参考程序清单通过编程,设计一个按键计数器,要求刚接通电源时,8只发光二极管都不亮,表示计数器的初始值为0,即二进制数的00000000B;当按下K1键时,计数器的值加1,发光二极管LED0点亮,表示二进制数的00000001B,然后松开按键;再次按下K1键时,计数器
3、的值又加1,发光二极管LED1点亮,表示二进制数的00000010B,然后再松开按键;依次类推。直到按动了255次按键时,发光二极管LED7LED0会全部点亮,其后的一次K1键按下时将使计数器回0,就这样循环往复。C语言程序(1) 所需的复位和中断向量定义文件“vectors.asm”同于前。在这以后的所有例程中,如果没有特别说明,vectors.asm都是相同的。(2 主程序源程序代码:#include register.hint m=0x0001; initial(asm( setc SXM;asm( clrc OVM;asm( clrc CNF;*SCSR1=0x81FE;*WDCR=0
4、x0E8;*IMR=0x0000;*IFR=0x0FFFF;*MCRA=*MCRA&0x0FF;*PFDATDIR=*PFDATDIR|0x0400;*PBDATDIR=*PBDATDIR|0x0FF00;*PFDATDIR=*PFDATDIR|0x0404;*PFDATDIR=*PFDATDIR&0xFFFB;void inline disable( asm( setc INTM;int keyscan( int k,j;k=*PFDATDIR&0x0008; if(k=0x0008 k=0;elsek=1;if(k=1for(j=30000;j0;j-j=j;k=*PFDATDIR&0x0
5、008; if(k=0x0008 k=0;elsek=1;return(k;int keyserve(int k;k=*PFDATDIR&0x0008; if(k=0x0000*PBDATDIR=(*PBDATDIR&0xFF00+m+;else*PBDATDIR=*PBDATDIR;*PFDATDIR=*PFDATDIR|0x0404;*PFDATDIR=*PFDATDIR&0xFFFB; main(disable(;initial(;while(1int i;i=0;i=keyscan(;if(i=1keyserve(;void interrupt nothing(return;汇编程序;
6、键盘与发光二极管配合使用程序st0_temp .usect .b20,1 ;60st1_temp .usect .b20,1 ;61context .usect .b20,7 ;62-68STACK .usect .stack,40IOSFT_REG .usect .data0,1 ;显示数据移位寄存器IO_COUNT .usect .data0,1 ;延时计数寄存器IO_DATA .usect .data0,1 ;I/O临时数据缓冲区LEDXS .usect .data0,1 ;LED显示的数据 LEDFLAG .usect .data0,1 ;LED显示标志寄存器K1FLAG .usect
7、 .data0,1 ;K1 标志寄存器KEYDATA .usect .data0,1 ;读得键盘值存放寄存器DP_USER .set 5.include F2407REGS.H ;引用头部文件.def _c_int0; ;(1)建立中断向量表.sect .vectors ;定义主向量段RSVECT B _c_int0 ;PM 0 Reset Vector 1INT1 B PHANTOM ;PM 2 Int level 1 4INT2 B GISR2 ;PM 4 Int level 2 5INT3 B PHANTOM ;PM 6 Int level 3 6INT4 B PHANTOM ;PM 8
8、 Int level 4 7INT5 B PHANTOM ;PM A Int level 5 8INT6 B PHANTOM ;PM C Int level 6 9RESERVED B PHANTOM ;PM E (Analysis Int 10SW_INT8 B PHANTOM ;PM 10 User S/W int SW_INT9 B PHANTOM ; PM 12 User S/W int -SW_INT10 B PHANTOM ; PM 14 User S/W int -SW_INT11 B PHANTOM ; PM 16 User S/W int -SW_INT12 B PHANTO
9、M ; PM 18 User S/W int -SW_INT13 B PHANTOM ; PM 1A User S/W int -SW_INT14 B PHANTOM ; PM 1C User S/W int -SW_INT15 B PHANTOM ; PM 1E User S/W int -SW_INT16 B PHANTOM ; PM 20 User S/W int -TRAP B PHANTOM ; PM 22 Trap vector -NMI B PHANTOM ; PM 24 Non maskable Int3EMU_TRAP B PHANTOM ; PM 26 Emulator T
10、rap2SW_INT20 B PHANTOM ; PM 28 User S/W int -SW_INT21 B PHANTOM ; PM 2A User S/W int -SW_INT22 B PHANTOM ; PM 2C User S/W int -SW_INT23 B PHANTOM ; PM 2E User S/W int -SW_INT24 B PHANTOM ; PM 30 User S/W int -SW_INT25 B PHANTOM ; PM 32 User S/W int -SW_INT26 B PHANTOM ; PM 34 User S/W int -SW_INT27
11、B PHANTOM ; PM 36 User S/W int -SW_INT28 B PHANTOM ; PM 38 User S/W int -SW_INT29 B PHANTOM ; PM 3A User S/W int -SW_INT30 B PHANTOM ; PM 3C User S/W int -SW_INT31 B PHANTOM ;PM 3E User S/W int ;中断子向量入口定义pvecs.sect .pvecs ;定义子向量段PVECTORS B PHANTOM ;保留向量地址偏移量-0000h B PHANTOM ;保留向量地址偏移量-0001hB PHANTOM
12、 ; 保留向量地址偏移量B PHANTOM ; 保留向量地址偏移量 B PHANTOM ; 保留向量地址偏移量B PHANTOM ; 保留向量地址偏移量B PHANTOM ; 保留向量地址偏移量-05B PHANTOM ; SCI_RX_ISR; 保留向量地址偏移量B PHANTOM ; SCI_TX_ISR ; 保留向量地址偏移量B PHANTOM ; 保留向量地址偏移量B PHANTOM ; 保留向量地址偏移量B PHANTOM ; 保留向量地址偏移量-0A B PHANTOM ; 保留向量地址偏移量B PHANTOM ; 保留向量地址偏移量 B PHANTOM ; 保留向量地址偏移量B
13、PHANTOM ; 保留向量地址偏移量B PHANTOM ; 保留向量地址偏移量 B PHANTOM ; 保留向量地址偏移量-10B PHANTOM ; 保留向量地址偏移量B PHANTOM ; 保留向量地址偏移量B PHANTOM ; 保留向量地址偏移量B PHANTOM ; 保留向量地址偏移量B PHANTOM ; 保留向量地址偏移量-15B PHANTOM ; 保留向量地址偏移量B PHANTOM ; 保留向量地址偏移量B PHANTOM ; 保留向量地址偏移量B PHANTOM ; 保留向量地址偏移量 B PHANTOM ; 保留向量地址偏移量-1AB PHANTOM ; 保留向量地址
14、偏移量B PHANTOM ; 保留向量地址偏移量 B PHANTOM ; 保留向量地址偏移量B PHANTOM ; 保留向量地址偏移量B PHANTOM ; 保留向量地址偏移量B PHANTOM ; 保留向量地址偏移量-20B PHANTOM ; 保留向量地址偏移量B PHANTOM ; 保留向量地址偏移量B PHANTOM ; 保留向量地址偏移量B PHANTOM ; 保留向量地址偏移量B PHANTOM ; 保留向量地址偏移量-25B PHANTOM ; 保留向量地址偏移量-0026hB T1GP_ISR ; 保留向量地址偏移量-0027h T1PINT中断B PHANTOM ; 保留向量
15、地址偏移量-0028hB PHANTOM ; 保留向量地址偏移量 B PHANTOM ; 保留向量地址偏移量-2AB PHANTOM ; 保留向量地址偏移量B PHANTOM ; 保留向量地址偏移量B PHANTOM ; 保留向量地址偏移量B PHANTOM ; 保留向量地址偏移量B PHANTOM ; pvector addr offset 0x02f - T3PINTB PHANTOM ; 保留向量地址偏移量-30B PHANTOM ; 保留向量地址偏移量B PHANTOM ; 保留向量地址偏移量B PHANTOM ; 保留向量地址偏移量B PHANTOM ; 保留向量地址偏移量B PHA
16、NTOM ; 保留向量地址偏移量-35B PHANTOM ; 保留向量地址偏移量B PHANTOM ; 保留向量地址偏移量B PHANTOM ; 保留向量地址偏移量B PHANTOM ; 保留向量地址偏移量B PHANTOM ; 保留向量地址偏移量-3AB PHANTOM ; 保留向量地址偏移量B PHANTOM ; 保留向量地址偏移量B PHANTOM ; 保留向量地址偏移量B PHANTOM ; 保留向量地址偏移量B PHANTOM ; 保留向量地址偏移量-3FB PHANTOM ; CANMBX_ISR ; 保留向量地址偏移量B PHANTOM ;保留向量地址偏移量-0041h ; ;(
17、2)主程序.text_c_int0 CALL SYSINIT ;调系统初始化程序CALL KEYLEDINIT ;调键盘和LED初始化程序LDP #DP_USER ;指向0280h0300h区SPLK #01H,IOSFT_REG ;寄存器和标志初始化SPLK #00H,IO_COUNTSPLK #001H,IO_DATASPLK #001H,LEDXSSPLK #00H,LEDFLAG ;LEDFLAG.0=1表示 K1,K2,K3 按下;LEDFLAG.0=0表示 K4 按下SPLK #01H,K1FLAGCLRC INTM ;开总中断LOOP: CALL KEY ;调键盘程序,即扫描键盘
18、LDP #DP_USERBIT LEDFLAG,15BCND LEDBD1,TCLACL IO_COUNTSUB #03E8HBCND WAIT,LEQ ;判10 s延时到否LEDBD1: SPLK #00H,IO_COUNTLDP #DP_PF2LACL PFDATDIROR #0404H ;IOPF2=1SACL PFDATDIR ;开74HC273片选信号LDP #DP_USERLACL LEDXSOR #0FF00H ;IOPB口为输出方式LDP #DP_PF2SACL PBDATDIR ;送要显示的数据到IOPB口LACL PFDATDIRAND #0FFFBH ;IOPF2=0SA
19、CL PFDATDIR ;关74HC273片选信号LDP #DP_USERBIT LEDFLAG,15BCND LEDBD2,TCLACL LEDXSSFLSACL LEDXSLACL IOSFT_REGSFLSACL IOSFT_REGBIT IOSFT_REG,BIT8 ;判是否循环完一次BCND LOOP1,TCB WAITLOOP1: LDP #DP_USERSPLK #01H,IOSFT_REG ;赋初值LEDBD2: LACL IO_DATASACL LEDXSWAIT: NOPB LOOP ; ;(3)系统初始化程序SYSINIT:SETC INTMCLRC SXMCLRC OV
20、MCLRC CNF ;B0区被配置为数据空间LDP #0E0H ;指向7000h7080h区SPLK #81FEH,SCSR1 ;时钟4倍频,CLKIN=6 M,CLKOUT=24 MSPLK #0E8H,WDCR ;不使能WDTLDP #0SPLK #02H,IMR ;使能中断优先级INT2SPLK #0FFFFh,IFR ;清中断标志LDP #DP_EVA ;指向7400h7480h区SPLK #80H,EVAIMRA ;使能T1PINT 中断SPLK #0FFFFh,EVAIFRA ;清EVA中断标志SPLK #0,GPTCONASPLK #0EA6H,T1PR ;使定时器每10 ms产
21、生一次中断SPLK #0,T1CNTSPLK #0164CH,T1CON ;设置通用定时器1RET; ;(4)键盘和发光二极管初始化程序KEYLEDINIT:LDP #DP_PF2LACL MCRCAND #083FFH ;IOPF2,IOPF36 配置为一般的I/O口SACL MCRCLACL MCRAAND #000FFH ;IOPB07 配置为一般的I/O口SACL MCRALACL PFDATDIROR #0400H ;IOPF2为输出方式AND #08787H ;IOPF36 为输入方式SACL PFDATDIRLACL PBDATDIROR #0FF00H ;IOPB07 为输出方
22、式SACL PBDATDIRRET; ;(5)键盘程序KEY:CALL READKEY ;调读键程序LACL KEYDATABCND KEYRET,EQ ;ACC=0?CALL KEYDELAY 材料:玉米粒50克, 胡萝卜30克, 生菜30克, 鸡蛋3个,面粉100克椒粉各少许;做法:1. 先将鸡蛋打散成蛋液,加入少许胡椒粉拌匀,胡萝卜洗净切沥干切碎,葱切花;2. 将胡萝卜粒和玉米粒放入沸水中煮熟后沥干待用;3. 面粉中加入适量的盐,再倒入鸡蛋液,加入适量的水搅拌成4. 放入沥干的胡萝卜粒和玉米粒、生菜、葱花,再加入少许芝; 再一次读键值 LACL KEYDATABCND KEYRET,EQ
23、LDP #DP_USER ;判断按键情况BIT KEYDATA,15 BCND KEYRET,NTC CALL K1 ; +键按下B KEYRETKEYRET: LACL KEYDATAAND #0FFF0H ;清读取的键值寄存器SACL KEYDATARET; ;(6)读键子程序READKEY:LDP #DP_PF2LACL PFDATDIR ;取出键值PFDATDIR.3PFDATDIR.6RPT #2SFR ;右移3位OR #0FFF0H ;屏蔽高4位(用到4个键)CMPLLDP #DP_USERSACL KEYDATA ;存放键值RET ; ;(7)用软件延时30mS消抖动KEYDEL
24、AY: LACC #6000KEYD1: SUB #1RPT #80NOPBCND KEYD1,NEQRET; ;(8)键子程序K1: ;+键子程序READK1: CALL KEYDELAYCALL READKEYLDP #DP_USER ;判断按键 K1 是否松开BIT KEYDATA,15BCND READK1,TCSPLK #01,LEDFLAG ;关闭LED左移标志,即LED对同一个数不刷新LACL IO_DATAADD #1SACL IO_DATARET; ;(9)中断程序GISR2: ;优先级INT2中断人口; 保护现场 LDP #0 ; 保存机器上下文SST #0, st0_te
25、mp ; 使用自动寻址DP-0 SST #1, st1_temp ; 保存状态寄存器到B2 DARAM.SACL context ; 保存ACC的低16位SACH context+1 ; 保存ACC的高16位SAR AR1,context+2SAR AR2,context+3SAR AR3,context+4SAR AR4,context+5 SAR AR5,context+6LDP #0E0HLACC PIVR,1 ;读取外设中断向量寄存器(PIVR),并左移一位ADD #PVECTORS ;加上外设中断入口地址BACC ;跳到相应的中断服务子程序T1GP_ISR: ;通用定时器1中断入口L
26、DP #DP_USERLACL IO_COUNTADD #1SACL IO_COUNT;恢复现场 LDP #DP_EVASPLK #0FFFFH,EVAIFRALDP #0LAR AR5,context+6 LAR AR4,context+5 LAR AR3,context+4 LAR AR2,context+3 LAR AR1,context+2LACC context+1,16ADDS contextLST #1, st1_tempLST #0, st0_tempCLRC INTM ;开总中断,因为一进中断就自动关闭总中断RET; ;(10)假中断程序PHANTOM KICK_DOG ;复位看门狗RETEND
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1