📄 morse.c
字号:
#include "em78p860.h"
#include "morsecode.h"
#define MESS_MAX_SIZE 20
#define LENGTH 30
#define MAX_USER 15
#define MAX_WORD_LEN 20
indir static char new_info; //new info flag,bool type
indir static char on_line_data; //wirless channel is using?
indir static char send_mode; //P-P or all send mode.
indir long int p_p_id; //if P-P ,set the id,all 0xffff。
indir static char current_status; //0=view status,1=set input status,2=control ID status
indir char press_long_flag;
indir char press_flag=0;
indir char press_long_counter;
indir char morse_input_over_flag; //use this flag judge the morse input end and send ,1 ==over.
indir char morse_input_counter;
indir static char key_morse_end_counter;//only sequence press this key,key_morse_end_counter plus ....
#define MORSE_INPUT_TIMER 200
//for keyboard input var..
#define key_morse_di 0
#define key_morse_dah 1
#define key_morse_end 2
#define key_left 3
#define key_right 4
#define key_up 5
#define key_down 6
#define key_switch 7
#define bank_mask (0xF<<1)
//reload timer1,set 35us,
#define RELOAD_TIMER1() {IOCB_COUNTER1=0x80;}
//reload timer 2,set 5ms,
#define RELOAD_TIMER2() {IOCC_COUNTER2=0x5C;}
//press long timer counter...
#define PRESS_LONG_TIMER 100
#define USER_BYTE_COINT 120
#define SEND_BUFF_ADDR 2048 //use band8 ,256*8
#define RECV_BUFF_ADDR 2088 //band8 ,2048+40
#define INPUT_WORD_ADDR 2128 //BAND8,2088+40
#define DISPLAY_ADDR 2168 //band8,2128+40
indir uchar ch_count;
indir bool channel_busy=false;
/*
* interrupt part...
*/
indir char tcc_int_flag;
indir char ext_int0_flag;
indir char ext_int1_flag;
indir char ext_int2_flag;
indir char timer1_int_flag;
indir char timer2_int_flag;
indir char ext_int3_flag;
indir char isr_source;
void timer2_isr();
//for every ID struct.
/*
typedef struct _Morse
{
uchar times;//this ID times..
uchar read_over;//ID info read over,bool type.
char display_id;
short device_id;
// char message[MESS_MAX_SIZE]; //chat record
}Morse;
*/
/**
* user0 and user1 use band0 ,...user14 and user15 use band7
* user0--times address 0 band 0
* user0--read_over address 1 band 0
user0--display_id 2
user0--
*/
/*
* lcd part
*/
#define DISPLAY_LINE_LEN 20
indir char lcd_current_addr;
indir char iocc_data=0;
indir char i2c_addr=(char)0xa0;
indir char ack;
char middle_var;
//for E2rom var.....
//when debug ,use directe variable
long self_device_id;
indir char morse_di_time=5; //Morse short code input time
indir char morse_dah_time=5; //Morse long code input time
indir char morse_char_endtime=20;//char end time...
indir char morse_word_endtime=30;//start send
indir char display_id0;
indir char display_id1;
indir char display_id2;
indir char display_id3;
indir char display_id4;
indir char display_id5;
indir char display_id6;
indir char display_id7;
indir char display_id8;
indir char display_id9;
indir char display_id10;
indir char display_id11;
indir char display_id12;
indir char display_id13;
indir char display_id14;
indir short device_id0;
indir short device_id1;
indir short device_id2;
indir short device_id3;
indir short device_id4;
indir short device_id5;
indir short device_id6;
indir short device_id7;
indir short device_id8;
indir short device_id9;
indir short device_id10;
indir short device_id11;
indir short device_id12;
indir short device_id13;
indir short device_id14;
/*
PORT9.4---SCL,PORT9.3---SDA
*/
#define SDA 0x08
#define SCL 0x10;
const char lcd_word_table1[]=
{
0,0x00,0x00,0x00,0x00,0x00, //space ,ASCII is 0x20,32
1,0x00,0x00,0x79,0x00,0x00,//00000000b,00000000b,01111001,0000000,0000000, //!
2,0x00,0x70,0x00,0x60,0x00,//00000000b,01110000b,00000000,0110000,00000000,//"
3,0x14,0x7f,0x14,0x7f,0x14,//00010100,01111111,00010100,01111111,00010100,//#
4,0x12,0x2a,0x7f,0x2a,0x24,//00010010,00101010,01111111,00101010,00100100,//$
5,0x62,0x64,0x08,0x03,0x23,//01100010,01100100,00001000,00010011,00100011,//%
6,0x36,0x49,0x35,0x02,0x0d,//00110110,01001001,00110101,00000010,00001101,//&
7,0x00,0x50,0x60,0x00,0x00,//00000000,01010000,01100000,00000000,00000000,//'
8,0x00,0x1c,0x22,0x00,0x00,//00000000,00011100,00100010,00000000,00000000,//(
9,0x00,0x41,0x22,0x1c,0x00,//00000000,01000001,00100010,00011100,00000000,//)
10,0x22,0x14,0x7f,0x14,0x22,//00100010,00010100,01111111,00010100,00100010,//*
11,0x08,0x08,0x3e,0x08,0x08,//00001000,00001000,00111110,00001000,00001000,//+
12,0x00,0x05,0x06,0x00,0x00,//00000000,00000101,00000110,00000000,00000000,//,
13,0x08,0x08,0x08,0x08,0x08,//00001000,00001000,00001000,00001000,00001000//-
14,0x00,0x03,0x03,0x00,0x00,//00000000,00000011,00000011,00000000,00000000,//.
15,0x02,0x0c,0x08,0x10,0x10,//00000010,00001100,00001000,00010000,00100000,// /
16,0x3e,0x45,0x49,0x51,0x3e,//00111110,01000101,01001001,01010001,00111110,//0
17,0x00,0x21,0x7f,0x01,0x00,//00000000,00100001,01111111,00000001,00000000,//:1
18,0x21,0x43,0x45,0x49,0x31,//00100001,01000011,01000101,01001001,00110001//:2
19,0x42,0x41,0x51,0x69,0x46,//01000010,01000001,01010001,01101001,01000110,//:3
20,0x0c,0x14,0x24,0x7f,0x04,//00001100,00010100,00100100,01111111,00000100,//:4
};
const char lcd_word_table2[]=
{
21,0x72,0x51,0x51,0x51,0x4e,//01110010,01010001,01010001,01010001,01001110//:5
22,0x1e,0x29,0x49,0x49,0x06,//00011110,00101001,01001001,01001001,00000110//:6
23,0x40,0x40,0x47,0x58,0x60,//01000000,01000000,01000111,01011000,01100000//:7
24,0x36,0x49,0x49,0x49,0x36,//00110110,01001001,01001001,01001001,00110110//:8
25,0x30,0x49,0x49,0x4a,0x3c,//00110000,01001001,01001001,01001010,00111100,//:9
26,0x00,0x36,0x36,0x00,0x00,//00000000,00110110,00110110,00000000,00000000,//:
27,0x00,0x35,0x36,0x00,0x00,//00000000,00110101,00110110,00000000,00000000,//;
28,0x08,0x14,0x22,0x21,0x00,//00001000,00010100,00100010,00100001,00000000,//<
29,0x14,0x14,0x14,0x14,0x14,//00010100,00010100,00010100,00010100,00010100,//==
30,0x00,0x21,0x22,0x14,0x08,//00000000,00100001,00100010,00010100,00001000,//>
31,0x20,0x40,0x45,0x48,0x30,//00100000,01000000,01000101,01001000,00110000,//?
32,0x3e,0x41,0x5d,0x55,0x3c,//00111110,01000001,01011101,01010101,00111100,//@
33,0x1f,0x24,0x44,0x24,0x1f,//00011111,00100100,01000100,00100100,00011111,//A
34,0x7f,0x49,0x49,0x49,0x36,//01111111,01001001,01001001,01001001,00110110,//B
35,0x3e,0x41,0x41,0x41,0x22,//00111110,01000001,01000001,01000001,00100010,//C
36,0x7f,0x41,0x41,0x22,0x1c,//01111111,01000001,01000001,00100010,00011100,//D
37,0x7f,0x49,0x49,0x49,0x41,//01111111,01001001,01001001,01001001,01000001,//E
38,0x7f,0x48,0x48,0x48,0x40,//01111111,01001000,01001000,01001000,01000000,//F
39,0x3e,0x41,0x49,0x49,0x2f,//00111110,01000001,01001001,01001001,00101111,//G
40,0x7f,0x08,0x08,0x08,0x7f,//01111111,00001000,00001000,00001000,01111111,//H
41,0x00,0x41,0x7f,0x41,0x00,//00000000,01000001,01111111,01000001,00000000,//I
};
const char lcd_word_table3[]=
{
42,0x02,0x41,0x41,0x7e,0x40,//00000010,01000001,01000001,01111110,01000000,//J
43,0x7f,0x08,0x14,0x22,0x41,//01111111,00001000,00010100,00100010,01000001,//K
44,0x7f,0x01,0x01,0x01,0x01,//01111111,00000001,00000001,00000001,00000001,//L
45,0x7f,0x20,0x18,0x20,0x7f,//01111111,00100000,00011000,00100000,01111111,//M
46,0x7f,0x10,0x08,0x04,0x7f,//01111111,00010000,00001000,00000100,01111111,//N
47,0x3e,0x41,0x41,0x41,0x3e,//00111110,01000001,01000001,01000001,00111110,//O
48,0x7f,0x48,0x48,0x48,0x30,//11111111,01001000,01001000,01001000,00110000,//P
49,0x3e,0x41,0x45,0x42,0x3d,//00111110,01000001,01000101,01000010,00111101,//Q
50,0x7f,0x48,0x4c,0x4a,0x31,//01111111,01001000,01001100,01001010,00110001,//R
51,0x32,0x49,0x49,0x49,0x26,//00110010,01001001,01001001,01001001,00100110,//S
52,0x40,0x40,0x7f,0x40,0x40,//01000000,01000000,01111111,01000000,01000000,//T
53,0x7e,0x01,0x01,0x01,0x7e,//01111110,00000001,00000001,00000001,01111110,//U
54,0x7c,0x02,0x01,0x02,0x7c,//01111100,00000010,00000001,00000010,01111100,//V
55,0x7e,0x01,0x0e,0x01,0x7e,//01111110,00000001,00001110,00000001,01111110,//W
56,0x63,0x34,0x08,0x14,0x33,//01100011,00110100,00001000,00010100,01100011,//X
57,0x60,0x10,0x0f,0x10,0x60,//01100000,00010000,00001111,00010000,01100000,//Y
58,0x43,0x45,0x49,0x51,0x61,//01000011,01000101,01001001,01010001,01100001,//Z
59,0x00,0x7f,0x41,0x41,0x00,//00000000,01111111,01000001,01000001,00000000,//[
60,0x02,0x04,0x08,0x10,0x20,//00000010,00000100,00001000,00010000,00100000,//\//
61,0x00,0x41,0x41,0x7f,0x00,//00000000,01000001,01000001,01111111,00000000,//]
62,0x10,0x20,0x40,0x20,0x10,//00010000,00100000,01000000,00100000,00010000,//^
};
const char lcd_word_table4[]=
{
63,0x01,0x01,0x01,0x01,0x01 //00000001,00000001,00000001,00000001,00000001,//_
};
const char lcd_ico_table[]=
{
45,//S0
49,//S1
47,//S2
46,//S3
4,//S4
103,//S5
105,//S6
106,//S7
107,//S8
44,//S9
49,//S10
89,//P-P
96,//ALL
5,/*1A*/
7,/*1B*/
3,/*1C*/
9,/*1D*/
8,/*1E*/
6,/*1F*/
4,/*1G*/
10,/*2A*/
1,/*2B*/
13,/*2C*/
14,/*2D*/
0,/*2E*/
2,/*2F*/
12,/*2G*/
15,/*3A*/
29,/*3B*/
18,/*3C*/
19,/*3D*/
28,/*3E*/
30,/*3F*/
17,/*3G*/
20,/*4A*/
26,/*4B*/
23,/*4C*/
24,/*4D*/
25,/*4E*/
27,/*4F*/
22,/*4G*/
11,/*1P*/
16,/*2P*/
21/*3P*/
};
#define S0 0
#define S1 1
#define S2 2
#define S3 3
#define S4 4
#define S5 5
#define S6 6
#define S7 7
#define S8 8
#define S9 9
#define S10 10
#define p_p 11
#define ALL 12
#define A1 13
#define B1 14
#define C1 15
#define D1 16
#define E1 17
#define F1 18
#define G1 19
#define A2 20
#define B2 21
#define C2 22
#define D2 23
#define E2 24
#define F2 25
#define G2 26
#define A3 27
#define B3 28
#define C3 29
#define D3 30
#define E3 31
#define F3 32
#define G3 33
#define A4 34
#define B4 35
#define C4 36
#define D4 37
#define E4 38
#define F4 39
#define G4 40
#define P1 41
#define P2 42
#define P3 43
void display_ico(char ico,char flag)
{
if(flag)
iocc_data|=0x80;
else
iocc_data&=~0x80;
IOCB=lcd_ico_table[ico];
IOCC=iocc_data;
}
void init_lcd()
{
// char regdata;
regdata=IOCA;
regdata|=0xC0;
IOCA=regdata;
regdata=IOCE;
regdata|=0x28;
regdata&=~(0x14);
regdata|=0x0c;
IOCE=regdata;
regdata=RE;
regdata|=0x06;
RE=regdata;
}
//control RE bit1 and bit2
void turn_off_lcd()
{
regdata=RE;
regdata&=~0x06;
RE=regdata;
}
void blank_lcd()
{
regdata=RE;
regdata&=~0x04;
regdata|=0x02;
RE=regdata;
}
void enable_lcd()
{
regdata|=0x06;
RE=regdata;
}
void lcd_clear()
{
uchar i;
for(i=0;i<0x3b;i++)
{
IOCB=i;
IOCC=0x00;
}
for(i=0x40;i<0x7b;i++)
{
IOCB=i;
IOCC=0x00;
}
lcd_current_addr =0;
}
char indir_addr(const char *str,char i)
{
char data;
_asm
{
mov a,%i
mov 0x14,a
mov a, %str
mov 0x4,a
mov a,0x0
add a,0x14
mov %data,a
}
return data;
}
char indir_addr1(char *str,char i)
{
char data;
_asm
{
mov a,%i
mov 0x14,a
mov a, %str
mov 0x4,a
mov a,0x0
add a,0x14
mov %data,a
}
return data;
}
/*
* pos is LCD main display erea, from 0---19
*/
void lcd_display(uchar pos,const char *str, uchar len)
{
char addr;
char index;
char i=0,j=0;
char data;
while(len)
{
if( pos <DISPLAY_LINE_LEN/2)
{
if(pos%2)
{//odd
addr =(10-pos)*5 + ((pos-1)/2)*5 ;
}
else
{
//even
addr =(pos/2)*5 ;
}
}
else
{
if(pos%2)
{
//odd
addr= ((DISPLAY_LINE_LEN-pos-1)/2)*5 +0x40;
}
else
{
//even
addr =(((pos-10)/2)+1)*5+20+0x40;
}
}
data=indir_addr(str,i);
for(j=1;j<6;j++)
{
IOCB=addr +j-1;
iocc_data =0;
if(pos%2)
{
if(data>31 &&data <53)
{
index=data-32;
iocc_data|=lcd_word_table1[index*6 +(6-j)];
}
else if(data >52 &&data<74)
{
index=data-53;
iocc_data|=lcd_word_table2[index*6 +(6-j)];
}
else if(data >73 &&data<95)
{
index=data-74;
iocc_data|=lcd_word_table3[index*6 +(6-j)];
}
else if(data ==95)
{
index=data-95;
iocc_data|=lcd_word_table4[index*6 +(6-j)];
}
}
else
{
if(data>31 &&data <53)
{
index=data-32;
iocc_data|=lcd_word_table1[index*6 +j];
}
else if(data >52 &&data<74)
{
index=data-53;
iocc_data|=lcd_word_table2[index*6 +j];
}
else if(data >73 &&data<95)
{
index=data-74;
iocc_data|=lcd_word_table3[index*6 +j];
}
else if(data ==95)
{
index=data-95;
iocc_data|=lcd_word_table4[index*6 +j];
}
}
IOCC=iocc_data;
}
++pos;
--len;
++i;
}
lcd_current_addr =pos;
}
void lcd_append_str(const char *str,uchar len)
{
char pos;
if(lcd_current_addr+len >DISPLAY_LINE_LEN)
pos =0;
else
pos =lcd_current_addr;
lcd_display(pos,str,len);
}
char random()
{
return RD &0x07;
}
/*
* num is user ID,and return it's address in band ram
*/
short user_address(char num)
{
char band,odd;
band=num/2;
odd =num%2;
if(odd)
return (band*256);
else
return (band*256 +USER_BYTE_COINT);
}
void open_led()
{
regdata=IOC9;
regdata&=~0x04;
IOC9=regdata;
regdata=PORT9;
regdata|=0x04;
PORT9=regdata;
}
void close_led()
{
regdata=IOC9;
regdata&=~0x04;
IOC9=regdata;
regdata=PORT9;
regdata&=~0x04;
PORT9=regdata;
}
void delay_ms(short n)
{
uchar i = 0xA6;
while(--n)
while(--i)
;
}
void start_beep()
{
regdata=IOC9;
regdata&=~0x80;
IOC9=regdata;
regdata=PORT9;
regdata|=0x80;
PORT9=regdata;
}
void stop_beep()
{
regdata=IOC9;
regdata&=~0x80;
IOC9=regdata;
regdata=PORT9;
regdata&=~0x80;
PORT9=regdata;
}
void init_timer()
{
// char regdata;
regdata=RA;
regdata|=0x40;
RA=regdata;//set system clock 3.679Mhz
regdata=IOCE_PAGE1;
regdata|=0x10;//set counter1 use 3.679M,scale=1:1,counter2 use 32.678k,scale=1:1
IOCE_PAGE1=regdata;
RELOAD_TIMER1();
RELOAD_TIMER2();
}
indir char bank_num=0;
indir char offset=0;
indir char nbuf=0;//use save and restore
indir char bank_add=0;
indir short len_remnant=0;
void array_set(short pos,char *inbuf,short len)
{
short i;
/*
char bank_num=0;
char offset=0;
char nbuf;//use save and restore
char bank_add;
short len_remnant;
*/
bank_num = pos/256;
bank_add = bank_num;
bank_num <<=1;
offset=pos%256;
_asm
{
mov a,0x0
mov %nbuf, a
mov a, 0x04
mov %nbuf+1, a
bs 0x03, 7
bs 0x03, 6 //change to other(rpages)
IOR 0x0A
mov %nbuf+2,a //save band ram
}
//start array opreate
/*
ior 0x0a
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -