DSP技术课程设计.docx
《DSP技术课程设计.docx》由会员分享,可在线阅读,更多相关《DSP技术课程设计.docx(19页珍藏版)》请在冰豆网上搜索。
DSP技术课程设计
DSP技术课程设计
计算机与信息工程学院2012级通信31班xxx2xx3
指导教师xxx教师
摘要本文提供了DSP应用技术设计思路,主要应用CCS软件实现各个模块之间的相互连接,使用C语言和汇编语言编程在CCS中实现软件仿真,在CCS中进行硬件仿真并通过试验箱实现
关键词CCS编译环境;C语言;硬件仿真;
1.设计任务和要求
使用DSP试验箱的流水灯模块、键盘模块以及显示模块相连接并在CCS集成开发环境中使用图形显示工具显示输入和输出波形。
2.工作原理
由键盘模块控制流水灯模块,在按键的同时调用显示模块。
键盘模块:
在运行键盘模块的程序中,程序首先判断是否有按键,若没有将进入等待按键的状态,如有便通过扫描函数来确定被按下键的具体地址,然后将其地址值返回。
流水灯模块:
有8个流水灯,使用的是二进制数的代码,通过二进制数的代码控制流水灯的状态。
显示模块:
用PCtoLCD2002软件,勾画出想出现的文字、字体以及形状,然后将其导入显示模块的程序。
3设计步骤和方法
先定义一个变量将键盘的返回值存起来,通过这个值来控制流水灯的循环,流水灯的设计采用八条赋值语句和八条延时语句来实现,由于延时语句是汇编语言而键盘模块以及显示模块用的都为C语言,所以要注意汇编与C语言之间的转换。
用五种不同的八条赋值语句和八条相同的延时语句设计出5中不同的花型。
将显示模块与键盘模块连接起来,在按键模块确定具体被按下键的地址的部分调用显示的语句,即之前设计好的字体和形状,在显示的语句中同时也要定义一个变量i实现每次执行显示语句的时候是字体或形状在显示屏上可以动起来。
4,程序代码
#include
/*-------------------------------------*/
voidWr_c_l(charcom);
voidWr_c_r(charcom);
voidWr_d_l(chardata);
voidWr_d_r(chardata);
voidInit_Lcd();
voidCls_Lcd();
voidlcd_dsp(charlorr,charpage_cnt,charline,charnumx[]);
chartemp,clr_page_cnt,clr_byte_cnt,page_cnt,colm_cnt;
/*DSP的IO空间,扩展发光二极管、键盘、液晶等外围设备*/
ioportunsignedport0800;//lcddataio
ioportunsignedport1000;//lcdreset
ioportunsignedport0c00;//lcddi
ioportunsignedport1400;//lcdcs1
ioportunsignedport1800;//lcdcs2
//对端口的定义
ioportunsignedport2C00;//faguang
charpast=254;
charkeyvalue1;
inti=0;/*ToDecideTheAICSampleFrequency*/
/*-------------------------------------*/
/*DSP的IO空间,扩展发光二极管、数码管、键盘、液晶等外围设备*/
ioportunsignedport1C00;//键盘行列线
/*-------------------------------------*/
charnum26[]={0,0x7F,0x49,0x49,0x49,0x49,0x00,0x00};//"E"=26H
charnum2d[]={0,0x7F,0x40,0x40,0x40,0x40,0x00,0x00};//"L"=2DH
charnum30[]={0,0x3E,0x41,0x41,0x41,0x3E,0x00,0x00};//"O"=30H
charnum37[]={0,0x1F,0x20,0x40,0x20,0x1F,0x00,0x00};//"V"=37H
charnum10[]={0,0x32,0x49,0x79,0x41,0x3E,0x00,0x00};//"@"=10H
charnum0[]={0,0x3E,0x51,0x49,0x45,0x3E,0x00,0x00};//"0"=00H
charnum1[]={0,0x00,0x42,0x7F,0x40,0x00,0x00,0x00};//"1"=01H
charnum2[]={0,0x42,0x61,0x51,0x49,0x46,0x00,0x00};//"2"=02H
charnum3[]={0,0x21,0x41,0x45,0x4B,0x31,0x00,0x00};//"3"=03H
charnum4[]={0,0x18,0x14,0x12,0x7F,0x10,0x00,0x00};//"4"=04H
charnum5[]={0,0x27,0x45,0x45,0x45,0x39,0x00,0x00};//"5"=05H
charnum6[]={0,0x3C,0x4A,0x49,0x49,0x30,0x00,0x00};//"6"=06H
charnuml1[]={0x44,0x44,0xFC,0x44,0x44,0x10,0xD0,0xFF};
charnuml2[]={0x90,0x00,0xD0,0xFF,0xD0,0x10,0x10,0x00};
charnuml3[]={0x08,0x08,0x07,0x14,0x08,0x06,0x01,0xFF};
charnuml4[]={0x04,0x03,0x00,0xFF,0x01,0x0E,0x08,0x00};
charnumj1[]={0x00,0x08,0x08,0x08,0x88,0x48,0x38,0xFF};
charnumj2[]={0x18,0x28,0x48,0x88,0x88,0x08,0x00,0x00};
charnumj3[]={0x40,0x32,0x02,0x01,0x10,0x60,0x00,0x07};
charnumj4[]={0x10,0x60,0x00,0x00,0x11,0x63,0x01,0x00};
//所需要的汉字、数字和字符的显示代码
charrdkey();
charscan_key();
voidmmm();
voidmain()
{
charkeyvalue=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;
loop0();
port2C00=0x7f;
loop0();
i=i+1;
mmm();
i=0;
}
elseif(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;
}
elseif(past==2)
{
port2C00=0xe7;
loop0();
port2C00=0xdb;
loop0();
port2C00=0xbd;
loop0();
port2C00=0x7e;
loop0();
port2C00=0xbd;
loop0();
port2C00=0xdb;
loop0();
port2C00=0xe7;
loop0();
port2C00=0xff;
loop0();
}
elseif(past==3)
{
port2C00=0x7e;
loop0();
port2C00=0x3c;
loop0();
port2C00=0x18;
loop0();
port2C00=0x00;
loop0();
port2C00=0x18;
loop0();
port2C00=0x3c;
loop0();
port2C00=0x7e;
loop0();
port2C00=0xff;
loop0();
}
elseif(past==4)
{
port2C00=0xaa;
loop0();
port2C00=0x55;
loop0();
}
}
}
//循环和流水灯花样的控制
charrdkey(){
charkeyin;
port1C00=0x0;
keyin=port1C00;
keyin=keyin&0xF;
if(keyin==0xF)
return0;
else
return1;
}
charscan_key(){
charkeyornot;
intkeyin;
intkeyvalue;
keyornot=rdkey();
if(!
keyornot){
return255;
}
delay3();
keyornot=rdkey();
if(keyornot){//某个键按下!
port1C00=0xe;
keyin=port1C00&0xF;
if(keyin!
=0xF){
keyvalue=0;
keyin=keyin;
keyvalue=keyin+keyvalue-7;
while(keyornot=rdkey())//等键松下
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();
}
port1C00=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);
gotoproecess;
}
if(keyvalue==0x6){
keyvalue=1;
lcd_dsp(0,8,1,num2);//调用显示语句,显示数字
gotoproecess;
}
if(keyvalue==0x4){
keyvalue=2;
lcd_dsp(0,8,1,num3);//调用显示语句,显示数字
gotoproecess;
}
if(keyvalue==0x0){
keyvalue=3;
lcd_dsp(0,8,1,num4);//调用显示语句,显示数字
gotoproecess;
}
if(keyvalue==0xf){
keyvalue=4;
lcd_dsp(0,8,1,num5);//调用显示语句,显示数字
gotoproecess;
}
if(keyvalue==0xe){
keyvalue=5;
lcd_dsp(0,8,1,num6);//调用显示语句,显示数字
gotoproecess;
}
if(keyvalue==0xc){
keyvalue=6;
gotoproecess;
}
if(keyvalue==0x8){
keyvalue=7;
gotoproecess;
}
if(keyvalue==0x17){
keyvalue=8;
gotoproecess;
}
if(keyvalue==0x16){
keyvalue=9;
gotoproecess;
}
if(keyvalue==0x14){
keyvalue=10;
gotoproecess;
}
if(keyvalue==0x10){
keyvalue=11;
gotoproecess;
}
if(keyvalue==0x1f){
keyvalue=12;
gotoproecess;
}
if(keyvalue==0x1e){
keyvalue=13;
gotoproecess;
}
if(keyvalue==0x1c){
keyvalue=14;
gotoproecess;
}
if(keyvalue==0x18){
keyvalue=15;
gotoproecess;
}
proecess:
returnkeyvalue;
}
return255;
}
voidmmm()
{
temp=port1000;///RES=0,resetlcd
delay2();
port1000=temp;///RES=1,enablelcd
Init_Lcd();//initializelcd
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);//使每次显示的文字的位置发生变化达到动起来的效果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,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,numj2);
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();
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,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);
}
voidlcd_dsp(charlorr,charpage_cnt,charline,charnumx[]){//写入一个8*8的字符
charclr_byte_cnt;
page_cnt=(page_cnt-1)|0xb8;//设置页号
line=(line-1)*8+0x40;//改字符的起始列
if(lorr==0){//写-l块(左半屏)
Wr_c_l(page_cnt);
Wr_c_l(line);
for(clr_byte_cnt=1;clr_byte_cnt<=8;clr_byte_cnt++){//将numx[]写入
Wr_d_l(numx[clr_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(numx[clr_byte_cnt-1]);
}
}
}
voidWr_c_r(charcom){//向块1写指令(右半屏)
chartemp;
temp=port1400;//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();
}
voidWr_c_l(charcom){//向块2写指令(左半屏)
//chartemp;
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