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

📄 morse.c

📁 用在EM78860单片机制作的摩斯密码机源文件
💻 C
📖 第 1 页 / 共 3 页
字号:

#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 + -