⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 led.c

📁 用8051控制DDS信号发生器
💻 C
字号:

#include "led.h"

bit flag_9833=0;
unsigned char key_timer,count,led_sel,show_sel,key_in,key_hiter,key_undeal,key_buf[4],timer_counter;
unsigned char sel_9833,deal_counter,deal_buf[6],deal_device,point_loc,error_no,preset_ok;
unsigned char show_buf[6],seri_buf[8];
unsigned char step,ask,psk;

unsigned long f_in,fa,f1;
unsigned int add,f_buf[10];
//unsigned char code para_avl[4]="有效";

unsigned int code freq_regs[2] ={0x0051,0x3ae1};//100KHz


unsigned char code led_code[28][2]={{'0',0x3f},{'1',0x06},{'2',0x5b},{'3',0x4f},{'4',0x66},
									{'5',0x6d},{'6',0x7d},{'7',0x07},{'8',0x7f},{'9',0x6f},
									{'A',0x77},{'B',0x7C},{'C',0x39},{'D',0x5E},{'E',0x79},
									{'F',0x71},{'H',0x76},{'L',0x38},{'O',0x5C},{'P',0x73},
									{'U',0x3E},{'R',0x50},{'Y',0x6E},{'.',0x80},{'-',0x40},
									{'=',0x48},{0X00,0X00},{0Xff,0Xff}};

extern void Initial9833(void);
/***********************************************************************/
void init_timer()
{

	TH0=0xcf;
	TL0=0X00;
	TR0=1;
        ET0=1;
	timer_counter=0;
}
/**********************************************************************/

void init_8155()
{

 Order_state=0x03;
 led_contrl=0;
 show_sel=0xfe;
 led_sel=0x00;
 key_timer=0;
 key_hiter=0x0f;
 key_in=0xff;
 key_undeal=0;
 key_buf[0]= key_buf[1]= key_buf[2]= key_buf[3]=0;
}
/**********************************************************************/
void get_show(unsigned long f)
{
unsigned char i;        
 			if(f<100000){  
                                     show_buf[5]=0x00;
                                     }
			else {	i=f/100000; 
                        	 show_buf[5]=led_code[i][1];	f=f%100000;}
			if(f<10000){	show_buf[4]=f_in<10000?0x0:led_code[0][1];}
			else {	i=f/10000;
                        	show_buf[4]=led_code[i][1];	f=f%10000;}
			if(f<1000)
                        {	show_buf[3]=f_in<1000?0x0:led_code[0][1];}
			else {	i=f/1000;	show_buf[3]=led_code[i][1];	f=f%1000;}
			if(f<100){		show_buf[2]=f_in<100?0x0:led_code[0][1];}
			else {	i=f/100;	show_buf[2]=led_code[i][1];	f=f%100;}
			if(f<10){i=f/10;		show_buf[1]=led_code[i][1]|0x80;}
			else {	i=f/10;	show_buf[1]=(led_code[i][1]| 0x80);	i=f%10;}
			show_buf[0]=led_code[i][1];     
}
/*********************************************************************/

void Initial9833()
{
        	f_buf[0]=freq_regs[1];        //f0_low
	    	f_buf[1]=freq_regs[0];     	//f0_high
	    	f_buf[2]=0;     	//f1_low
	    	f_buf[3]=0;     	//f1_high
	    	f_buf[4]=0;						//p0
	    	f_buf[5]=2048;						//p1
		    control=0;        b28=1;//fsel=1;
 			Control_9833();

			ask=0;psk=0;step=1;
			f_in=1000;
			get_show(f_in);

}



void time0() interrupt 1
{
TH0=0xff;
TL0=0xce;                    //定时器0中断十个us     //此处应改为5us,如10KHz应改为50us
timer_counter++;
if(timer_counter>20)
	{                    //此处也许应改为200
timer_counter=0;
key_timer=1;
	}
sk_signal=~sk_signal;
if(ask){
	if(sk_signal)Write9833(control);
	else	Write9833(control | 0x0800);
	}

else if(psk){
	if(sk_signal)Write9833(control);
	else	Write9833(control | 0x0400);
	}


}


/******************************调整X9C102********************************/

void POT(bit updown)
{
	AGC_CTL = 0;
    UP=updown;
	while(step--){
		INC=1;_nop_();_nop_();_nop_();_nop_();_nop_();
		INC=0;}
	INC=1;
	AGC_CTL = 1;
}
/*********************************************************************/
void main(void)
{
	init_8155();
	init_timer();
	Initial9833();
	EA=1;
          while(1) {
                  FEED_DOG;
		if(key_timer){
			key_timer=0;
			if(led_sel>0 && led_sel <5 ){
				if(key_hiter != 0x0f   && led_sel <5 ){     //有键按下
					key_in=(port_c & 0x0f );				//读键
					if(key_in != 0x0f ){					//键有效
						if( key_in != key_buf[led_sel-1]){	//新键
							key_undeal=1;	key_buf[led_sel-1] = key_in;
                        	switch(key_in){
								case 0x0e:
									key_in=16-led_sel;
									break;
								case 0x0d:
									key_in=12-led_sel;
									break;
								case 0x0b:
									key_in=8-led_sel;
									break;
								case 0x07:
									key_in=4-led_sel;
									break;
								default:
									key_buf[led_sel-1] = key_in=0x0f; 	key_undeal=0;
									break;		}}}

					else {key_buf[led_sel-1] =	0x0f;}}		//键无效
				else{key_buf[led_sel-1] =	0x0f;	}}	//键释放

			port_b=0xff;
			port_a=show_buf[led_sel];
			port_b=show_sel;
			led_sel++;
			show_sel=(show_sel<<1)+1;
			if(led_sel>5){
				led_sel=0;
				show_sel=0xfe;}
			key_hiter= (port_c & 0x0f);	}           //检测按键
			if(key_undeal){
					key_undeal=0;
					deal_counter=0;
					switch(key_in){
						case 0x00:		//↑
						case 0x01:		//↓
						case 0x02:		//←
						case 0x03:		//→
							if(key_in==0x0)	{	f_in=f_in+1000;if(f_in>100000)f_in=100000;}
							if(key_in==0x1)	{	f_in=f_in-1000;if(f_in<10)f_in=10;}
							if(key_in==0x2)	{	f_in++;if(f_in>100000)f_in=100000;}
							if(key_in==0x3)	{	f_in--;if(f_in<10)f_in=10;}

							fa=f_in<<12;			//*2**27/10**8
							if((fa%25)>12) fa=fa/25+1;
							else fa=fa/25;
							fa=fa<<5;
							if((fa%25)>12) fa=fa/25+1;
							else fa=fa/25;
							fa=fa<<5;
							if((fa%5)>2) fa=fa/5+1;
							else fa=fa/5;
							f_buf[0]=(unsigned int )(fa & 0x03fff);
							f_buf[1]=(unsigned int )(fa >>14);
							add = f0write;
                        	                        Write9833(0x2000);
							Write9833(f_buf[0] | add);
							Write9833(f_buf[1] | add);
							Write9833(control );
							get_show(f_in);
							break;

						case 0x04:		// 
						case 0x05:		// 三角波;
						case 0x06:		// 方波/2;
						case 0x07:		// 方波;
							control=0;
							if(key_in==0x05){mode=1;	ask=0;	psk=0;}// 三角波
							if(key_in==0x06){opb=1;		ask=0;	psk=0;}	// 方波/2;
							if(key_in==0x07){opb=1;		div2=1;	ask=0;	psk=0;}// 方波;
							Write9833(control);
							break;
						case 0x08:		// ask;
						case 0x09:		// psk;
							if(key_in==8){ask=1;	psk=0;}// ask;
							else if(key_in==9){psk=1;	ask=0;}// psk
							control=0;
        					f_buf[0]=freq_regs[1];        //f0_low
	    					f_buf[1]=freq_regs[0];     	//f0_high
							add = f0write;
                        	Write9833(0x2000);
							Write9833(f_buf[0] | add);
							Write9833(f_buf[1] | add);
							break;
						case 0x0e:			//减小
							step=1;				
							POT(0);
							break;
						case 0x0f:		//增大
							step=1;				
							POT(1);
							break;

						default:
							break;}
				}


	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -