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

📄 morse7-14.c

📁 用在EM78860单片机制作的摩斯密码机源文件
💻 C
📖 第 1 页 / 共 2 页
字号:
	mov %nbuf+2,a //save band ram
	}
	//start array opreate

	regdata=IOCA;
	regdata&=~bank_mask;
	if(len <(256-offset))
	{
	//current page;
		regdata |=bank_num;
		IOCA=regdata;
		for(i=0;i<len;i++)
		{
			RC=offset+i;
		//	RD=inbuf[i];
			outbuf[i]=RD;
		}
	}
	else
	{
	//first write current page remnant
		regdata |=bank_num;
		IOCA=regdata;
		for(i=0;i<(256-offset);i++)
		{
			RC=offset+i;
		//	RD=inbuf[i];
			outbuf[i]=RD;
		}
		len_remnant=len-(256-offset);
	//write next band ..,band +1
		bank_add=bank_add +1;
		bank_add <<=1;
		regdata&=~bank_mask;
		regdata |=bank_add;
		IOCA=regdata;
		for(i=0;i<len_remnant;i++)
		{
			RC=offset+i;
		//	RD=inbuf[len-len_remnant+i];
			outbuf[len-len_remnant+i]=RD;
		}
			
	}
	
	//end array opreate 
	_asm{
	//restore rpage, iopage and bank reg step
	mov a, %nbuf
	mov 0x03, a
	mov a, %nbuf + 1
	mov 0x04, a
	
	mov a,%nbuf+2
	iow	0x0A	//restore IOCA 
	
	}	
}


void emc_memcpy(short dst,short src,short len)
{
	char buf[1];
	short i;
	
	if(dst ==0 ||src ==0)
		return ;
	for(i=0;i<len;i++)
	{
	array_get(src+i, buf,1);
	array_set(dst+i, buf,1);
	}
}

/*
*	in send_buff ,form send data,including character code,device id,destination Id,length,data,checksum.
*	not include start 10ms high level!!!
*	only checksum device_id+dest_id+ch_count.
*/
void begin_send_words(short device_id,short dest_id)
{
	short offset=0;
	char buf[2];

	//buf[0]=(char)0xA5;
	//array_set(SEND_BUFF_ADDR+offset,buf,1);
//	offset =offset +1;
	array_set(SEND_BUFF_ADDR+offset,(char*)(&device_id),2);
	offset=offset +2;
	array_set(SEND_BUFF_ADDR+offset,(char*)(&dest_id),2);
	offset=offset +2;
	buf[0]=ch_count;
	array_set(SEND_BUFF_ADDR+offset,buf,1);
	offset=offset+1;
	emc_memcpy(SEND_BUFF_ADDR+offset,INPUT_WORD_ADDR,ch_count);
	offset=offset+ch_count;
	buf[0]=1+~(device_id+dest_id+ch_count);
	array_set(SEND_BUFF_ADDR+offset,buf,1);
//	send_valid = true;
//	send_index = 0;
 //   	send_bit = 0;
 //   	send_bit_phase = false;
 //  	send_head = false;
 //  	send_sync = false;
//	send_timer = 0;
//	send_count = ch_count+6;
//	send_ch_count=0;
	
}
void test_fun()
{
	char nbuf=0x06;
	char tmp=0x07;
	char data;
	char data1;
//	short i=0xa5b;
	/*
	nbuf[0]=(char)(i&0x00FF);
	nbuf[1]=(char)((i>>8)&0x00FF);
	NOP();
	*/
	
	
	_asm
	{
		
		mov a, %nbuf
		
		mov %data1,a
		nop
	}
		
}

 void init_key()
{
	//char regdata;

	regdata=IOC7;
	regdata|=0x87;
	IOC7=regdata;
	regdata=IOCD;
	regdata|=0x87;
	IOCD=regdata;
	regdata=IOC9;
	regdata&=~0x60;
	IOC9=regdata;
	regdata=PORT9;
	regdata|=0x60;
	PORT9=regdata;
}
	

char scan_key()
{
	char keydata=(char)0xFF;
	
	regdata=PORT9;
	regdata&=~0x20;
	regdata|=0x40;
	PORT9=regdata;
	keydata=PORT7;
	if(keydata !=(char)0xFF)
	{
		if(!(keydata&(1<<0)))
			return (char)key_morse_di;
		else if(!(keydata&(1<<1)))
			return (char)key_morse_dah;
		else if(!(keydata&(1<<2)))
			return (char)key_morse_end;
		else if(!(keydata&(1<<7)))
			return (char)key_left;
	}
	//	return keydata;
	regdata=PORT9;
	regdata&=~0x40;
	regdata|=0x20;
	PORT9=regdata;
	keydata=PORT7;
	if(keydata !=(char)0xFF)
	{
		if(!(keydata&(1<<0)))
			return key_right;
		else if(!(keydata&(1<<1)))
			return key_up;
		else if(!(keydata&(1<<2)))
			return key_down;
		else if(!(keydata&(1<<7)))
			return key_switch;
	}		
	return keydata;
}



void main()
{

	char keydata;
	char morse_ch=(char)0x01;
	char ch[1];
	uchar bit_count=0;
	char left_flag=0;
	char right_flag=0;
	char mode_flag=0;
	char display_id;
	short current_device_id;
	short dest_device_id;

	
	DISI();
//	test_fun();
	//read from E2prom,init morse_di_time,morse_dah_time etc 
	//and display ID connet with device ID.
	init_key();
	init_timer();
	init_lcd();
	lcd_clear();
//	IOC7=0xFF;//port7 set input when use keyboard
//	ENI();
	while(1)
	{
	//	IOCD=0xFF;//set port7 internal pull high
	//	keydata=PORT7;
		keydata=scan_key();
		if((keydata&0xFF)!=0xFF)
		{
			open_led();
			start_beep();
			press_flag=1;
		}
		else 
		{
			close_led();
			stop_beep();
			press_flag=0;
		}
		if(press_flag)
		{
		
			if(keydata==key_morse_di)
			{
				key_morse_end_counter =0;
				morse_input_over_flag=0;
				morse_ch = morse_ch<<1;
				ch[0]='.';
				lcd_display(0,ch,1);
				delay_ms(500);
				if(bit_count<6)
					++bit_count;
			}
			else if(keydata==key_morse_dah)
			{
				key_morse_end_counter=0;
				morse_input_over_flag=0;
			//	morse_ch = morse_ch<<1+1;
				morse_ch = morse_ch<<1;
				morse_ch =morse_ch+1;
				ch[0]='-';
					lcd_display(0,ch,1);
					delay_ms(500);
				if(bit_count<7)
					++bit_count;
				
			}
			else if(keydata==key_morse_end)
			{
				key_morse_end_counter ++;
				delay_ms(500);
				morse_input_over_flag=0;
			//	ch[0]='E';
			//	lcd_display(0,ch,1);
				if(bit_count)
					{
				
				//	ch[0]='1';
				//	lcd_display(0,ch,1);
						if(bit_count >6)
						{
							ch[0]=(char)MorseErrorCode;
						}
						else
						{	
							ch[0]=morse_decode(morse_ch);
						}
					}
				if(ch[0] !=(char)MorseErrorCode)
					{
					//display input char.
					//ch[0]='3';
					//	lcd_display(0,ch,1);
						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();
							}
							
					}
				bit_count =0;
				morse_ch =(char)0x01;
				
				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;
					}
					
			}
			else 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
								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();
				}
				
		}
	}

	

}


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
  	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;
  		}
   //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
   } 
 	
}

⌨️ 快捷键说明

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