12电子秤程序.docx
《12电子秤程序.docx》由会员分享,可在线阅读,更多相关《12电子秤程序.docx(23页珍藏版)》请在冰豆网上搜索。
12电子秤程序
程序
/********************头文件***********************/
#include
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#definedelayNOP();{_nop_();_nop_();_nop_();_nop_();};
#defineAD_dataP1//AD数据口
#defineLCD_dataP0//液晶数据口
/********************函数声明*********************/
voiddisplay_weigh();
voidAlarm();
voidAD_0809();
voidlcd_init();
voidclr_screen();
voidbytecode();
voidfitle();
voidfunkey();
unsignedcharkeyscan();
/********************定义变量*********************/
sbitLCD_RS=P3^0;//寄存器选择输入
sbitLCD_RW=P3^1;//液晶读/写控制
sbitLCD_EN=P3^2;//液晶使能控制
sbitled=P3^5;
sbitbell=P3^4;
sbitAD_EOC=P3^3;//A/D转换接口
sbitST=P3^6;//A/D转换启动
sbitOE=P3^7;//A/D输出允许
unsignedcharab[8]=0;
//unsignedcharabc[4]=0;
unsignedcharptr[4]=0;
unsignedcharptrl[4]=0;
inti;
intm,n;
floatss;
intj;
intzhongliang;
uintdanjia;
intYZ=5000;//初始阈值为5
unsignedintgetdata;
floatVOL;
unsignedcharrekey=0,ge=0,shi=0,xiaoshu=0;
unsignedcharsetflag=0,fuwei;
floatx[5]={0.00,0.00,0.00,0.00,0.00};
ucharcodeDIS1[]={"西安科技大学"};
ucharcodeDIS2[]={"毕业设计课题"};
ucharcodeDIS3[]={"多功能电子称"};
ucharcodeDIS4[]={"康昊张晨"};
ucharaDIS1[]={"重量:
"};
ucharaDIS2[]={'k','g'};
ucharbDIS1[]={"单价:
"};
ucharbDIS2[]={"元/Kg"};
ucharcDIS1[]={"金额:
"};
/*************************************************
函数名称:
AD_0809
函数功能:
数模转换
*************************************************/
voidAD_0809()
{
OE=0;//输出禁止
_nop_();
_nop_();
ST=0;//启动转换
_nop_();
_nop_();
ST=1;
_nop_();//保证足够的上升沿
ST=0;
while(!
AD_EOC);//等待输出
OE=1;//输出允许
P1=0xFF;
getdata=P1;
_nop_();
_nop_();
_nop_();
_nop_();
VOL=4.44*getdata/256;//ADC0809实际基准电压为4.44
}
/**************************************************
延时函数
**************************************************/
voiddelay(intms)
{
while(ms--)
{
uchari;
for(i=0;i<150;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/**************************************************
检查LCD忙状态
lcd_busy为1时,忙,等待;lcd_busy为0时。
闲,可写指令与数据。
**************************************************/
bitlcd_busy()
{
bitresult;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
delayNOP();
result=(bit)(P0&0x80);
LCD_EN=0;
return(result);
}
/***************************************************
写指令数据到LCD
RS=L,RW=L,E=高脉冲,D0-D7=指令码。
***************************************************/
voidlcd_wcmd(ucharcmd)
{
while(lcd_busy());
LCD_RS=0;
LCD_RW=0;
LCD_EN=0;
_nop_();
_nop_();
P0=cmd;
delayNOP();
LCD_EN=1;
delayNOP();
LCD_EN=0;
}
/**************************************************
写显示数据到LCD
RS=H,RW=L,E=高脉冲,D0-D7=数据。
***************************************************/
voidlcd_wdat(uchardat)
{
while(lcd_busy());
LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
P0=dat;
delayNOP();
LCD_EN=1;
delayNOP();
LCD_EN=0;
}
/**************************************************
LCD初始化设定
**************************************************/
voidlcd_init()
{
//LCD_PSB=1;//并口方式
//LCD_RST=0;//液晶复位
delay(3);
//LCD_RST=1;
delay(3);
lcd_wcmd(0x34);//扩充指令操作
delay(5);
lcd_wcmd(0x30);//基本指令操作
delay(5);
lcd_wcmd(0x0C);//显示开,关光标
delay(5);
lcd_wcmd(0x01);//清除LCD的显示内容
delay(5);
}
/*************************************************
设定显示位置
*************************************************/
voidlcd_pos(ucharX,ucharY)
{
ucharpos;
if(X==1)
{X=0x80;}
elseif(X==2)
{X=0x90;}
elseif(X==3)
{X=0x88;}
elseif(X==4)
{X=0x98;}
pos=X+Y;
lcd_wcmd(pos);//显示地址
}
/*********************************************************
**
*闪烁函数*
**
*********************************************************/
voidlcdflag()
{
lcd_wcmd(0x08);
delay(300);
lcd_wcmd(0x0c);
delay(300);
lcd_wcmd(0x08);
delay(300);
lcd_wcmd(0x0c);
delay(300);
lcd_wcmd(0x08);
delay(100);
lcd_wcmd(0x0c);
delay(50);
lcd_wcmd(0x01);
delay(50);
}
/*************************************************
清屏函数
*************************************************/
voidclr_screen()
{
lcd_wcmd(0x34);//扩充指令操作
delay(5);
lcd_wcmd(0x30);//基本指令操作
delay(5);
lcd_wcmd(0x01);//清屏
delay(5);
}
/**************************************************
显示字符表代码
**************************************************/
voidbytecode()
{
uchars;
clr_screen();//清屏
lcd_wcmd(0x80);//设置显示位置为第一行
for(s=0;s<16;s++)
{
lcd_wdat(0x30+s);
}
lcd_wcmd(0x90);//设置显示位置为第二行
for(s=0;s<16;s++)
{
lcd_wdat(0x40+s);
}
lcd_wcmd(0x88);//设置显示位置为第三行
for(s=0;s<16;s++)
{
lcd_wdat(0x50+s);
}
lcd_wcmd(0x98);//设置显示位置为第四行
for(s=0;s<16;s++)
{
lcd_wdat(0x60+s);
}
}
/*************************************************
将数值转换成可显示函数
**************************************************/
voidTrans_val(floathhh)
{
zhongliang=(int)(hhh*2);
Alarm();
ptr[0]=2+zhongliang/10;
ptr[1]=2+zhongliang%10;
ptr[2]=0;
zhongliang=(int)(hhh*2000);
ptr[3]=2+zhongliang%1000/100;
ptr[4]=2+zhongliang%100/10;
ptr[5]=2+zhongliang%10;
//zhongliang=(int)(hhh*2);
Alarm();
}
/**************************************************
函数名称:
display_open
函数功能:
开机正常显示界面
**************************************************/
voiddisplay_open()
{
lcd_pos(1,1);//设置显示位置为第一行
for(i=0;i<12;i++)
{
lcd_wdat(DIS1[i]);
delay(30);
}
lcd_pos(2,1);//设置显示位置为第二行
for(i=0;i<12;i++)
{
lcd_wdat(DIS2[i]);
delay(30);
}
lcd_pos(3,1);//设置显示位置为第三行
for(i=0;i<12;i++)
{
lcd_wdat(DIS3[i]);
delay(30);
}
lcd_pos(4,1);//设置显示位置为第四行
for(i=0;i<12;i++)
{
lcd_wdat(DIS4[i]);
delay(30);
}
delay(500);
}
/**************************************************
函数名称:
display_right
函数功能:
开机正常显示界面
**************************************************/
voiddisplay_right()
{
lcd_pos(1,1);//设置显示位置为第一行
for(i=0;i<12;i++)
{
lcd_wdat(DIS3[i]);
//delay(300);
}
lcd_pos(2,0);//设置显示位置为第二行
for(i=0;i<6;i++)
{
lcd_wdat(aDIS1[i]);
delay(30);
}
lcd_pos(2,7);
for(i=0;i<2;i++)
{
lcd_wdat(aDIS2[i]);
//delay(300);
}
lcd_pos(3,0);//设置显示位置为第三行
for(i=0;i<6;i++)
{
lcd_wdat(bDIS1[i]);
//delay(300);
}
lcd_pos(3,5);
for(i=0;i<5;i++)
{
lcd_wdat(bDIS2[i]);
//delay(300);
}
lcd_pos(4,0);//设置显示位置为第四行
for(i=0;i<6;i++)
{
lcd_wdat(cDIS1[i]);
//delay(300);
}
lcd_pos(4,7);//设置显示位置为第四行
for(i=0;i<2;i++)
{
lcd_wdat(bDIS2[i]);
//delay(300);
}
}
/*******************************************************************
函数名:
Alarm
功能:
报警
*******************************************************************/
voidAlarm()
{
if(zhongliang>YZ)//重量大于阈值
{
led=1;//发光二极管点亮
delay(10);
bell=0;//蜂鸣器响
delay(10);
}
if(zhongliang{
led=0;//发光二极管熄灭
delay(10);
bell=1;//蜂鸣器不响
delay(10);
}
}
/**************************************************
函数名称:
display_weigh
函数功能:
电子秤显示界面
**************************************************/
voiddisplay_weigh()
{
uinti;
Trans_val(ss);//数据分离
for(i=0;i<5;i++)
ptr[i]=ptr[i]+0x2e;//更新数据
lcd_pos(2,3);//设置显示位置为第一行
for(i=0;i<5;i++)
{
lcd_wdat(ptr[i]);
//delay(300);
}
}
/***************************************************************************
函数名称:
filter
函数功能:
滤波
***************************************************************************/
floatfilter()
{
unsignedchari;
floatsum=0.00;
for(i=0;i<5;i++)
{
sum+=x[i];
}
sum=sum/5;
returnsum;
}
/***************************************************************************
函数名称:
fun_key
函数功能:
单价输入
***************************************************************************/
voidfunkey()
{fuwei=1;
n=0;
m=0;
shi=0;ge=0;xiaoshu=0;
setflag=0;
while(setflag==0)
{
rekey=keyscan();
if(rekey==16)
{clr_screen();display_open();delay(500);clr_screen();
display_right();setflag=1;ab[8]=0;ptrl[4]=0;fuwei=1;ptr[8]=0;
lcd_pos(3,3);//设置显示位置为第一行
for(i=0;i<4;i++)
{
lcd_wdat(0x20);
delay(10);
}
lcd_pos(4,3);//设置显示位置为第一行
for(i=0;i<8;i++)
{
lcd_wdat(0x20);
delay(10);
}
}
if(rekey==12)
{clr_screen();
display_right();setflag=1;ab[8]=0;ptrl[4]=0;fuwei=0;
lcd_pos(3,3);//设置显示位置为第一行
for(i=0;i<4;i++)
{
lcd_wdat(0x20);
delay(15);
}
lcd_pos(4,3);//设置显示位置为第一行
for(i=0;i<8;i++)
{
lcd_wdat(0x20);
delay(15);
}
}
if(rekey>=1&&rekey<=10)
{ab[n]=rekey-1;ptrl[n]=rekey+0x2f;n++;if(n>4)break;
lcd_pos(3,3);//设置显示位置为第一行
for(i=0;i{
lcd_wdat(ptrl[i]);
delay(10);
}
}
if(rekey==11)
{m=n;ab[n]=0x2e;ptrl[n]=0x2e;n++;if(n>4)break;
lcd_pos(3,3);//设置显示位置为第一行
for(i=0;i{
lcd_wdat(ptrl[i]);
delay(5);
}
}
if(rekey==14)
{n--;
lcd_pos(3,3);//设置显示位置为第一行
for(i=0;i<4;i++)
{
lcd_wdat(0x20);
delay(5);
}
lcd_pos(3,3);//设置显示位置为第一行
for(i=0;i{
lcd_wdat(ptrl[i]);
delay(5);
}
}
if(rekey==13)
{lcd_pos(3,3);//设置显示位置为第一行
for(i=0;i{
lcd_wdat(ptrl[i]);
delay(50);
}
setflag=1;fuwei=0;
}
if(rekey==15)
{fuwei=1;setflag=1;}
}
if(fuwei==1)
{
lcd_pos(4,3);//设置显示位置为第一行
for(i=0;i<8;i++)
{
lcd_wdat(0x20);
delay(10);
}
}
if(fuwei==0)
{
if(setflag==1)
{if(m==0){xiaoshu=ab[1];}
if(m==1){ge=ab[0];xiaoshu=ab[2];}
if(m==2){shi=ab[0];ge=ab[1];xiaoshu=ab[3];}
danjia=shi*10+ge+xiaoshu*0.1;
//(ptr[3]-2)
//zhongliang=zhongliang*10;
//danjia=1;
//zhongliang=8900;
//zhongliang=ptr[0]*1000+ptr[1]*100+ptr[2]*10+ptr[3];
//zhongliang=zhongliang*10;
//danji