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

📄 复件 (2) lcd_input.c

📁 用SST89C58,对微型打印机和液晶的显示
💻 C
字号:
#include <reg51.h>
#include <math.h>
#include <stdio.h>
#include <absacc.h>
#include <intrins.h>
#include <string.h>
#include <stdlib.h>
#define  wcadd1 XBYTE[0xbf00]  //#define  wcadd1 XBYTE[0xfe00]  /* 写指令代码地址 */
#define  wdadd1 XBYTE[0x3f00]  //#define  wdadd1 XBYTE[0xfc00]  /* 写参数及显示数据地址 */
#define  rdadd1 XBYTE[0xbf00]  /* 读参数及显示数据地址 */
#define  rbadd1 XBYTE[0x3c00]  /* 读忙状态地址 */
#define  Io8155 XBYTE[0xef00]
#define  M8155  XBYTE[0xcf00]
#define  M8155_1 XBYTE[0xcf10]
#define  Io8155_A XBYTE[0xef01]
#define  Io8155_B XBYTE[0xef02]
typedef unsigned char uchar;
typedef unsigned int uint;
#define  PARA1 0x28;
#define  True  1
#define  False 0
void delay3(uint Tm_count);
void sound(bit f,uchar i);
void CCW22_PR(char O_X,char O_Y,code_1);
uchar key_in(void);
void RS_in();
void pass();
bit Send_c(uchar i);
void delay();
sbit Input_1 = P0^0;
sbit Input_2 = P0^1;
sbit Input_3 = P0^2;
sbit Input_4 = P0^3;
sbit Master  = P0^4;
sbit Second  = P0^5;
sbit Bad     = P0^6;
sbit Speak   = P0^7;

sbit LED_zd  = P1^4;
sbit LED_zl  = P1^5;
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;

sbit in1=P2^6;
sbit in2=P2^7;
sbit P00=P0^0;

sbit Maste=P3^1;
sbit Select=P3^0;

sbit P34=P3^4;
sbit P35=P3^5;
sbit P36=P3^6;
sbit P37=P3^7;
bit RUN; //电机运行壮态
bit Front;//电机前或后壮态 0/Front,1/back
bit Key;
bit RXD_D;
bit Busy;
uchar SAVE_D;
uchar TH0_T;
uchar TL0_T;
uchar V_k;
uchar speed;
code uchar DJ_F[]={0xFE,0xFA,0xFB,0xF9,0xFD,0xFC};
code uchar DJ_B[]={0xFE,0xFC,0xFD,0xF9,0xFB,0xFA};
code uchar DJ_V[3][2]={0xa6,0xe2,
                       0x49,0xb2,
                       0x48,0x64};

code uchar CGTAB[3][2]={0xba,0xe2,0x80,0xc1,0x10,0x80};
void main()
{
 uchar i,save;
 uchar cont;
 bit FLAG_1,FLAG_2;
 Busy = False;
 speed = 0; 
 SCON = 0x52;
 TMOD = 0x21;
 IP   = 0x07;
 TH1=TL1=0xF4;
 RXD_D  = 0;
 SAVE_D = 0;
 V_k    = 0;
 
 TH0_T = DJ_V[0][0];
 RUN   = 0;
 TL0_T = 0;
 EA    = 1;
 TR1   = 1;
 EX0   = 1;
 delay();
 pass();
 while (1)
 {
    
	cont = 0; FLAG_2 = 0;
    while (1)
    {   
	       if (RXD_D) RS_in();
           i = key_in();
	       if (RUN==0) {if (i == 6) break;}    /* 设定手动按键 */
           if (i==0) 
	       {
	             if (cont >= 200) { i = save; break;} 
			         else continue;
	       }
           if (save == i) {if(cont >= 200) continue; else cont++;}
	            else {save=i;cont=0;};
     }
     if (!Busy) 
	 {
	        FLAG_1 = Send_c(i);
	        if(FLAG_1==0) Bad=0;  else Bad=1;
     }
 }
}
//+++++++++++++++++++++++++++++++++++++++++
void RS_in()
{uchar i;

	            RXD_D=0;i=SAVE_D;SBUF=i;while(!TI);TI=0;
	              switch (i){
		            case 1: {Front=0;ET0=1;TR0=1;}break;  /* 电机反转 */
	                case 2: {Front=1;ET0=1;TR0=1;}break;  /* 电机正转 */
	                case 3: {ET0=0;TR0=0;P2|=0x07;}break; /* 电机停   */
	                case 4: {TH0_T=DJ_V[0][V_k];}break;   /* 每分钟8毫升 */
	                case 5: {TH0_T=DJ_V[1][V_k];}break;   /* 每分钟4毫升 */
	                case 6: 
					{
					       if (V_k == 0) speed = 1;
					       TH0_T = DJ_V[2][V_k];
					} break;   /* 每分钟2毫升 */
		        	case 7: 
                    {       
                             LED_zd = 0;                  /* 开治疗指示  */
							 RUN = 1;
                    } break;
		        	case 8:
                    {        
                             LED_zl = 0;                  /* 开诊断指示  */
                             RUN = 1;
                    } break;
		        	case 9: 
                    {        
                             LED_zd = 1;                  /* 关治疗指示  */
                             P1 |= 0x07; 
							 speed = 0;
                             RUN = 0;
                    } break;
		        	case 10:
                    {        
                             LED_zl = 1;                  /* 关诊断指示  */
                             P1 |= 0x07;
							 speed = 0;
                             RUN = 0;
                    }break;
                    case 11:V_k=0;break;                  /* 50ML注射器 */
                    case 12:V_k=1;break;                  /* 25ML注射器 */
                    case 13:{ RUN=~RUN;}break;            /* 发键连续关 */           
                    case 14: Busy=~Busy; break;           /*   主控忙   */        
                    default: break;
					}
  		       
}
//==========================================
bit Send_c(uchar i)
{uint j;
 bit FLAG_1=0;
      Second = False;
     if (Master==0) return(1);
  	    FLAG_1=0;
     for (j=0;j<65000;j++)
	   {  if (RXD_D) RS_in();  
	      if (Master==0) 
		    {i=~i;P0&=i;Second=1;
	 	      _nop_();_nop_();_nop_(); 
	 	      FLAG_1=1;P0|=0x3f;
	   	    } 
		     else continue;
			 break;
       }
        Second = True;
        return(FLAG_1);
}

//===========/*电机控制*/=================
void time_0(void) interrupt 1
{static uchar i,count; 
 uchar j;
     TR0 = 0;
      EA = 0;
     TH0 = TH0_T;
     TL0 = TL0_T;
     if ((V_k==0) && (TH0_T==0x48)) 
	 {
	      if (count >= speed) count = 0; else { count++; goto time_1;}
     }
	   
          if (i >= 5) i = 0;
          P1 |= 0x07;
          if (!Front) {j = DJ_F[i]; P1 &= j;}
             else {j = DJ_B[i]; P1 &= j;};
          i++;
	 
time_1:     EA=1;
            TR0=1;
}
void INT_0(void) interrupt 0
{uchar i,k; 
 bit s;
  EA=0;
  if (Second==0) {s=0;Second=1;} else s=1;
  //if (RXD_D) P24=0;else P24=1;
 for (k=0;k<0xff;k++)
   {
    if (Master!=0) continue;
     Second=0;
     while(!Master);
     _nop_();_nop_();_nop_();
	 i=P0;i|=0xf0;i=~i;
     SAVE_D=i;RXD_D=1;
	 break;
    }
  //if (RXD_D==0) LED_gz=0;else LED_gz=1;
 Second=s;
 
 EA=1;
}
/*按键处理*/
uchar key_in(void)
{  uchar i,j;
   
   P2=0xff;
   P2&=0xf8;
   _nop_();_nop_();_nop_();
   i=P2;
   i|=0xc7;
   _nop_();_nop_();_nop_();
   if (i==0xff) return(0);
   P2=i;j=i;
   i=P2;
   i|=0xf8;
   if (i==0xff) return(0);
   i&=j;Key=1;
  
   switch(i) 
     {case 0xf6: i=1; break;  //1
      case 0xf5: i=2; break;  //2
      case 0xf3: i=3; break;  //3
      case 0xee: i=4; break;  //4
      case 0xed: i=5; break;  //5
      case 0xeb: i=6; break;  //6
      case 0xde: i=7; break;  //7
      case 0xdd: i=8; break;  //8
      case 0xdb: i=9; break;  //p
     
     }
     return(i);
}

void delay(void)
{ uint i;
 for (i=0;i<20000;i++)
    {
         _nop_();
    }
}
/**********************************/
void pass()
{ uchar i;
       CCW22_PR(2,3,3);
 loop: 
       
       Maste=1;
   	   while (!Select);
	   P3=0xff;
	   Maste=0;
       while (Select);
	   i=P3;
	   i&=0xf0;
	   if (i!=0x50) {Maste=1;goto loop;}
       Maste=1;
}
/************************************/
/* 汉字写入函数 (图形方式)CCW2_PR   */
/* 连接字库:      CGTAB            */
/* 函数调用入口:  CCW2_PR()        */
/* 函数输入变量:  O_X,O_Y,CODE_1   */
/************************************/
void CCW22_PR(char O_X,char O_Y,code_1)
  {
    unsigned char count1;
    unsigned int i,j,a;
	a=0;
    i=PARA1;
    j=i*O_Y+O_X+0x01f0;   /* 如为320240屏k=j*O_Y+O_X+0x04ce*/
    wcadd1=0x4f;   /* CSRDIR 代码(下移) */
	Maste=0;
  for(i=0;i<2;i++)
      {
       wcadd1=0x46;      /* CSRW 代码 */
       wdadd1=j%256;     /* 设置光标地址CSR */
       wdadd1=j/256+0x40;
       wcadd1=0x42;    /* MWRITE 代码 */
       for(count1=i*16;count1<16*(i+1);count1++)
         {
         wdadd1=CGTAB[code_1][count1]; /* 写入数据 */
         }
       j=j+1;
       }
	   while (Select);
       P3&=0x5f;
  }
void sound(bit f,uchar i)
{
    for (;i>0;i--) 
    {
	    Speak = False;
		if (f) delay3(100); else delay3(50);
		Speak = True;
		if (i>0) delay3(50);
	}
}
/********定时1ms***********/
void delay3(uint Tm_count)
{
  uint i;
  while (Tm_count--)
  {
         for (i=0; i<125; i++) {};
  }
}

⌨️ 快捷键说明

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