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

📄 jsq.plm

📁 多个C51的源代码,在KEIL C51上已调试通过
💻 PLM
字号:
START:  do;       
$INCLUDE(REG51.DCL)
	declare ok bit;
	declare (ms10,ms100) byte;
	declare delay byte;
	DECLARE (MODK,SDFLAG,DATA,LONG,K,DAT,ADDRL,addrh,n,I,j,FEND,FDISP) byte;
	DECLARE l(8) byte;
	declare (dl1,dl2) byte;
	DECLARE ACO(11) BYTE CONSTANT (03h,9fh,25h,0dh,99h,49h,
					  41h,1fh,01h,09h,00h);
	declare sda literally 'p13',sclk literally 'p14';  /*24C02囗线定义*/

time0:procedure interrupt 1 using 1;
	tr0=0;
	tl0=77h;
	th0=0ech;
	tr0=1;
	ms10=ms10+1;
	if ms10>=10 then do;
		ms10=0;
		ms100=ms100+1;
	end;
end time0;
DISPLAY:PROCEDURE(L0,L10); /*显示子程序*/
	DECLARE (L0,L10) BYTE; /*定义显示二位*/
	N=L10;                 /*最大L10*/
IF MODK=2 THEN         
  DO;                    /*十位闪动子程序*/
	IF SDFLAG=1 THEN       
	  do;                    
	sbuf=0ffh;             
	do while ti=0;         
	end;
	sdflag=0;              /*闪动标志置0*/
	  end;
	else                   
	  do;
	 n=aco(n);           /*十位数BCD码译成段码*/
		 sbuf=n;             
	 do while ti=0;      
		 end;
	 sdflag=1;           /*闪动标志置1*/
	  end;
end;
if modk<>2 then     
	do;
		   n=aco(n);           
		   sbuf=n;             
	   do while ti=0;     
	   end;
	end;
	n=L0;               /*个位闪动子程序*/
   if modk=1 then      
	 do;
	 if sdflag=1 then    
	 do;
		sbuf=0ffh;          
		do while ti=0;      
			end;
		sdflag=0;          
	 end;
   else               
	do;                
	   n=aco(n);          
	   sbuf=n;            
	   do while ti=0;     
	   end;
	   sdflag=1;          
	end;
	end;
  if modk<>1 then    
	 do;
	  n=aco(n);          /*个位BCD码译码*/
	  sbuf=n;            
	  do while ti=0;     
	  end;
	 end;
end display;       

sta24:  procedure;          /*起动24C02*/
	call time(2);
	sda=1;             
	call time(2);
	sclk=1;
	call time(2);
	sda=0;
	call time(2);
	sclk=0;
	call time(2);
	end sta24;

ask:    procedure;        /*等待回答*/
	call time(2);     /*延时*/
	sclk=1;
	call time(2);
	sda=1;
	call time(2);
/*        do while sda=1;
	end;   */
	call time(2);
	sclk=0;
	call time(2);
end ask;

stop:   procedure;       /*停止24C02*/
	call time(2);
	sda=0;
	call time(2);
	sclk=1;
	call time(2);
	sda=1;
	call time(2);
	sclk=0;
	call time(2);
	end stop;

shift:  procedure(da);       /*移位子程序(写入)单字节*/
	declare (i,da) byte;
	do i=0 to 7;
	da=scl(da,1);
	sda=cy;
	call time(2);
	sclk=1;
	call time(2);
	sclk=0;
	call time(2); 
	end;
end shift;  



read:   procedure;      /*读24C02*/
	declare i byte; 
	do i=0 to 7;    
	call time(2);   
	sda=1;          
	call time(2);
	sclk=1;
	call time(2);
	cy=sda;
	call time(2);
	dat=scl(dat,1);
	call time(2);
	sclk=0;
	call time(2); 
	end;
end read; 

rd24:   procedure;
	 declare i byte;
	 call sta24;
	 addrh=0;
	 addrh=addrh or 0a0h;
	 call shift(addrh);
	 call ask;
	 call shift(addrl);
	 call ask;
	/*     do i=1 to 2;  */
	   call sta24;
	   call shift(0a1h);
	   call ask;
	   call read;
	   n=dat;
	   call time(50);
   /*      end;   */
	 call stop;
end rd24;

wr24:   procedure;          /*write 24C02 8byte写入子程序 */
	declare i byte;     /**/
	call sta24;         /*起动24C02*/
	call shift(0A0h);   /*写入写指令*/
	call ask;           /*等待应答*/
	call time(4);
	call shift(addrl);  /*写入首地址*/
	call ask;           /*等 待*/
	do i=1 to 2;        /*写入2个字节*/
	   call shift(L(i));   
	   call ask;           
	end;
	call stop;          /*停止24C02*/
	call time(200);     
end wr24;                  /*结束写指令*/

key1:   procedure;          /*数字增加键子程序*/
	if p12=0 then       
	do;
	do while p12=0;
	end;

	if modk=1 then      /*如果个位数字闪动*/
	DO;
	L(1)=L(1)+1;        /*个位数加1*/
	IF L(1)>9 THEN L(1)=0; /*如果个位数大>9,循环是0*/
	END;
	if modk=2 then         
	DO;
	L(2)=L(2)+1;
	IF L(2)>9 THEN L(2)=0; 
	END;
	call display(L(1),L(2));
	call time(200);
	call time(200);
	DATA=L(1)+L(2)*10;      
	if ok=0 then addrl=00h;
	else addrl=02h;
	call wr24;
	end;
end key1;               

KEY2:   PROCEDURE;         /*mod */    
	CALL TIME(250);
	IF P33=0 THEN           
	 do;
	do while p33=0;
	end;

	MODK=MODK+1;            
	IF MODK=3 THEN          
	do;
		modk=0;                 
		DATA=L(1)+L(2)*10;      
		if ok=0 then addrl=00h;           
		else addrl=02h;
		call wr24;
	END;
	  CALL TIME(200);
	  CALL DISPLAY(L(1),L(2));
	 END;
END KEY2;               

KEY3:   PROCEDURE;              
	CALL TIME(250);         
	 IF P35=0 THEN           
	 do;
	DO WHILE P35=0;     /*  无此二句时按下P35键数字连续加上*/
	END;                    
if data>0 then do;
	DATA=DATA-1;            
	L(1)=DATA MOD 10;       
	L(2)=DATA/10;           
	IF DATA=00 THEN      
	 DO;
	   call display(l(1),l(2));
		   P37=0;                  /* P37口线低电平,继电器吸合*/
			 ms10=0;ms100=0;
			 do while ms100<delay; end;
		   P37=1;                  /*P37囗输出为高, 继电器放开 */
/* ================================================================*/
	   call time(200);
	   call time(200);
	   call time(200); 
		   call time(200);
		   call time(200);
		   call time(200); 
/* ================================================================*/  
	   ADDRL=00H;              
	   CALL RD24;              
	   l(1)=n;
	   addrl=01h;
	   call rd24;
	   l(2)=n;
	   DATA=L(1)+L(2)*10;       
	   call display(l(1),l(2));
	END;
	end;
 END;
 END KEY3;                
gal:procedure;
	ok=1;
	do while p12=0; end;
	l(1)=dl1;l(2)=dl2;
	call display(dl1,dl2);
LOOP1:  
		IF P12=0 THEN CALL KEY1; 
	IF P33=0 THEN CALL KEY2; 
	CALL DISPLAY(L(1),L(2)); 
	CALL TIME(254);      
GOTO LOOP1;               
end gal;
MAIN$PROGRAM:                    
	ea=0;
	SCON=00h;                
	PCON=00h;                
	tmod=11h;
	tr0=0;
	tl0=77h;
	th0=0ech;
	tr0=1;
	et0=1;
	enable;
	P1=0FFH;                 
	P35=1;                   
	SCLK=0;SDA=0;            
	ADDRL=02h;               
	CALL RD24;               
	dl1=n;
	addrl=03h;
	call rd24;
	dl2=n;
	ok=0;
	if p12=0 then call gal;
	ADDRL=00h;               
	CALL RD24;               
	l(1)=n;
	addrl=01h;
	call rd24;
	l(2)=n;
	DATA=L(1)+L(2)*10;       
	ADDRL=02h;               
	CALL RD24;               
	dl1=n;
	addrl=03h;
	call rd24;
	dl2=n;
	delay=dl1+dl2*10;       
	MODK=0;                  
LOOP:  
		IF P12=0 THEN CALL KEY1; 
	IF P33=0 THEN CALL KEY2; 
	IF P35=0 THEN CALL KEY3; 
	CALL DISPLAY(L(1),L(2)); 
	CALL TIME(254);      
GOTO LOOP;               
END START;               

⌨️ 快捷键说明

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