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

📄 jijiaqi.c

📁 一个电子秤的论文与代码,和大家一起分享学习,共同进步!
💻 C
字号:
#include<absacc.h>
#include<reg51.h>
	
#define uchar unsigned char
#define uint unsigned int
#define w_c_add XBYTE[0x2070]  /* LCD写命令字地址 */
#define w_d_add XBYTE[0x2071]  /* LCD写数据地址 */
#define r_s_add XBYTE[0x2072]  /* LCD读状态字地址 */ 
#define r_d_add XBYTE[0x2073]  /* LCD读数据地址 */
#define COM XBYTE[0x2021]      /*8279命令状态口地址*/
#define DAT XBYTE[0x2020]      /*8279数据口地址*/

void dispzfs(uchar ajj,uchar t1,uchar t2);
void dispzf(uchar akk,uchar s);
void displcd(uchar add,uint x);
void lcd_busy(void) ;

uchar code num[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
         /*LCD字符表  0    1    2    3    4    5    6    7    8    9   */
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80,0x7c};
      /* LED字型表   0     1    2   3    4    5    6    7    8    9    .   确定 */
uchar zj[]={"总价:  "};
uchar sj[]={"时间:   "};
uchar sd[]={"速度:   "};
uchar dj[]={"单价:   "};

uchar bdata status;	        /* 可位寻址片内数据存储器,允许位与字节混合访问 */
sbit busy=status^7;
sbit clflag=ACC^6;          /*建立清除标志*/
uchar bdata count,count1;
uint shu1,shu2,time,sudu,min; 
uchar jian[]={ 0,0,0,0};
uchar ds1,ds2,money,danjia;
uchar key1,key2,key3,key4;
//////////////////////////////*一毫秒延时*//////////////////////////////////
void delay(uchar x)
{  		
     uchar j;
     while(x--)
     {
       for(j=0;j<125;j++)
     	   {;}
     }
}
////////////////////////////////*8279初始化*////////////////////////////////
void set8279()
{
  COM=0xd1;          /* 总的清除命令        */
  do {ACC=COM;}
  while(clflag==1); /* 读状态字,等待清除结束*/
  COM=0x00;         /* 8字符显示左入口      */
  COM=0x23;         /* 12分频              */
}
////////////////////////////*判断FIFO键按下函数*/////////////////////////////
uchar deky(void)
{ 
  uchar k;
  k=COM;
  return(k&0x0f);            /*有键按下*/
}
////////////////////////////////*取键值函数*//////////////////////////////////
uchar keyin(void)
{ 
  uchar i;
  while(deky()==0);          /*无键按下等待*/
  COM=0x40;                  /*读FIFO RAM命令*/
  i=DAT;
  i=i&0x3f;                  /*取键值低6位*/
  return(i);                 /*返回键值*/
}
//////////////////////////////////*键盘显示函数*///////////////////////////////
void disp(uchar j,uchar x)          
{	 
	 COM=0x80+j;
	 DAT=table[x];
}
//////////////////////////////////*按键设定单价*///////////////////////////////
void keyscan(void)
{ 
  COM=0xd1;                  /* 总的清除命令 */
  do {ACC=COM;}
  while(clflag==1);          /* 读状态字,等待清除结束 */
  COM=0x00;                  /* 8字符显示左入口 */
  COM=0x23;                  /* 12分频 */
  for(;;)
  {  
  	 key1=keyin();           /*有键按下,取键值*/
  	 if(key1==0x0b)          /*判断是否为确认键,是即跳出*/
     {break;}
     disp(0,key1);           /*在0x80处显示键值*/
     
     key2=keyin();           /*有键按下,取键值*/
     if(key2==0x0b)          /*判断是否为确认键,是即跳出*/
     {break;}
     disp(1,key2);           /*在0x81处显示键值*/
     
     key3=keyin();           /*有键按下,取键值*/
     if(key3==0x0b)          /*判断是否为确认键,是即跳出*/
     {break;}
     disp(2,key3);           /*在0x82处显示键值*/
     
     key4=keyin();           /*有键按下,取键值*/
     if(key4==0x0b)          /*判断是否为确认键,是即跳出*/
     {break;}
     disp(3,key4);           /*在0x83处显示键值*/
   }
     return;
}
/////////////////////////////////*LCD忙状态检测函数 *///////////////////////////	
void lcd_busy(void)   /*LCD忙状态检测函数 */
{
	do 
	{
  	  status=r_s_add;  /* 读状态字地址的第7位 */
	}	
	while(busy);
}
//////////////////////////////////////*LCD初始化*///////////////////////////////
void setlcd(void)
{
	lcd_busy();
	w_c_add=0x30;   /* 功能设置:8位数据 */
	lcd_busy();     
	w_c_add=0x0C;   /* 显示状态:整体显示,游标位置无效*/
	lcd_busy();
	w_c_add=0x01;   /* 清除显示:将DDRAM填满“20H”,并且设定DDRAM的地址计数器到“00”*/
	lcd_busy();
	w_c_add=0x02;   /* 地址归位:设定DDRAM的地址计数器到“00”,将游标移到开头原点位置 */
}	
////////////////////////////////////*速度转换与显示*/////////////////////////////
void displcd(uchar add,uint x)
{	
	uchar ds3,ds4,ds5;           /*定义速度值*/
	lcd_busy();
	w_c_add=add;                 /*送显示地址*/
	lcd_busy();
	ds3=x/100%10;                /*数值转换*/
	ds4=x/10%10;
	ds5=x%10;
    w_d_add=num[ds3];            /*速度显示*/
		lcd_busy();
	w_d_add=num[ds4];
		lcd_busy();
	w_d_add=num[ds5];  
	dispzf(0x95,0x4d);               /*速度单位显示*/
	dispzf(0x96,0x2f);
	dispzf(0x97,0x6d);
 }
///////////////////////////////*LCD行显示*//////////////////////////////////
void displcd1(uchar add,uchar *p)
{
	int q;
    lcd_busy();
	w_c_add=add;                   /* 送命令 */
	for(q=0;q<4;q++)               /*循环显示*/
	{
		lcd_busy();
    	w_d_add=p[2*q];	
		w_d_add=p[2*q+1]; 
	}
}
//////////////////////////////////*LCD显示单价*///////////////////////////////
void dispdanjia(void)
{
	lcd_busy();
    w_c_add=0x83;              /*送显示起始地址*/
    lcd_busy();
    w_d_add=num[key1];		   /*在":"后显示单价整数位*/
    lcd_busy();
    w_d_add=0x2e;              /*显示小数点*/
    lcd_busy();
    w_d_add=num[key3];         /*写单价小数位*/
    lcd_busy();
    dispzfs(0x85,0xa3,0xa4);   /*显示单位*/
    dispzfs(0x86,0xa3,0xaf);
    dispzfs(0x87,0xa3,0xcd);
}
///////////////////////////*定时/计数器初始化*/////////////////////////////////
void init(void)           
{
	time=0;                    /*显示时间初始值为0*/
	money=7;                   /*显示总价初始值为7*/
	count=0;
	count1=0;
	set8279();                 /*8279初始化*/
	setlcd();                  /*LCD初始化*/
	TMOD=0x50;                 /*设置定时/计数器工作方式*/
	EA=1;                      /*开中断*/
	ET0=1;
	ET1=1;
	TR0=1;                     /*启动定时器*/
	TR1=1;                     /*启动计数*/
	TH1=0x00;                  /*计数器赋初值*/
	TL1=0x00;
	EX0=1;                     /*开外部中断INT0*/
	IT0=1;                     /*设置外部中断INT0触发方式*/
	PX0=1;                     /*设置外部中断INT0为高优先级*/
	TH0=(65536-50000)/256;     /*定时器赋初值定时50ms*/
 	TL0=(65536-50000)%256;
}
///////////////////////* T0中断服务函数完成1s定时*////////////////////////////
void T0_srv (void) interrupt 1 using 1 
{  
   TH0=(65536-50000)/256;      /*定时50ms赋初值*/
   TL0=(65536-50000)%256;
   count++;                    /*50ms到,标志+1*/
   if(count==20)               /*1秒到*/
     { 
       count1++;               /*秒计数*/
       time++;
       TR1=0;                  /*停止计数*/
       count=0;
       ds1=TH1;                /*由T1读取速度*/
       ds2=TL1;
       TH1=0x00;               /*T1重新计数*/
	   TL1=0x00;
       TR1=1;                  /*启动计数*/
       shu1=ds1*256+ds2;       /*速度值转化*/
       shu2=shu1*24/60;        /*将速度转化为一个合适值*/
       sudu=shu2/40;
       if(count1==60)
       {
        	count1=0;
        	if(shu2<40)        /*当速度<40时,按速度为40计价*/
        	money=money+1*danjia; 
        	money=money+sudu*danjia;      /*总价*/
    	}
     }
}
///////////////////////////////////////*单字符显示程序*//////////////////////////////////
void dispzf(uchar akk,uchar s)
{
	lcd_busy();
    w_c_add=akk;               /*送显示地址*/
    lcd_busy();
    w_d_add=s;	               /*送显示值*/
}
/////////////////////////////////////*双字符显示程序*///////////////////////////////////
void dispzfs(uchar ajj,uchar t1,uchar t2)
{
	lcd_busy();
	w_c_add=ajj;               /*送显示地址*/
    lcd_busy();
    w_d_add=t1;                /*送显示值*/
    lcd_busy();
    w_d_add=t2;
}
////////////////////////////////*主函数*/////////////////////////////////////////
void main(void)
{ 	
	init();                               /*初始化程序*/
	setlcd();                             /*LCD初始化*/
   	keyscan();                            /*按键设定单价*/
  	danjia=key1+key3*0.1;
	while(1)                              
		{
			displcd1(0x80,&dj[0]);           /*单价显示*/
			dispdanjia();
			
			displcd1(0x90,&sd[0]);           /*速度显示*/
			displcd(0x93,shu2);              
			delay(10);                       
			min=time/60;                       /*以分计时*/
			
			displcd1(0x88,&sj[0]);           /*时间显示*/
			displcd(0x8b,min);
			dispzf(0x8d,0x20);
			dispzf(0x8e,0x6d);
			delay(10);
			
			displcd1(0x98,&zj[0]);           /*总价显示*/
			displcd(0x9b,money);
			dispzfs(0x9d,0xa3,0xa4);
			delay(10);
		}
}

⌨️ 快捷键说明

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