function calc % Calculadora basica / Basic calculator. % % Ejemlos / Examples: % [AC] [1000] [+] [18] [%] [=] 1180 % [AC] [1000] [+] [18] [±] [%] [=] 820 % [AC] [1000] [-] [18] [%] [=] 820 % [AC] [100] [+] [10] [=] 110 % [AC] [100] [+] [10] [±] [=] 90 % [AC] [100] [+] [10] [C] [20] [=] 120 % [AC] [100] [+] [10] [=] 110 [=] 120 [=] 130 ... % % http://robotica.udl.cat % (c) Jordi Palacin 2011 global dades_calc hcalc = findobj('tag','CALC'); if (isempty(hcalc)) % crear la nueva figura hcalc = figure; set(hcalc,'numbertitle','off'); % treu el numero de figura set(hcalc,'name',[' ' mfilename ' 1.0']); % nom del fitxer set(hcalc,'MenuBar','none'); % treiem el menu d'icons set(hcalc,'doublebuffer','on'); % dos buffers de grafics set(hcalc,'tag','CALC'); % identifiquem la figura set(hcalc,'Resize','off'); set(hcalc,'Color',[0.92549 0.913725 0.847059]); p = get(hcalc,'Position'); set(hcalc,'Position',[p(1) p(2) 260 315]); try set(hcalc,'DockControls','off'); % evitar incrustar el figure catch % no fer res end % crear los botones uicontrol('Style','edit','String','0','Units','pixels','Position',[10 263 241 44],'FontSize',22,'FontWeight','normal','HorizontalAlignment','right','BackgroundColor',[1 1 1],'KeyPressFcn',@tecla_pulsada,'ButtonDownFcn',@Screen_b_button,'Tag','EDITCALC'); uicontrol('Style','pushbutton','String','MC','Units','pixels','Position',[9 213 42 39],'FontSize',14,'FontWeight','normal','Callback',@MC_button,'ForegroundColor',[1 0.5 0.5]); uicontrol('Style','pushbutton','String','MR','Units','pixels','Position',[59 213 42 39],'FontSize',14,'FontWeight','normal','Callback',@MR_button); uicontrol('Style','pushbutton','String','M-','Units','pixels','Position',[109 213 42 39],'FontSize',14,'FontWeight','normal','Callback',@Mminus_button); uicontrol('Style','pushbutton','String','M+','Units','pixels','Position',[159 213 42 39],'FontSize',14,'FontWeight','normal','Callback',@Madd_button); uicontrol('Style','pushbutton','String','÷','Units','pixels','Position',[209 213 42 39],'FontSize',17,'FontWeight','normal','Callback',@Bdiv_button); uicontrol('Style','pushbutton','String','%','Units','pixels','Position',[9 161 42 39],'FontSize',17,'FontWeight','normal','Callback',@Percent_button); uicontrol('Style','pushbutton','String','7','Units','pixels','Position',[59 161 42 39],'FontSize',17,'FontWeight','normal','Callback',@B7_button); uicontrol('Style','pushbutton','String','8','Units','pixels','Position',[109 161 42 39],'FontSize',17,'FontWeight','normal','Callback',@B8_button); uicontrol('Style','pushbutton','String','9','Units','pixels','Position',[159 161 42 39],'FontSize',17,'FontWeight','normal','Callback',@B9_button); uicontrol('Style','pushbutton','String','x','Units','pixels','Position',[209 161 42 39],'FontSize',17,'FontWeight','normal','Callback',@Bmul_button); uicontrol('Style','pushbutton','String','±','Units','pixels','Position',[9 110 42 39],'FontSize',17,'FontWeight','normal','Callback',@Sign_button); uicontrol('Style','pushbutton','String','4','Units','pixels','Position',[59 110 42 39],'FontSize',17,'FontWeight','normal','Callback',@B4_button); uicontrol('Style','pushbutton','String','5','Units','pixels','Position',[109 110 42 39],'FontSize',17,'FontWeight','normal','Callback',@B5_button); uicontrol('Style','pushbutton','String','6','Units','pixels','Position',[159 110 42 39],'FontSize',17,'FontWeight','normal','Callback',@B6_button); uicontrol('Style','pushbutton','String','-','Units','pixels','Position',[209 110 42 39],'FontSize',17,'FontWeight','normal','Callback',@Bsub_button); uicontrol('Style','pushbutton','String','C','Units','pixels','Position',[9 60 42 39],'FontSize',17,'FontWeight','normal','Callback',@C_button,'ForegroundColor',[1 0.5 0.5]); uicontrol('Style','pushbutton','String','1','Units','pixels','Position',[59 60 42 39],'FontSize',17,'FontWeight','normal','Callback',@B1_button); uicontrol('Style','pushbutton','String','2','Units','pixels','Position',[109 60 42 39],'FontSize',17,'FontWeight','normal','Callback',@B2_button); uicontrol('Style','pushbutton','String','3','Units','pixels','Position',[159 60 42 39],'FontSize',17,'FontWeight','normal','Callback',@B3_button); uicontrol('Style','pushbutton','String','+','Units','pixels','Position',[209 9 42 89],'FontSize',17,'FontWeight','normal','Callback',@Badd_button); uicontrol('Style','pushbutton','String','AC','Units','pixels','Position',[9 9 42 39],'FontSize',17,'FontWeight','normal','Callback',@AC_button,'ForegroundColor',[1 0.5 0.5]); uicontrol('Style','pushbutton','String','0','Units','pixels','Position',[59 9 42 39],'FontSize',17,'FontWeight','normal','Callback',@B0_button); uicontrol('Style','pushbutton','String','.','Units','pixels','Position',[109 9 42 39],'FontSize',17,'FontWeight','bold','Callback',@Bdot_button); uicontrol('Style','pushbutton','String','=','Units','pixels','Position',[159 9 42 39],'FontSize',17,'FontWeight','normal','Callback',@Bsolve_button); dades_calc.valor = '0'; dades_calc.valor_old = '0'; dades_calc.action = 'N'; dades_calc.memory = '0'; dades_calc.typing_ended = 1; dades_calc.tecla_pulsada = 0; else figure(hcalc); end % ######################################################################### % ######################################################################### function tecla_pulsada(hObject, eventdata) global dades_calc dades_calc.tecla_pulsada = 1; dades_calc.typing_ended = 0; % ######################################################################### % ######################################################################### function Screen_b_button(hObject, eventdata) % boton izquierdo = copiar en workspace evalin('base',['result_calc = ' get(findobj('Tag','EDITCALC'),'String')],'% nothing'); % ######################################################################### % ######################################################################### function MC_button(hObject, eventdata) global dades_calc dades_calc.memory = '0'; dades_calc.typing_ended = 1; % ######################################################################### % ######################################################################### function MR_button(hObject, eventdata) global dades_calc dades_calc.valor = dades_calc.memory; dades_calc.typing_ended = 0; % ejecutar la accion (copiar) display_screen(dades_calc.valor); % ######################################################################### % ######################################################################### function Mminus_button(hObject, eventdata) global dades_calc % recuperar numero en pantalla valor = get(findobj('Tag','EDITCALC'),'String'); dades_calc.memory = num2str(str2double(dades_calc.memory) - str2double(valor)); dades_calc.typing_ended = 1; % ######################################################################### % ######################################################################### function Madd_button(hObject, eventdata) global dades_calc % recuperar numero en pantalla valor = get(findobj('Tag','EDITCALC'),'String'); dades_calc.memory = num2str(str2double(dades_calc.memory) + str2double(valor)); dades_calc.typing_ended = 1; % ######################################################################### % ######################################################################### function Bdiv_button(hObject, eventdata) global dades_calc if dades_calc.tecla_pulsada % el numero en pantalla ha sido modificado dades_calc.valor = get(findobj('Tag','EDITCALC'),'String'); dades_calc.tecla_pulsada = 0; end if dades_calc.typing_ended == 0 % ejecutar la accion previa Bsolve_button(0,0); end dades_calc.action = 'D'; % division dades_calc.typing_ended = 1; % ######################################################################### % ######################################################################### function Percent_button(hObject, eventdata) global dades_calc if dades_calc.tecla_pulsada % el numero en pantalla ha sido modificado dades_calc.valor = get(findobj('Tag','EDITCALC'),'String'); dades_calc.tecla_pulsada = 0; end switch dades_calc.action case {'D','M','N'} display_screen('Error'); case {'S','R'} dades_calc.valor = num2str(str2double(dades_calc.valor_old) * str2double(dades_calc.valor)/100); display_screen(dades_calc.valor); end dades_calc.typing_ended = 1; % ######################################################################### % ######################################################################### function B7_button(hObject, eventdata) global dades_calc if dades_calc.typing_ended % inicio de nuevo numero dades_calc.typing_ended = 0; dades_calc.valor = '7'; else dades_calc.valor = [dades_calc.valor '7']; end display_screen(dades_calc.valor); % ######################################################################### % ######################################################################### function B8_button(hObject, eventdata) global dades_calc if dades_calc.typing_ended % inicio de nuevo numero dades_calc.typing_ended = 0; dades_calc.valor = '8'; else dades_calc.valor = [dades_calc.valor '8']; end display_screen(dades_calc.valor); % ######################################################################### % ######################################################################### function B9_button(hObject, eventdata) global dades_calc if dades_calc.typing_ended % inicio de nuevo numero dades_calc.typing_ended = 0; dades_calc.valor = '9'; else dades_calc.valor = [dades_calc.valor '9']; end display_screen(dades_calc.valor); % ######################################################################### % ######################################################################### function Bmul_button(hObject, eventdata) global dades_calc if dades_calc.tecla_pulsada % el numero en pantalla ha sido modificado dades_calc.valor = get(findobj('Tag','EDITCALC'),'String'); dades_calc.tecla_pulsada = 0; end if dades_calc.typing_ended == 0 % ejecutar la accion previa Bsolve_button(0,0); end dades_calc.action = 'M'; % multiplicacion dades_calc.typing_ended = 1; % ######################################################################### % ######################################################################### function Sign_button(hObject, eventdata) global dades_calc % si la pantalla y valor no coinciden copiarlos % cambiar el signo if dades_calc.valor(1) == '-' dades_calc.valor(1) = []; else dades_calc.valor = ['-' dades_calc.valor]; end display_screen(dades_calc.valor); % ######################################################################### % ######################################################################### function B4_button(hObject, eventdata) global dades_calc if dades_calc.typing_ended % inicio de nuevo numero dades_calc.typing_ended = 0; dades_calc.valor = '4'; else dades_calc.valor = [dades_calc.valor '4']; end display_screen(dades_calc.valor); % ######################################################################### % ######################################################################### function B5_button(hObject, eventdata) global dades_calc if dades_calc.typing_ended % inicio de nuevo numero dades_calc.typing_ended = 0; dades_calc.valor = '5'; else dades_calc.valor = [dades_calc.valor '5']; end display_screen(dades_calc.valor); % ######################################################################### % ######################################################################### function B6_button(hObject, eventdata) global dades_calc if dades_calc.typing_ended % inicio de nuevo numero dades_calc.typing_ended = 0; dades_calc.valor = '6'; else dades_calc.valor = [dades_calc.valor '6']; end display_screen(dades_calc.valor); % ######################################################################### % ######################################################################### function Bsub_button(hObject, eventdata) global dades_calc if dades_calc.tecla_pulsada % el numero en pantalla ha sido modificado dades_calc.valor = get(findobj('Tag','EDITCALC'),'String'); dades_calc.tecla_pulsada = 0; end if dades_calc.typing_ended == 0 % ejecutar la accion previa Bsolve_button(0,0); end dades_calc.action = 'R'; % resta dades_calc.typing_ended = 1; % ######################################################################### % ######################################################################### function C_button(hObject, eventdata) global dades_calc dades_calc.valor = '0'; dades_calc.typing_ended = 1; display_screen(dades_calc.valor); % ######################################################################### % ######################################################################### function B1_button(hObject, eventdata) global dades_calc if dades_calc.typing_ended % inicio de nuevo numero dades_calc.typing_ended = 0; dades_calc.valor = '1'; else dades_calc.valor = [dades_calc.valor '1']; end display_screen(dades_calc.valor); % ######################################################################### % ######################################################################### function B2_button(hObject, eventdata) global dades_calc if dades_calc.typing_ended % inicio de nuevo numero dades_calc.typing_ended = 0; dades_calc.valor = '2'; else dades_calc.valor = [dades_calc.valor '2']; end display_screen(dades_calc.valor); % ######################################################################### % ######################################################################### function B3_button(hObject, eventdata) global dades_calc if dades_calc.typing_ended % inicio de nuevo numero dades_calc.typing_ended = 0; dades_calc.valor = '3'; else dades_calc.valor = [dades_calc.valor '3']; end display_screen(dades_calc.valor); % ######################################################################### % ######################################################################### function Badd_button(hObject, eventdata) global dades_calc if dades_calc.tecla_pulsada % el numero en pantalla ha sido modificado dades_calc.valor = get(findobj('Tag','EDITCALC'),'String'); dades_calc.tecla_pulsada = 0; end if dades_calc.typing_ended == 0 % ejecutar la accion previa Bsolve_button(0,0); end dades_calc.action = 'S'; % suma dades_calc.typing_ended = 1; % ######################################################################### % ######################################################################### function AC_button(hObject, eventdata) global dades_calc dades_calc.valor = '0'; dades_calc.valor_old = '0'; dades_calc.typing_ended = 1; dades_calc.action = 'N'; display_screen(dades_calc.valor); % ######################################################################### % ######################################################################### function B0_button(hObject, eventdata) global dades_calc if dades_calc.typing_ended % inicio de nuevo numero dades_calc.typing_ended = 0; dades_calc.valor = '0'; else dades_calc.valor = [dades_calc.valor '0']; end display_screen(dades_calc.valor); % ######################################################################### % ######################################################################### function Bdot_button(hObject, eventdata) global dades_calc if dades_calc.typing_ended % inicio de nuevo numero dades_calc.typing_ended = 0; dades_calc.valor = '0.'; else dades_calc.valor = [dades_calc.valor '.']; end display_screen(dades_calc.valor); % ######################################################################### % ######################################################################### function Bsolve_button(hObject, eventdata) global dades_calc if dades_calc.tecla_pulsada % el numero en pantalla ha sido modificado dades_calc.valor = get(findobj('Tag','EDITCALC'),'String'); dades_calc.tecla_pulsada = 0; end switch dades_calc.action case {'N'} % nada dades_calc.valor_old = dades_calc.valor; case {'D'} % dividir dades_calc.valor_old = num2str(str2double(dades_calc.valor_old) / str2double(dades_calc.valor)); dades_calc.typing_ended = 1; case {'M'} % multiplicar dades_calc.valor_old = num2str(str2double(dades_calc.valor_old) * str2double(dades_calc.valor)); dades_calc.typing_ended = 1; case {'R'} % restar dades_calc.valor_old = num2str(str2double(dades_calc.valor_old) - str2double(dades_calc.valor)); dades_calc.typing_ended = 1; case {'S'} % sumar dades_calc.valor_old = num2str(str2double(dades_calc.valor_old) + str2double(dades_calc.valor)); dades_calc.typing_ended = 1; end display_screen(dades_calc.valor_old); % ######################################################################### % ######################################################################### function display_screen(text) set(findobj('Tag','EDITCALC'),'String',text); % #########################################################################