📄 morse7-14.c
字号:
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 + -