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

📄 最终程序.c

📁 电子秤的相关程序,?缱映拥南喙爻绦?电子秤的相关程序.
💻 C
📖 第 1 页 / 共 2 页
字号:
	 j=1;
     j=j<<i; //由高到低位传输数据
	 k=X&j;
	 if(k==0)	  //如果相应位是0则置零,反之亦然
        dio7289=0;
	 else
	    dio7289=1;
     clk7289=1; 					  //以下产生时钟信号
     for(delay=0;delay<5;delay++) ; // 延时 10us 
     clk7289=0; 
     for(delay=0;delay<5;delay++) ; // 延时 10us 
    } 
 dio7289=0; 
} 
short receive() //从7289接收按键值子程序 
{
 short i,X=0; 
 dio7289=1; //使端口处于可接收数据状态
 for(delay=0;delay<25;delay++); // 延时 50us 
 for(i=0;i<=7;i++) 
    {
     clk7289=1; 
     for(delay=0;delay<4;delay++); // 延时 10us 
     X=X<<1; 
     if(dio7289) 
	    X++; 
     clk7289=0; 
     for(delay=0;delay<4;delay++); // 延时 10us 
    } 
 dio7289=0; 
 return(X); 
} 
void keyin(void) interrupt 0 using 0 // 中断 0 服务程序 
{
 char i; 
 long int y; 
 send7289(0x15); // 接收数据 
 Key=receive(); 
 cs7289=1; 
 Key=Key&0x1f; 
 switch(Key) 
        {
         case 0xf : {
		              zongjia=zongjia+jine; 
		              qingdan[qb][0]=sh; 
		              qingdan[qb][1]=danjia[sh]; 
		              qingdan[qb][2]=shizhong; 
		              qingdan[qb][3]=jine; 
		              qb++; 
					  sh=0;
					  dot=0; 
		              danjia[0]=0; 
		              for(i=0;i<6;i++) 
					      jiage[i]=0; 
		             } break; // 累加键  
         case 0xe : pizhong=zhongliang; break; // 去当前皮重键
         case 0xd : {danjia[sh]=0;dot=0;} break; // 重写键 
         case 0xc : {
		              zongjia=0;
					  jine=0;
					  dot=0;
					  list=0;
                      qb=0;
					  pizhong=0; 
                      if(sh==0) 
                         danjia[sh]=0;} break; // 总清键 
         case 0xa : dot=1;break; // 小数点键 
         case 0xb : list=1;break; // 清单显示键 
         case 0x19 : sh=10;break;  //以下是商品键
         case 0x18 : sh=9;break; 
         case 0x17 : sh=8;break; 
         case 0x16 : sh=7;break; 
         case 0x15 : sh=6;break; 
         case 0x14 : sh=5;break; 
         case 0x13 : sh=4;break; 
         case 0x12 : sh=3;break; 
         case 0x11 : sh=2;break; 
         case 0x10 : sh=1;break; 
         case 0x1f : Key=0x1f;break;//向下翻页
         case 0x1e : Key=0x1e;break;//向上翻页
         case 0x1d : Key=0x1d;break;//显示清单时按此键显示总额等
         case 0x1c : 
         case 0x1a : break;   //确定键
         default   : { 
		               if(dot==0) 
                          {
						   jiage[0]=jiage[1];
						   jiage[1]=jiage[2];
						   jiage[2]=Key;
						  } 
		               if(dot==1) 
		                  {
						   jiage[4]=Key;
		                   dot++; 
						  } 
		               else if(dot==2) 
		                  {
						   jiage[5]=Key; 
		                   dot++;
						  } 
		               else if(dot>2) break; 
		               lcdi_send(0x84);// 显示程序
		               for(i=0;i<6;i++)
		                   lcdd_send(jiage[i]);
		               y=jiage[0]; 
		               y=y*10+jiage[1]; 
		               y=y*10+jiage[2]; 
		               y=y*10+jiage[4]; 
		               danjia[sh]=y*10+jiage[5]; 
					  } 
        } 
 while(key7289==0); // 等待键盘松开 
}



//AD 相关子程序
unsigned long int ad_max187(void)	  //MAX187 12位AD操作程序
{
 unsigned int result;
 unsigned char hbyte,lbyte, i;//hbyte存放高字节,lbyte存放低字节
 ad_delay();               //上电延时等待进入工作状态
 ad_CS = 0;                    //低电平有效,开始转换
 while(ad_DOUT==0);     //等待转换完成,因为DOUT会以一个高电平来标志转换完成
 hbyte=0;   //清空高字节
 ad_SCLK = 1; //产生时钟下降沿
 ad_SCLK = 0;
 //开始读数据
 for(i=0;i<=4;i++)  //将转换后的数据高4位存入hbyte
     {
      ad_SCLK = 1;  //SCLK置为高电平,可读取DOUT
      if(ad_DOUT==1)//若DOUT为1
         hbyte|=(1<<(3-i)); //将hbyte中的相应位置1
      ad_SCLK = 0;//产生下降沿,更新DOUT上的数据
      ad_SCLK = 0;
     }
 lbyte = 0;// 清空低字节
 for(i=0;i<=7;i++) //将转换后的数据高4位存入hbyte
     {
      ad_SCLK = 1; // SCLK置为高电平,可读取DOUT
      if(ad_DOUT==1) // 若DOUT为1
         lbyte|=(1<<(7-i)); //将lbyte中的相应位置1
      ad_SCLK = 0; // 产生下降沿,更新DOUT上的数据
      ad_SCLK = 0;
     }
 ad_CS = 1;//结束AD转换
 result=(unsigned int)(hbyte<<8)|lbyte;//合并
 return(result);//返回12为AD值
}



void ad_delay(void)  //延时,20ms@12MHz
{
 unsigned char i,j;
 for(i=1;i<=100;i++)
     for(j=1;j<=50;j++)
         {}
}
void d_change(long X) //将数据转换成字符串
{
 char bai,shi,ge,shifen,baifen,qianfen; 
 long int yu; 
 if(X>160000)
    baojing();
 bai =X/100000; 
 yu=X%100000; 
 shi=yu/10000; 
 yu=yu%10000; 
 ge=yu/1000; 
 yu=yu%1000; 
 shifen=yu/100;
 yu=yu%100; 
 baifen=yu/10; 
 qianfen=yu%10; 
 bai+=0x30; //将数字转换成相应的ASCII 码值
 shi+=0x30; 
 ge+=0x30; 
 shifen+= 0x30; 
 baifen+=0x30; 
 qianfen+=0x30;
 if(bai==0x30) //如果数字的高位上为0,则应转换成空格,但个位是0不可省
    {
     bai=0x20; 
     if(shi==0x30) 
        shi=0x20;
    } 
 shuju[0]=bai; //转换以后存入字符串里
 shuju[1]=shi; 
 shuju[2]=ge; 
 shuju[3]= '.'; 
 shuju[4]=shifen; 
 shuju[5]=baifen; 
 shuju[6]=qianfen; 
} 

void d_change1(long X) 
{
 char qian,bai,shi,ge,shifen,baifen; 
 long int yu; 
 qian=X/100000; 
 yu=X%100000; 
 bai=yu/10000; 
 yu=yu%10000; 
 shi=yu/1000; 
 yu=yu%1000; 
 ge=yu/100; 
 yu=yu%100; 
 shifen=yu/10; 
 baifen=yu%10; 
 qian=qian+0x30; 
 bai=bai+0x30; 
 shi=shi+0x30; 
 ge=ge+0x30; 
 shifen=shifen+0x30; 
 baifen=baifen+0x30; 
 if(qian==0x30) 
   {
    qian=0x20; 
    if(bai==0x30) 
      {
	   bai=0x20; 
       if(shi==0x30) 
	      shi=0x20; 
      } 
   } 
 shuju[0]=qian; 
 shuju[1]=bai; 
 shuju[2]=shi; 
 shuju[3]=ge; 
 shuju[4]='.'; 
 shuju[5]=shifen; 
 shuju[6]=baifen; 
} 

void baojing() 	//超重后报警
{
 short i; 
 for(i=0;i<50;i++) 
     {
      baoj=0; 
      for(delay=0;delay<10;delay++); 
      baoj=1; 
      for(delay=0;delay<10;delay++); 
     } 
} 

unsigned long zhenshizhi(unsigned long celiang)	//根据测量值自动选择量程,并得到真实值子程序
{
 unsigned long int real;
 int aa=lcxz;
 switch(aa)
    {case 1:
	     {
       	  if(celiang>=4000)
		     {
		      lcxz=0;
              ad_delay();
			  celiang=ad_max187();
		      real=celiang*40;
		     }
       	  else
		     {
		      real=celiang;
		     }
	     }break;
	 case 0:
	     {
	      if(celiang<=100)
		     {
		      lcxz=1;
              ad_delay();
			  celiang=ad_max187();
		      real=celiang; 
		     }
	      else if(celiang>=4000)
		     {
		      baijing();
		     }
	      else
		     {
		      real=celiang*40;
		     }
	     }break; 
    }
 return(real);
}

// 初始页面 
void ini() // 输入收银员编号 , 日期 
{
 short i=0,j; 
 char X; 
 lcdi_send(0x80); // 提示输入收银员编号  
 while(message1[i]) 
       lcdd_send(message1[i++]); 
 for(i=8;i<12;i++) 
    { 
     while(key7289); //等候按键输入
     send7289(0x15); // 接收数据 
     X=receive(); //将键值存放到X中
     cs7289=1; 
     bianhao[i]=X+0x30; //转换为ASCII码
     lcdi_send(0x93); 
     for(j=8;j<16;j++)
         lcdd_send(bianhao[j]); 
     while(key7289==0); //等待,直到释放按键
    } 

 lcdi_send(0x88); // 提示输入日期 
 i=0; 
 while(message2[i]) 
       lcdd_send(message2[i++]); 
 for(i=0;i<10;i++) // 输入日期 
    {
     if(i==4||i==7) i++; 
     while(key7289==1); //等候按键输入
           send7289(0x15); // 接收数据 
     X=receive(); 
     cs7289=1; 
     riqi[i]=X+0x30; 
     j=0; 
     lcdi_send(0x9a); 
     for(j=0;j<10;j++) 
         lcdd_send(riqi[j]); 
     while(key7289==0); //等待,直到释放按键
    } 

 while(key7289); 
 nop1(); 
 while(key7289==0); 
 nop1(); 
 lcdi_send(0x1);// 初始化第一页显示完毕后
}

⌨️ 快捷键说明

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