1、DSP技术课程设计DSP技术课程设计计算机与信息工程学院 2012级 通信31班 xxx2xx3指导教师 xxx 教师 摘要 本文提供了DSP应用技术设计思路,主要应用CCS软件实现各个模块之间的相互连接,使用C语言和汇编语言编程在CCS中实现软件仿真,在CCS中进行硬件仿真并通过试验箱实现关键词 CCS编译环境;C语言;硬件仿真;1. 设计任务和要求 使用DSP试验箱的流水灯模块、键盘模块以及显示模块相连接并在CCS集成开发环境中使用图形显示工具显示输入和输出波形。 2. 工作原理由键盘模块控制流水灯模块,在按键的同时调用显示模块。键盘模块:在运行键盘模块的程序中,程序首先判断是否有按键,若
2、没有将进入等待按键的状态,如有便通过扫描函数来确定被按下键的具体地址,然后将其地址值返回。流水灯模块:有8个流水灯,使用的是二进制数的代码,通过二进制数的代码控制流水灯的状态。显示模块:用PCtoLCD2002软件,勾画出想出现的文字、字体以及形状,然后将其导入显示模块的程序。3设计步骤和方法 先定义一个变量将键盘的返回值存起来,通过这个值来控制流水灯的循环,流水灯的设计采用八条赋值语句和八条延时语句来实现,由于延时语句是汇编语言而键盘模块以及显示模块用的都为C语言,所以要注意汇编与C语言之间的转换。用五种不同的八条赋值语句和八条相同的延时语句设计出5中不同的花型。将显示模块与键盘模块连接起来
3、,在按键模块确定具体被按下键的地址的部分调用显示的语句,即之前设计好的字体和形状,在显示的语句中同时也要定义一个变量i实现每次执行显示语句的时候是字体或形状在显示屏上可以动起来。4, 程序代码#include /*-*/void Wr_c_l(char com);void Wr_c_r(char com);void Wr_d_l(char data);void Wr_d_r(char data);void Init_Lcd();void Cls_Lcd();void lcd_dsp(char lorr,char page_cnt,char line,char numx);char temp,c
4、lr_page_cnt,clr_byte_cnt,page_cnt,colm_cnt;/*DSP的IO空间,扩展发光二极管、键盘、液晶等外围设备*/ioport unsigned port0800;/lcd dataioioport unsigned port1000;/lcd resetioport unsigned port0c00;/lcd diioport unsigned port1400;/lcd cs1ioport unsigned port1800;/lcd cs2/对端口的定义ioport unsigned port2C00;/faguangchar past=254;cha
5、r keyvalue1; int i=0; /*To Decide The AIC Sample Frequency*/*-*/*DSP的IO空间,扩展发光二极管、数码管、键盘、液晶等外围设备*/ioport unsigned port1C00;/键盘行列线/*-*/char num26=0,0x7F,0x49,0x49,0x49,0x49,0x00,0x00;/E=26Hchar num2d=0,0x7F,0x40,0x40,0x40,0x40,0x00,0x00;/L=2DHchar num30=0,0x3E,0x41,0x41,0x41,0x3E,0x00,0x00;/O=30Hchar
6、 num37=0,0x1F,0x20,0x40,0x20,0x1F,0x00,0x00;/V=37Hchar num10=0,0x32,0x49,0x79,0x41,0x3E,0x00,0x00;/=10Hchar num0 =0,0x3E,0x51,0x49,0x45,0x3E,0x00,0x00;/0=00Hchar num1 =0,0x00,0x42,0x7F,0x40,0x00,0x00,0x00;/1=01Hchar num2 =0,0x42,0x61,0x51,0x49,0x46,0x00,0x00;/2=02Hchar num3 =0,0x21,0x41,0x45,0x4B,0x
7、31,0x00,0x00;/3=03Hchar num4 =0,0x18,0x14,0x12,0x7F,0x10,0x00,0x00;/4=04Hchar num5 =0,0x27,0x45,0x45,0x45,0x39,0x00,0x00;/5=05Hchar num6 =0,0x3C,0x4A,0x49,0x49,0x30,0x00,0x00;/6=06Hchar numl1=0x44,0x44,0xFC,0x44,0x44,0x10,0xD0,0xFF;char numl2=0x90,0x00,0xD0,0xFF,0xD0,0x10,0x10,0x00;char numl3=0x08,0
8、x08,0x07,0x14,0x08,0x06,0x01,0xFF;char numl4=0x04,0x03,0x00,0xFF,0x01,0x0E,0x08,0x00;char numj1=0x00,0x08,0x08,0x08,0x88,0x48,0x38,0xFF;char numj2=0x18,0x28,0x48,0x88,0x88,0x08,0x00,0x00;char numj3=0x40,0x32,0x02,0x01,0x10,0x60,0x00,0x07;char numj4=0x10,0x60,0x00,0x00,0x11,0x63,0x01,0x00;/所需要的汉字、数字和
9、字符的显示代码char rdkey() ;char scan_key();void mmm();void main() char keyvalue = 255;c54_init(); for (;) keyvalue = scan_key(); if(keyvalue!=255) past=keyvalue; if(past=0) port2C00=0xfd; loop0(); port2C00=0xfb; loop0(); port2C00=0xf7; loop0(); port2C00=0xef; loop0(); port2C00=0xdf; loop0(); port2C00=0xbf
10、; loop0(); port2C00=0x7f; loop0(); i=i+1; mmm(); i=0; else if(past=1) port2C00=0x7f; loop0(); port2C00=0xbf; loop0(); port2C00=0xdf; loop0(); port2C00=0xef; loop0(); port2C00=0xf7; loop0(); port2C00=0xfb; loop0(); port2C00=0xfd; loop0(); port2C00=0xfe; loop0(); i=i+1; mmm(); i=0; else if(past=2) por
11、t2C00=0xe7; loop0(); port2C00=0xdb; loop0(); port2C00=0xbd; loop0(); port2C00=0x7e; loop0(); port2C00=0xbd; loop0(); port2C00=0xdb; loop0(); port2C00=0xe7; loop0(); port2C00=0xff; loop0(); else if(past=3) port2C00=0x7e; loop0(); port2C00=0x3c; loop0(); port2C00=0x18; loop0(); port2C00=0x00; loop0();
12、 port2C00=0x18; loop0(); port2C00=0x3c; loop0(); port2C00=0x7e; loop0(); port2C00=0xff; loop0(); else if(past=4) port2C00=0xaa; loop0(); port2C00=0x55; loop0(); /循环和流水灯花样的控制char rdkey()char keyin; port1C00 = 0x0 ; keyin = port1C00 ; keyin = keyin & 0xF ; if (keyin = 0xF) return 0 ; else return 1 ;ch
13、ar scan_key()char keyornot;int keyin;int keyvalue; keyornot = rdkey() ; if (!keyornot) return 255; delay3(); keyornot = rdkey() ; if (keyornot ) /某个键按下! port1C00 = 0xe ; keyin = port1C00 & 0xF ; if ( keyin != 0xF) keyvalue = 0; keyin = keyin; keyvalue = keyin + keyvalue-7; while (keyornot = rdkey()
14、/等键松下 delay3(); port1C00 = 0xd ; keyin = port1C00 & 0xF ; if ( keyin != 0xF) keyvalue = 1; keyvalue = keyin + keyvalue ; while (keyornot = rdkey() delay3(); port1C00 = 0xb ; keyin = port1C00 & 0xF ; if ( keyin != 0xF) keyvalue = 9; keyvalue = keyin + keyvalue ; while (keyornot = rdkey() delay3(); po
15、rt1C00 = 0x7 ; keyin = port1C00 & 0xF ; keyin = port1C00 & 0xF ; if ( keyin != 0xF) keyvalue = 17; keyvalue = keyin + keyvalue ; while (keyornot = rdkey() delay3(); if (keyvalue=0x7) keyvalue=0; lcd_dsp(0,8,1,num1); goto proecess; if (keyvalue=0x6) keyvalue=1; lcd_dsp(0,8,1,num2); /调用显示语句,显示数字 goto
16、proecess; if (keyvalue=0x4) keyvalue=2; lcd_dsp(0,8,1,num3);/调用显示语句,显示数字 goto proecess; if (keyvalue=0x0) keyvalue=3; lcd_dsp(0,8,1,num4);/调用显示语句,显示数字 goto proecess; if (keyvalue=0xf) keyvalue=4; lcd_dsp(0,8,1,num5);/调用显示语句,显示数字 goto proecess; if (keyvalue=0xe) keyvalue=5; lcd_dsp(0,8,1,num6);/调用显示语
17、句,显示数字 goto proecess; if (keyvalue=0xc) keyvalue=6; goto proecess; if (keyvalue=0x8) keyvalue=7; goto proecess; if (keyvalue=0x17) keyvalue=8; goto proecess; if (keyvalue=0x16) keyvalue=9; goto proecess; if (keyvalue=0x14) keyvalue=10; goto proecess; if (keyvalue=0x10) keyvalue=11; goto proecess; if
18、 (keyvalue=0x1f) keyvalue=12; goto proecess; if (keyvalue=0x1e) keyvalue=13; goto proecess; if (keyvalue=0x1c) keyvalue=14; goto proecess; if (keyvalue=0x18) keyvalue=15; goto proecess; proecess: return keyvalue; return 255;void mmm() temp = port1000 ; / /RES=0,reset lcd delay2(); port1000 = temp ;
19、/ /RES=1,enable lcd Init_Lcd(); /initialize lcd Cls_Lcd(); /清屏 lcd_dsp(0,1,1,numl1); /显示文字的初始位置 lcd_dsp(0,1,2,numl2); lcd_dsp(0,2,1,numl3); lcd_dsp(0,2,2,numl4); lcd_dsp(0,7,1,numj1); lcd_dsp(0,7,2,numj2); lcd_dsp(0,8,1,numj3); lcd_dsp(0,8,2,numj4); delay2(); /延时 Cls_Lcd(); /清屏 lcd_dsp(0,1,1+i,numl1
20、); /使每次显示的文字的位置发生变化达到动起来的效果 lcd_dsp(0,1,2+i,numl2); lcd_dsp(0,2,1+i,numl3); lcd_dsp(0,2,2+i,numl4); lcd_dsp(0,7,i+1,numj1); lcd_dsp(0,7,i+2,numj2); lcd_dsp(0,8,i+1,numj3); lcd_dsp(0,8,i+2,numj4); delay2(); /延时 Cls_Lcd(); /清屏 lcd_dsp(1,1,1,numl1); /(哪半屏,第几页,第几个字,字符数据) lcd_dsp(1,1,2,numl2); lcd_dsp(1,
21、2,1,numl3); lcd_dsp(1,2,2,numl4); lcd_dsp(1,7,1,numj1); lcd_dsp(1,7,2,numj2); lcd_dsp(1,8,1,numj3); lcd_dsp(1,8,2,numj4); delay2(); /延时 Cls_Lcd(); /清屏 lcd_dsp(1,1,1+i,numl1); /在右半屏的初始位置 lcd_dsp(1,1,2+i,numl2); lcd_dsp(1,2,1+i,numl3); lcd_dsp(1,2,2+i,numl4); lcd_dsp(1,7,i+1,numj1); lcd_dsp(1,7,i+2,nu
22、mj2); lcd_dsp(1,8,i+1,numj3); lcd_dsp(1,8,i+2,numj4); delay2(); Cls_Lcd(); /清屏 lcd_dsp(1,1,2+i,numl1); /(哪半屏,第几页,第几个字,字符数据) lcd_dsp(1,1,3+i,numl2); lcd_dsp(1,2,2+i,numl3); lcd_dsp(1,2,3+i,numl4); lcd_dsp(1,7,i+2,numj1); lcd_dsp(1,7,i+3,numj2); lcd_dsp(1,8,i+2,numj3); lcd_dsp(1,8,i+3,numj4); delay2()
23、; Cls_Lcd(); /清屏 lcd_dsp(0,4,1,num2d); / L lcd_dsp(0,4,2,num30); /O lcd_dsp(0,4,3,num37); /V lcd_dsp(0,4,4,num26); /E lcd_dsp(1,4,1,num2d); /? lcd_dsp(1,4,2,num30); lcd_dsp(1,4,3,num37); lcd_dsp(1,4,4,num26); lcd_dsp(0,1,1,numl1); /最终定位不在清屏 lcd_dsp(0,1,2,numl2); lcd_dsp(0,2,1,numl3); lcd_dsp(0,2,2,n
24、uml4); lcd_dsp(1,7,1,numj1); lcd_dsp(1,7,2,numj2); lcd_dsp(1,8,1,numj3); lcd_dsp(1,8,2,numj4); void lcd_dsp(char lorr,char page_cnt,char line,char numx) /写入一个8*8的字符char clr_byte_cnt; page_cnt = (page_cnt - 1) | 0xb8; /设置页号 line = (line-1)*8 + 0x40 ; /改字符的起始列 if (lorr=0) /写-l块(左半屏) Wr_c_l(page_cnt);
25、Wr_c_l(line); for(clr_byte_cnt=1;clr_byte_cnt=8;clr_byte_cnt+) /将numx写入 Wr_d_l(numxclr_byte_cnt-1);/在对应列写入一字节数据 else /写-r块(右半屏) Wr_c_r(page_cnt); Wr_c_r(line); for(clr_byte_cnt=1;clr_byte_cnt=8;clr_byte_cnt+) Wr_d_r(numxclr_byte_cnt-1); void Wr_c_r(char com) /向块1写指令(右半屏)char temp; temp = port1400 ;
26、/ cs1=0 delay1(); port1800 = temp ; / cs2=1,选中块1 delay1(); temp = port0c00 ; / di=0 delay1(); temp = port0800 & 0x80; / E=1,读状态字,判忙 delay1(); while (temp = 0x80) temp = port0800 & 0x80; delay1(); port0800 = com ; /E=1,将com作为指令写入 delay1();void Wr_c_l(char com) /向块2写指令(左半屏)/char temp; port1400 = temp ; / cs1=1 delay1(); temp = port1800 ; / cs2=0,选中块2 delay1(); temp = port0c00 ; / di=0 delay1(); temp = port0800 & 0x80; /读状态字,判忙 delay1(); while (temp = 0x80) temp = port0800 & 0x80; delay1(); port0800 = com ; del
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1