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

📄 keyboard.c

📁 用C8051F020实现的基于TCP/IP协议的虚功率源。C8051F020外接LCD,键盘,USB接口
💻 C
📖 第 1 页 / 共 4 页
字号:
#include"keyboard.h"
#include"..\config\function_declaration.h"
#include"..\lxi\socket.h"

void ch451_init(void)
{
	uchar i;
	uint command = 0x0402;		//0x0402命令:键盘扫描使能
	EA = 0;
	LOAD = 0;						//命令开始       
  	for(i=0;i<12;i++)				//送入12位数据,低位在前
		{
    		DIN = command & 1;
    		DCLK = 0;
    		command >>= 1;
    		DCLK = 1;           	//上升沿有效
  		}
	LOAD = 1;						//加载数据
	EA = 1;
}

uchar read_key_value(void)
{
	uchar i;
	uchar command,keycode;			//定义命令字,和数据存储器
	EA = 0;							//关中断	
  	command = 0x07;			        //输入读CH451命令字	
	LOAD = 0;
  	for(i=0;i<4;i++)
		{
    		DIN = command & 1;		//送入最低位
    		DCLK = 0;			 
    		command >>= 1;			//右移一位
			DCLK = 1;			    //产生时钟上升沿锁通知CH451输入位数据
 		}
	LOAD = 1;				    	//产生加载上升沿通知CH451处理命令数据
  	keycode = 0;				    //清除keycode
  	for(i=0;i<7;i++)
		{
    		keycode <<= 1;			//数据移入keycode,高位在前,低位在后
    		keycode |= DOUT;		//从高到低读入CH451的数据
    		DCLK = 0;			    //产生时钟下升沿通知CH451输出下一位
    		DCLK = 1;
 		}
	EA = 1;
	return keycode;			    	//返回键值
}

void keyboard(void) interrupt 18
{
	uchar i,key_value;
	char j;
	uint power_10;
	EIE2 = 0x00;						//IE6(for keyboard)中断禁止
	key_value = read_key_value();
	if(Oper==1)
		{
			if(key_value==OPER_KEY)
				Oper = 0;
			P3IF = 0x00;
			EIE2 = 0x10;				//IE6(for keyboard)中断允许
			return;
		}
	switch(key_value)
		{
			case MENU_KEY:
				{
					Interface = MENU_SCREEN;
					Line = 1;
					Input = 0;
					lcd_clear();
					interface_menu();
				}
			break;
			case OPER_KEY:
				{
					Oper = 1;
				}
			break;
			case ESC_KEY:
				{
					if(Interface==MAIN_SCREEN)
						{
							for(i=0;i<5;i++)
								{
									value_u_tmp[i] = value_u[i];
									value_i_tmp[i] = value_i[i];
									value_fi_tmp[i] = value_fi[i];
								}
							for(i=0;i<2;i++)
								{
									value_f_tmp[i] = value_f[i];
								}
							Line = 0;	
							interface_main();
						}
					if(Interface==RS232C_SCREEN)
						{
							if(Line==1)
								{
									for(i=0;i<6;i++)
										{
											value_baudrate_tmp[i] = value_baudrate[i];
										}
								}
							if(Line==2)
								{
									value_datadigit_tmp[0] = value_datadigit[0];
								}
							if(Line==3)
								{
									value_stopdigit_tmp[0] = value_stopdigit[0];
								}
							Line = 0;	
							interface_rs232c();
						}
					if(Interface==LXI_SCREEN)
						{
							if(Line==1)
								{
									for(i=0;i<15;i++)
										{
											value_ip_tmp[i] = value_ip[i];
										}
								}
							if(Line==2)
								{
									for(i=0;i<15;i++)
										{
											value_mask_tmp[i] = value_mask[i];
										}
								}
							if(Line==3)
								{
									for(i=0;i<15;i++)
										{
											value_gateway_tmp[i] = value_gateway[i];
										}
								}
							if(Line==4)
								{
									for(i=0;i<15;i++)
										{
											value_dns_tmp[i] = value_dns[i];
										}
								}
							Line = 0;	
							interface_lxi();
						}
					Input = 0;
				}
			break;
			case BACKSPACE_KEY:
				{	if(value_count==0)
						break;
					if(Input==1)
						{
							Cursor--;
							display_digit(Cursor,Yy_value,'_');
							if(Interface==MAIN_SCREEN)
								{
									if(Line==1)
										{
											if(point_exist==0)
												{
													value_u_tmp[value_count] = '0';
													value_count--;
													value_u_tmp[value_count] = '.';
												}
											else
												{
													value_count--;
													value_u_tmp[value_count] = '0';
												}
										}
									if(Line==2)
										{
											if(point_exist==0)
												{
													value_i_tmp[value_count] = '0';
													value_count--;
													value_i_tmp[value_count] = '.';
												}
											else
												{
													value_count--;
													value_i_tmp[value_count] = '0';
												}
										}
									if(Line==3)
										{
											value_count--;
											value_f_tmp[value_count] = '0';
										}
									if(Line==4)
										{
											if(point_exist==0)
												{
													value_fi_tmp[value_count] = '0';
													value_count--;
													value_fi_tmp[value_count] = '.';
												}
											else
												{
													value_count--;
													value_fi_tmp[value_count] = '0';
												}
										}
								}
							if(Interface==RS232C_SCREEN)
								{
									if(Line==1)
										{
											value_count--;
											value_baudrate_tmp[value_count] = 0x00;
										}
									if(Line==2)
										{
											value_count--;
											value_datadigit_tmp[value_count] = 0x00;
										}
									if(Line==3)
										{
											value_count--;
											value_stopdigit_tmp[value_count] = 0x00;
										}
								}
							if(Interface==LXI_SCREEN)
								{
									if(Line==1)
										{
											value_count--;
											value_ip_tmp[value_count] = '0';
										}
									if(Line==2)
										{
											value_count--;
											value_mask_tmp[value_count] = '0';
										}
									if(Line==3)
										{
											value_count--;
											value_gateway_tmp[value_count] = '0';
										}
									if(Line==4)
										{
											value_count--;
											value_dns_tmp[value_count] = '0';
										}
								}
						}
				}
			break;
			case ADDSUB_KEY:
				{
				}
			break;
			case ENTER_KEY:
				{
					if(Interface==MAIN_SCREEN)
						{
							for(i=0;i<5;i++)
								{
									value_u[i] = value_u_tmp[i];
									value_i[i] = value_i_tmp[i];
									value_fi[i] = value_fi_tmp[i];
								}
							for(i=0;i<2;i++)
								{
									value_f[i] = value_f_tmp[i];
								}
							Line = 0;	
							interface_main();
//**************************计算电压和电流值**********************
							i = 0;
							voltage = 0;
							power_10 = 10;
							while(value_u[i]!='.')
								{
									voltage = voltage*10 + (value_u[i] - 0x30);
									i++;
								}
							i = i + 1;
							while(i < 5)
								{
									voltage = voltage + ((float)value_u[i] - 0x30)/power_10;
									power_10 = power_10*10;
									i++;
								}

							i = 0;
							current = 0;
							power_10 = 10;
							while(value_i[i]!='.')
								{
									current = current*10 + (value_i[i] - 0x30);	
									i++;
								}
							i++;
							while(i < 5)
								{
									current = current + ((float)value_i[i] - 0x30)/power_10;
									i++;
								}

							power = voltage*current;
							i = 0;
							j = 0;
							while(power >= 10)
								{
									power = power/10;
									j++;
								}
							while(j >= 0)
								{
									value_p[i] = power;
									power = power - value_p[i];
									value_p[i] = value_p[i] + 0x30;
									power = power*10;
									i++;
									j--;
								}
							value_p[i] = '.';
							i++;
							while(i < 5)
								{
									value_p[i] = power;
									power = power - value_p[i];
									value_p[i] = value_p[i] + 0x30;
									power = power*10;
									i++;
								}
							Line = 0;	
							interface_main();
						}
					if(Interface==RS232C_SCREEN)
						{
							if(Line==1)
								{
									for(i=0;i<6;i++)
										{
											value_baudrate[i] = value_baudrate_tmp[i];
										}
								}
							if(Line==2)
								{
									value_datadigit[0] = value_datadigit_tmp[0];
								}
							if(Line==3)
								{
									value_stopdigit[0] = value_stopdigit_tmp[0];
								}
							Line = 0;	
							interface_rs232c();
//**************************改变串口波特率**********************
							if(value_baudrate[0]=='1')
								{
									if(value_baudrate[1]=='1')	//115200
										timer1_init(0xFA);
									if(value_baudrate[1]=='9')	//19200
										timer1_init(0xDC);
								}
							if(value_baudrate[0]=='5')			//57600
								timer1_init(0xF4);
							if(value_baudrate[0]=='3')			//38400
								timer1_init(0xEE);
							if(value_baudrate[0]=='9')			//9600
								timer1_init(0xB8);
							if(value_baudrate[0]=='4')			//4800
								timer1_init(0x70);
						}
					if(Interface==LXI_SCREEN)
						{
							if(Line==1)
								{
									for(i=0;i<15;i++)
										{
											value_ip[i] = value_ip_tmp[i];
										}
									
									i = 0;
									w3100_ip[0] = 0;
									while(value_ip[i]!='.')
										{
											w3100_ip[0] = w3100_ip[0]*10 + (value_ip[i] - 0x30);
											i++;
										}
									i++;
									w3100_ip[1] = 0;
									while(value_ip[i]!='.')
										{
											w3100_ip[1] = w3100_ip[1]*10 + (value_ip[i] - 0x30);
											i++;
										}
									i++;
									w3100_ip[2] = 0;
									while(value_ip[i]!='.')
										{
											w3100_ip[2] = w3100_ip[2]*10 + (value_ip[i] - 0x30);
											i++;
										}
									i++;
									w3100_ip[3] = 0;
									while(value_ip[i]!=0x00)
										{
											w3100_ip[3] = w3100_ip[3]*10 + (value_ip[i] - 0x30);
											i++;
										}
									setIP(w3100_ip);
									sysinit(0x03,0x03);
								}
							if(Line==2)
								{
									for(i=0;i<15;i++)
										{
											value_mask[i] = value_mask_tmp[i];
										}

									i = 0;
									w3100_ip[0] = 0;
									while(value_ip[i]!='.')
										{
											w3100_ip[0] = w3100_ip[0]*10 + (value_ip[i] - 0x30);
											i++;
										}
									i++;
									w3100_ip[1] = 0;
									while(value_ip[i]!='.')
										{
											w3100_ip[1] = w3100_ip[1]*10 + (value_ip[i] - 0x30);
											i++;
										}
									i++;
									w3100_ip[2] = 0;
									while(value_ip[i]!='.')
										{
											w3100_ip[2] = w3100_ip[2]*10 + (value_ip[i] - 0x30);
											i++;
										}
									i++;
									w3100_ip[3] = 0;
									while(value_ip[i]!=0x00)
										{
											w3100_ip[3] = w3100_ip[3]*10 + (value_ip[i] - 0x30);
											i++;
										}
									setsubmask(w3100_ip);
									sysinit(0x03,0x03);
								}
							if(Line==3)
								{
									for(i=0;i<15;i++)
										{
											value_gateway[i] = value_gateway_tmp[i];
										}

									i = 0;
									w3100_ip[0] = 0;
									while(value_ip[i]!='.')
										{
											w3100_ip[0] = w3100_ip[0]*10 + (value_ip[i] - 0x30);
											i++;
										}
									i++;
									w3100_ip[1] = 0;
									while(value_ip[i]!='.')
										{
											w3100_ip[1] = w3100_ip[1]*10 + (value_ip[i] - 0x30);
											i++;
										}
									i++;
									w3100_ip[2] = 0;
									while(value_ip[i]!='.')
										{
											w3100_ip[2] = w3100_ip[2]*10 + (value_ip[i] - 0x30);
											i++;
										}
									i++;
									w3100_ip[3] = 0;
									while(value_ip[i]!=0x00)
										{
											w3100_ip[3] = w3100_ip[3]*10 + (value_ip[i] - 0x30);
											i++;
										}
									setgateway(w3100_ip);
									sysinit(0x03,0x03);
								}
							if(Line==4)
								{
									for(i=0;i<15;i++)
										{
											value_dns[i] = value_dns_tmp[i];
										}
								}
							Line = 0;
							interface_lxi();
						}
					Input = 0;
				}
			break;
			case A_KEY:
				{
					switch(Interface)
						{
							case MAIN_SCREEN:
								{
									Line = 1;
									Input = 1;
									Yy_value = 24;
									value_count = 0;
									point_exist = 0;
									for(i=0;i<5;i++)
										{
											value_u_tmp[i] = '0';
										}
									interface_main();
								}
							break;
							case MENU_SCREEN:
								{
									if(Line==1)
										{
											Line = 0;
											Interface = MAIN_SCREEN;
											lcd_clear();	
											interface_main();
										}
									if(Line==2)
										{
											Line = 1;
											Interface = COMMUNICATION_SCREEN;
											lcd_clear();	
											interface_communication();
										}
								}
							break;
							case COMMUNICATION_SCREEN:
								{
									if(Line==1)
										{
											Line = 0;
											Interface = RS232C_SCREEN;
											lcd_clear();
											interface_rs232c();
										}
									if(Line==3)
										{
											Line = 0;
											Interface = LXI_SCREEN;
											lcd_clear();
											interface_lxi();
										}
								}
							break;
						}

⌨️ 快捷键说明

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