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

📄 morse.c

📁 用在EM78860单片机制作的摩斯密码机源文件
💻 C
📖 第 1 页 / 共 3 页
字号:
   for(i=0;i<no-1;i++)
   {   
     *s=RcvByte();               /*发送数据*/
      Ack_I2c(0);                /*发送就答位*/  
     s++;
   } 
   *s=RcvByte();
   Ack_I2c(1);                   /*发送非应位*/
   Stop_I2c();                   /*结束总线*/ 
   return(1);
}

#endif 



indir char morse_input_flag=0;

indir short current_device_id;
indir 	short dest_device_id;
indir 	char keydata=(char)0xFF;

indir 	char morse_ch=(char)0x01;
indir 	uchar bit_count=0;
indir 	char left_flag=0;
indir 	char right_flag=0;
indir 	char mode_flag=0;
indir 	char display_id;
indir 	char morse_bit=0;
indir 	char e2rom_have_id_num;

void main()
{
/*
	char keydata=(char)0xFF;
	char morse_ch=(char)0x01;
	
	uchar bit_count=0;
	char left_flag=0;
	char right_flag=0;
	char mode_flag=0;
	char display_id;
	char morse_bit=0;
	*/
	char ch[1];	
	char *str="12345";
	char rec[5];
	char i;
	char m;
	char e2rom_subaddr=0;
	char *pcscratch =(char *)&self_device_id;
	
	DISI();
	
	init_key();
	init_timer();
	init_lcd();
	lcd_clear();
	init_i2c();
	//read from E2prom,init morse_di_time,morse_dah_time etc 
	//and display ID connet with device ID.
	IRcvStr(i2c_addr,e2rom_subaddr,&pcscratch[3],1);
	IRcvStr(i2c_addr,e2rom_subaddr+1,&pcscratch[2],1);
	IRcvStr(i2c_addr,e2rom_subaddr+2,&pcscratch[1],1);
	if(self_device_id==0)
		{
			self_device_id=0x12345600;
			e2rom_subaddr=0;
			ISendStr(i2c_addr,e2rom_subaddr,&pcscratch[3],1);
			ISendStr(i2c_addr,e2rom_subaddr+1,&pcscratch[2],1);
			ISendStr(i2c_addr,e2rom_subaddr+2,&pcscratch[1],1);
			
		}
	e2rom_subaddr =0;
	e2rom_subaddr =e2rom_subaddr+3;
	IRcvStr(i2c_addr,e2rom_subaddr,&middle_var,1);
	morse_di_time = middle_var;
	if(morse_di_time >10 ||morse_di_time<0)
		{
			morse_di_time=5;
			middle_var = morse_di_time;
			ISendStr(i2c_addr,e2rom_subaddr,&middle_var,1);
		}
	e2rom_subaddr =0;
	e2rom_subaddr =e2rom_subaddr+4;
	IRcvStr(i2c_addr,e2rom_subaddr,&middle_var,1);
	morse_dah_time=middle_var;
	if(morse_dah_time >10 || morse_dah_time <0)
		{
			morse_dah_time =5;
			middle_var = morse_dah_time;
			ISendStr(i2c_addr,e2rom_subaddr,&middle_var,1);
		}
	e2rom_subaddr =0;
	e2rom_subaddr =e2rom_subaddr+5;
	IRcvStr(i2c_addr,e2rom_subaddr,&middle_var,1);
	morse_char_endtime = middle_var;
	if(morse_char_endtime >20 || morse_char_endtime < 10)
		{
			morse_char_endtime =15;
			middle_var = morse_char_endtime;
			ISendStr(i2c_addr,e2rom_subaddr,&middle_var,1);
		}
	e2rom_subaddr =0;
	e2rom_subaddr =e2rom_subaddr+6;
	IRcvStr(i2c_addr,e2rom_subaddr,&middle_var,1);
	morse_word_endtime = middle_var;
	if(morse_word_endtime >30 ||morse_word_endtime <20)
		{
			morse_word_endtime =25;
			middle_var =morse_word_endtime;
			ISendStr(i2c_addr,e2rom_subaddr,&middle_var,1);
		}
	e2rom_subaddr =0;
	e2rom_subaddr =e2rom_subaddr+7;
	IRcvStr(i2c_addr,e2rom_subaddr,&middle_var,1);
	e2rom_have_id_num = middle_var;
	if(e2rom_have_id_num >10 || e2rom_have_id_num <0)
		{
			e2rom_have_id_num =0;
		}
	//only read ID,from 0--9,and do nothing...
	e2rom_subaddr =0;
	e2rom_subaddr =e2rom_subaddr+8;
	pcscratch = (char *)&e2rom_have_id_num;
	write_cont(0x23);//set TCC 1:16,TCC source = 16.38K
	TCC =0;
//	IOC7=0xFF;//port7 set input when use keyboard
	ENI();

while(1)
{

/*
	for(i=0;i<10;i++)
		ISendStr(i2c_addr,i,&i,1);
	for(i=0;i<10;i++)
		{
		IRcvStr(i2c_addr,i,&m,1);
		 ch[0]=m+0x30;
		 lcd_append_str(ch,1);
		}
	
	ISendStr(i2c_addr,0,str,5);
	IRcvStr(i2c_addr,0,rec,5);
	lcd_display(0, str, 5);
	lcd_display(10, rec, 5);
		
	display_ico(S1, 1);
	display_ico(p_p, 1);
	display_ico(ALL,1);
	*/
}

#if 0
	while(1)
	{
	//	IOCD=0xFF;//set port7 internal pull high
	//	keydata=PORT7;
		if(TCC >10)
		{
			keydata=scan_key();
			TCC =0;
		}
		//key down...
		if((keydata&0xFF)!=0xFF)
		{
			open_led();
			start_beep();
			press_flag=1;
			if(keydata==key_morse_di )
				{
					morse_input_flag =1;
					morse_bit =0;
				}
			else if(keydata==key_morse_dah)
				{
					morse_input_flag =1;
					morse_bit =1;
				}
			else if(keydata==key_morse_end)
				{
					morse_input_flag =2;
				}
			else 
				{
					morse_input_flag =0;
				}
		}
		//key up...
		else 
		{
			if(morse_input_flag==1)
			{
					if(press_flag)
					{
						if(morse_bit)
							{
							morse_ch = morse_ch<<1;
							morse_ch =morse_ch+1;
							}
						else
							{
							morse_ch = morse_ch<<1;
							}
						
						if(bit_count <7)
							++bit_count;
						key_morse_end_counter=0;
					}
				
			}
			//morse input end ...
			else if(morse_input_flag ==2)
				{
					if(bit_count)
					{
						if(bit_count >6)
						{
							ch[0]=(char)MorseErrorCode;
						}
						else
						{	
							ch[0]=morse_decode(morse_ch);
						}
					}
						if(ch[0] !=(char)MorseErrorCode)
					{
					//display input char.
						lcd_append_str(ch,1);
					//	NOP();
					//	array_set(INPUT_WORD_ADDR+ch_count,(char *)ch[0],1);
						ch_count ++;
						if(ch_count >MAX_WORD_LEN)
							{
								ch_count =0;
								//send words...
							//	begin_send_words(current_device_id,dest_device_id);
								lcd_clear();
							}
							
					}
				if(press_flag)
					key_morse_end_counter ++;
				bit_count =0;
				morse_ch =(char)0x01;	
				ch[0] =(char)MorseErrorCode;
				if(key_morse_end_counter==2)
					{
					//when seriral press 2 key_morse_end ,a word input  over and send it ..
						key_morse_end_counter=0;
						morse_input_over_flag=1;
					lcd_clear();
					}

				}
			morse_input_flag =0;
			close_led();
			stop_beep();
			press_flag=0;
		}
	if(press_flag)
	{
		if(keydata==key_left)
			{
				left_flag =1;
				if(right_flag&left_flag)
					{
					right_flag =0;
					left_flag =0;
					current_status =1;
					}
			}
			else if(keydata==key_right)
			{
				right_flag=1;
				if(right_flag&left_flag)
					{
					right_flag =0;
					left_flag =0;
					current_status =1;
					}
			}
			else if(keydata==key_up)
			{
				if(current_status==0)
					{
						
					}
				else if(current_status==1)
					{
					
					}
				else if(current_status==2)
					{
						
					}
			}
			else if(keydata==key_down)
			{
				if(current_status==0)
					{
						
					}
				else if(current_status==1)
					{
					
					}
				else if(current_status==2)
					{
						
					}
				
			}
			else if(keydata==key_switch)
			{
				if(current_status==0)
					{
						if(press_long_flag)
							{
							//change status to control ID status
								ch[0]='7';
								lcd_display(0, ch, 1);
								current_status =2;
							}
						else
							{
							//in view status,
							if(mode_flag)
								{
									mode_flag=0;
									//P-P
									send_mode =1;
								}
							else
								{
									mode_flag =1;
									//ALL send
									send_mode =0;
								}
							}
					}
				else if(current_status==1)
					{
						if(press_long_flag)
							{
							//change status to view status
								current_status =0;
							//write configre input time to E2prom.
							}
						
					}
				else if(current_status==2)
					{
						current_status=0;
						// current  ID overcast be selected ID and write to E2prom 
 					}
			}
			
				
		}
	if(morse_input_over_flag)
	{
		//when input timeout and seriral press 2 key_morse_end,send it
		morse_input_over_flag=0;
		//send word...
		//	begin_send_words(current_device_id,dest_device_id);
		lcd_clear();
	}

	if(timer2_int_flag)
		{
			timer2_isr();
		}
	}

	#endif 

}


void timer2_isr()
{	
	timer2_int_flag =0;
	RELOAD_TIMER2();
  	if(press_flag)
  		press_long_counter ++;
  	if(press_long_counter >PRESS_LONG_TIMER)
  		{
  			press_long_flag =1;
  			press_long_counter =0;
  		}
  	if(key_morse_end_counter==1)
  		{
  			morse_input_counter ++;
  		}
  	if(morse_input_counter >MORSE_INPUT_TIMER)
  		{
  			morse_input_counter=0;
  			key_morse_end_counter =0;
  			morse_input_over_flag=1;
  		}
	
}
/*
*
*/

void _intcall interrupt_l(void) @ 0x08:low_int 7
{
  //save ACC,R3,R4,R5
  _asm 
   {
     MOV 0X1F,A
     SWAPA 0X4
     BS 0X4,6
     BS 0X4,7
     MOV 0X3F,A
     SWAPA 0X3
     MOV 0X3E,A
     SWAPA 0X5
     MOV 0X3D,A
   }  	
 

}



void _intcall interrupt(void) @ int 7
{

    //backup C system
  _asm
    {   
	MOV A,0X10	// USE 1 BYTE C TYPE,C SYSTEM BACKUP
	MOV 0X3C,A
	MOV A,0X14
	MOV 0X3B,A
	MOV A,0X18
	MOV 0X3A,A
	MOV A,0X1B
	MOV 0X39,A
	MOV A,0X1C
	MOV 0X38,A
    } 

    
 // Write your code (inline assembly or C) here
 	DISI();
	isr_source=ISR;
	if(isr_source &0x20)
		{
			timer2_int_flag =1;
		}
	ISR =0;
	
    //restore C system
  _asm
    {  
        BS 0X4,6
        BS 0X4,7
	MOV A,0X3C	// USE 1 BYTE C TYPE,C SYSTEM RESTORE
	MOV 0X10,A
	MOV A,0X3B
	MOV 0X14,A
	MOV A,0X3A
	MOV 0X18,A
	MOV A,0X39
	MOV 0X1B,A
	MOV A,0X38
	MOV 0X1C,A
    }
    
   //restore ACC,R3,R4,R5
   _asm 
    {
      BS 0X4,6
      BS 0X4,7
      SWAPA 0X3D
      MOV 0X5,A
      SWAPA 0X3E
      MOV 0X3,A
      SWAPA 0X3F
      MOV 0X4,A
      SWAP 0X1F
      SWAPA 0X1F 
    } 
 	
 	ENI();		
}

#if 0
void _intcall counter1_l(void) @ 0x0C:low_int 4
{
 
}

void _intcall counter1(void) @ int 4
{
  //backup R4
  _asm 
   {
     SWAPA 0x04
     MOV 0x1F,A
   }  	

   //backup C system
  _asm
    { 
    BS 0X4,6
    BS 0X4,7    
	MOV A,0X10	// USE 1 BYTE C TYPE,C SYSTEM BACKUP
	MOV 0X3C+1,A
	MOV A,0X14
	MOV 0X3B+1,A
	MOV A,0X18
	MOV 0X3A+1,A
	MOV A,0X1B
	MOV 0X39+1,A
	MOV A,0X1C
	MOV 0X38+1,A
    }

     
 
  // Write your code (inline assembly or C) here
    
      
   //restore C system
  _asm
    {  
    BS 0X4,6
    BS 0X4,7
	MOV A,0X3C+1	// USE 1 BYTE C TYPE,C SYSTEM RESTORE
	MOV 0X10,A
	MOV A,0X3B+1
	MOV 0X14,A
	MOV A,0X3A+1
	MOV 0X18,A
	MOV A,0X39+1
	MOV 0X1B,A
	MOV A,0X38+1
	MOV 0X1C,A
    }

 
  //restore R4
  _asm 
   {
     SWAPA 0x1F
     MOV 0X04,A
   } 
 	
}


void _intcall counter2_l(void) @ 0x0F:low_int 5
{
 
}

void _intcall counter2(void) @ int 5
{
  //backup R4
  _asm 
   {
     SWAPA 0x04
     MOV 0x1F,A
   }  	

   //backup C system
  _asm
    { 
    BS 0X4,6
    BS 0X4,7    
	MOV A,0X10	// USE 1 BYTE C TYPE,C SYSTEM BACKUP
	MOV 0X3C+1,A
	MOV A,0X14
	MOV 0X3B+1,A
	MOV A,0X18
	MOV 0X3A+1,A
	MOV A,0X1B
	MOV 0X39+1,A
	MOV A,0X1C
	MOV 0X38+1,A
    }

     
 
  // Write your code (inline assembly or C) here
  	DISI();
  	RELOAD_TIMER2();
  	IOCF=0;
  	if(press_flag)
  		press_long_counter ++;
  	if(press_long_counter >PRESS_LONG_TIMER)
  		{
  			press_long_flag =1;
  			press_long_counter =0;
  		}
  	if(key_morse_end_counter==1)
  		{
  			morse_input_counter ++;
  		}
  	if(morse_input_counter >MORSE_INPUT_TIMER)
  		{
  			morse_input_counter=0;
  			key_morse_end_counter =0;
  			morse_input_over_flag=1;
  		}
   //restore C system
  _asm
    {  
    BS 0X4,6
    BS 0X4,7
	MOV A,0X3C+1	// USE 1 BYTE C TYPE,C SYSTEM RESTORE
	MOV 0X10,A
	MOV A,0X3B+1
	MOV 0X14,A
	MOV A,0X3A+1
	MOV 0X18,A
	MOV A,0X39+1
	MOV 0X1B,A
	MOV A,0X38+1
	MOV 0X1C,A
    }

 
  //restore R4
  _asm 
   {
     SWAPA 0x1F
     MOV 0X04,A
   } 
 	ENI();
}

#endif

⌨️ 快捷键说明

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