应用AD9850主函数
0赞
发表于 4/24/2012 9:31:34 AM
阅读(20950)
#include#include #include #define uchar unsigned char #define uint unsigned int #define ulong unsigned long uchar b,k=2,l=1; uchar key,f=1; ulong m=1000,n=1,bj=10; ulong a,temp1; float freq; sbit W_CLK = P2^4; sbit FQ_UD = P2^3; sbit RST = P2^2; sbit LCD_RS = P2^7; sbit LCD_RW = P2^6; sbit LCD_EN = P2^5; uchar code str11[ ] = {"now F: HZ"}; uchar code str12[ ] = {"now F: HZ"}; uchar code str13[ ] = {"now F: KHZ"}; uchar code str14[ ] = {"now F: KHZ"}; uchar code str15[ ] = {"now F: KHZ"}; uchar code str16[ ] = {"now F: KHZ"}; uchar code str21[ ] = {"range F: *10 HZ"}; uchar code str22[ ] = {"range F: *100 HZ"}; uchar code str23[ ] = {"range F: *1 KHZ"}; uchar code str24[ ] = {"range F: *10 KHZ"}; uchar code str25[ ] = {"range F: *100KHZ"}; uchar code str26[ ] = {"range F: *1 MHZ"}; uchar code str31[ ] = {"set F: HZ"}; uchar code str32[ ] = {"range F: 0-10MHZ"}; uchar data cdis3[ ] = {0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20}; uchar code cdis4[ ] = {0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20}; uchar data cdis6[ ] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; uchar data display[]= {0x00,0x00,0x00,0x00,0x00,0x00,0x00}; uchar data display1[]= {0x00,0x00,0x00,0x00,0x00,0x00,0x00}; uchar data freqency[]= {0x00,0x00,0x00,0x00}; uchar code key_code[]= { //键编码数组 0xee, 0xed, 0xeb, 0xe7, 0xde, 0xdd, 0xdb, 0xd7, 0xbe, 0xbd, 0xbb, 0xb7, 0x7e, 0x7d, 0x7b, 0x77 }; char code reserve[3]_at_ 0x3b; //保留x3b开始的个字节 /********************************************************* us延时子函数 (4.34us) *********************************************************/ void delayNOP() { _nop_(); _nop_(); _nop_(); _nop_(); } /********************************************************** 键盘扫描子函数 **********************************************************/ void keyscan() { uchar scan1, scan2, keycode, j; P1 = 0xf0; scan1 = P1; if (scan1 != 0xf0) //判键是否按下 { delayms(10); //延时ms scan1 = P1; if (scan1 != 0xf0) //二次判键是否按下 { P1 = 0x0f; scan2 = P1; keycode = scan1 | scan2; //组合成键扫描编码 for (j = 0; j < 16; j++) { if (keycode == key_code[j]) //查表得键值 { key=j; //返回有效键值 } } } } else key=16;//返回无效码 if(key <= 9) { f=0; for(j=6;j>0;j--) display[j]=display[j-1]; display[0]=key; } else if(key==10) { a=display[6]*1000000+display[5]*100000+display[4]*10000+display[3]*1000+display[2]*100+display[1]*10+display[0]; if((a/1000>=1000)&&(a/1000<=9999)) { k=5; n=1000; freqency[3]=display[6]; freqency[2]=display[5]; freqency[1]=display[4]; freqency[0]=display[3]; } if((a/100>=1000)&&(a/100<=9999)) { k=4; n=100; freqency[3]=display[5]; freqency[2]=display[4]; freqency[1]=display[3]; freqency[0]=display[2]; } if((a/10>=1000)&&(a/10<=9999)) { k=3; n=10; freqency[3]=display[4]; freqency[2]=display[3]; freqency[1]=display[2]; freqency[0]=display[1]; } if((a>=1000)&&(a<=9999)) { k=2; n=1; freqency[3]=display[3]; freqency[2]=display[2]; freqency[1]=display[1]; freqency[0]=display[0]; } if((a>=100)&&(a<=999)) {k=1; n=1; freqency[3]=display[3]; freqency[2]=display[2]; freqency[1]=display[1]; freqency[0]=display[0]; } if((a>=10)&&(a<=99)) { k=0; n=1; freqency[3]=display[3]; freqency[2]=display[2]; freqency[1]=display[1]; freqency[0]=display[0]; } m=freqency[3]*1000+freqency[2]*100+freqency[1]*10+freqency[0]; for(j=0;j<7;j++) display[j]=0x00; f=1; } else if(key==11) { b=~b; } else if(key==12) { k=k+1; if(k==6) k=0; if(k==0) { m=10; n=1; } if(k==1) {m=100; n=1; } if(k==2) { m=1000; n=1; } if(k==3) {m=1000; n=10; } if(k==4) { m=1000; n=100; } if(k==5) { m=1000; n=1000; } } else if(key==13) { if(k==0) temp1=10; if(k==1) temp1=100; if(k>=2) temp1=1000; if(m<(temp1*10-bj)) m=m+bj; } else if(key==14) { if(k==0) temp1=10; if(k==1) temp1=100; if(k>=2) temp1=1000; if(m>(temp1/10+bj)) m=m-bj; } else if(key==15) { l++; if(l==4) l=0; if(l==0) bj=1; if(l==1) bj=10; if(l==2) bj=100; if(l==3) bj=1000; } else ; for(j=0;j<7;j++) display1[j]=display[j]+0x30; freq=m*n; } /********************************************************** 显示当前频率 **********************************************************/ void Play_nowfreq() { uchar i; uint temp; temp=m; for (i = 0; i < 3; i++) //数据转换 { freqency[i] = temp%10+0x30; temp = temp / 10; } freqency[3] = temp + 0x30; for (i = 3; i > 0; i--) //高位为"0"不显示 { if (freqency[i] == 0x30) freqency[i] = 0x20; else break; } lcd_pos(1, 8); for (i =3; i !=0xff; i--) { lcd_wdat(freqency[i]); if(k==2) {if(i==3) lcd_wdat('.');} if(k==3) {if(i==2) lcd_wdat('.');} if(k==4) {if(i==1) lcd_wdat('.');} } } /*************************************************************/ /* */ /* 主程序 */ /* */ /*************************************************************/ void main() { uchar i,j; P0 = 0xff; //端口初始化 P1 = 0xff; P2 = 0xff; lcd_init(); //初始化LCD write_str(0x80, str13); //液晶显示字符串 write_str(0xc0, str23); AD9851_RST(); while(1) { keyscan(); if(f) { switch(k) {case 0: { write_str(0x80, str11); //液晶显示字符串 write_str(0xc0, str21);}break; case 1: { write_str(0x80, str12); //液晶显示字符串 write_str(0xc0, str22);}break; case 2: { write_str(0x80, str13); //液晶显示字符串 write_str(0xc0, str23);}break; case 3: { write_str(0x80, str14); //液晶显示字符串 write_str(0xc0, str24);}break; case 4: { write_str(0x80, str15); //液晶显示字符串 write_str(0xc0, str25);}break; case 5: { write_str(0x80, str16); //液晶显示字符串 write_str(0xc0, str26);}break; default: break;} AD9851_SET(freq); Play_nowfreq(); } else { write_str(0x80, str31); //液晶显示字符串 write_str(0xc0, str32); for (j = 6; j > 0; j--) //高位为"0"不显示 { if (display1[j] ==0x30) display1[j] = 0x20; else break; } lcd_pos(1, 8); for (i =6; i !=0xff; i--) lcd_wdat(display1[i]); } delayms(200); } }
