1、12电子秤程序程序 /*头文件*/#include#include#include#include#define uchar unsigned char#define uint unsigned int#define delayNOP(); _nop_();_nop_();_nop_();_nop_();#define AD_data P1 /AD数据口#define LCD_data P0 /液晶数据口/*函数声明*/void display_weigh ();void Alarm();void AD_0809();void lcd_init();void clr_screen();void
2、 bytecode();void fitle();void funkey();unsigned char keyscan();/*定义变量*/sbit LCD_RS = P30; /寄存器选择输入 sbit LCD_RW = P31; /液晶读/写控制sbit LCD_EN = P32; /液晶使能控制sbit led=P35; sbit bell=P34;sbit AD_EOC=P33; /A/D转换接口sbit ST=P36; /A/D转换启动sbit OE=P37; /A/D输出允许unsigned char ab8=0;/unsigned char abc4=0;unsigned ch
3、ar ptr4=0;unsigned char ptrl4=0;int i;int m,n;float ss; int j;int zhongliang;uint danjia;int YZ=5000; /初始阈值为5unsigned int getdata;float VOL;unsigned char rekey=0,ge=0,shi=0,xiaoshu=0;unsigned char setflag=0,fuwei;float x5=0.00,0.00,0.00,0.00,0.00;uchar code DIS1=西安科技大学;uchar code DIS2=毕业设计课题;uchar c
4、ode DIS3=多功能电子称;uchar code DIS4=康昊 张晨;uchar aDIS1=重量:;uchar aDIS2=k,g;uchar bDIS1=单价:;uchar bDIS2=元/Kg;uchar cDIS1=金额:;/*函数名称: AD_0809函数功能: 数模转换*/void AD_0809() OE = 0; /输出禁止 _nop_(); _nop_(); ST = 0; /启动转换 _nop_(); _nop_(); ST = 1; _nop_(); /保证足够的上升沿 ST = 0; while(!AD_EOC); /等待输出 OE = 1; /输出允许 P1=0
5、xFF; getdata=P1; _nop_(); _nop_(); _nop_(); _nop_(); VOL=4.44*getdata/256; /ADC0809实际基准电压为4.44 /*延时函数 */void delay(int ms) while(ms-) uchar i; for(i=0;i150;i+) _nop_(); _nop_(); _nop_(); _nop_(); /*检查LCD忙状态lcd_busy为1时,忙,等待;lcd_busy为0时。闲,可写指令与数据。 */bit lcd_busy() bit result; LCD_RS = 0; LCD_RW = 1; L
6、CD_EN = 1; delayNOP(); result = (bit)(P0&0x80); LCD_EN = 0; return(result); /*写指令数据到LCD RS=L,RW=L,E=高脉冲,D0-D7=指令码。*/void lcd_wcmd(uchar cmd) 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=高脉冲,D
7、0-D7=数据。*/void lcd_wdat(uchar dat) while(lcd_busy(); LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; P0 = dat; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; /*LCD初始化设定*/void lcd_init() / LCD_PSB = 1; /并口方式 /LCD_RST = 0; /液晶复位 delay(3); / LCD_RST = 1; delay(3); lcd_wcmd(0x34); /扩充指令操作 delay(5); lcd_wcmd(0x30);
8、 /基本指令操作 delay(5); lcd_wcmd(0x0C); /显示开,关光标 delay(5); lcd_wcmd(0x01); /清除LCD的显示内容 delay(5);/*设定显示位置 */void lcd_pos(uchar X,uchar Y) uchar pos; if (X=1) X=0x80; else if (X=2) X=0x90; else if (X=3) X=0x88; else if (X=4) X=0x98; pos = X+Y ; lcd_wcmd(pos); /显示地址 /* * 闪烁函数 * */void lcdflag() lcd_wcmd(0x0
9、8); 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);/*清屏函数 */void clr_screen() lcd_wcmd(0x34); /扩充指令操作 delay(5); lcd_wcmd(0x30); /基本指令操作 delay(5); lcd_wcmd(0x01); /清屏 dela
10、y(5); /*显示字符表代码 */void bytecode() uchar s; clr_screen(); /清屏 lcd_wcmd(0x80); /设置显示位置为第一行 for(s=0;s16;s+) lcd_wdat(0x30+s); lcd_wcmd(0x90); /设置显示位置为第二行 for(s=0;s16;s+) lcd_wdat(0x40+s); lcd_wcmd(0x88); /设置显示位置为第三行 for(s=0;s16;s+) lcd_wdat(0x50+s); lcd_wcmd(0x98); /设置显示位置为第四行 for(s=0;s16;s+) lcd_wdat(
11、0x60+s); /*将数值转换成可显示函数 */ void Trans_val(float hhh ) zhongliang=(int)(hhh*2); Alarm(); ptr0 = 2+zhongliang /10; ptr1 = 2+zhongliang %10; ptr2 = 0; zhongliang=(int)(hhh*2000); ptr3=2+zhongliang%1000/100; ptr4=2+zhongliang%100/10; ptr5=2+zhongliang%10; /zhongliang=(int)(hhh*2); Alarm();/*函数名称: display
12、_open函数功能: 开机正常显示界面*/void display_open() lcd_pos(1,1); /设置显示位置为第一行 for(i=0;i12;i+) lcd_wdat(DIS1i); delay(30); lcd_pos(2,1); /设置显示位置为第二行 for(i=0;i12;i+) lcd_wdat(DIS2i); delay(30); lcd_pos(3,1); /设置显示位置为第三行 for(i=0;i12;i+) lcd_wdat(DIS3i); delay(30); lcd_pos(4,1); /设置显示位置为第四行 for(i=0;i12;i+) lcd_wda
13、t(DIS4i); delay(30); delay(500); /*函数名称: display_right函数功能: 开机正常显示界面*/void display_right() lcd_pos(1,1); /设置显示位置为第一行 for(i=0;i12;i+) lcd_wdat(DIS3i); /delay(300); lcd_pos(2,0); /设置显示位置为第二行 for(i=0;i6;i+) lcd_wdat(aDIS1i); delay(30); lcd_pos(2,7); for(i=0;i2;i+) lcd_wdat(aDIS2i); /delay(300); lcd_pos
14、(3,0); /设置显示位置为第三行 for(i=0;i6;i+) lcd_wdat(bDIS1i); /delay(300); lcd_pos(3,5); for(i=0;i5;i+) lcd_wdat(bDIS2i); /delay(300); lcd_pos(4,0); /设置显示位置为第四行 for(i=0;i6;i+) lcd_wdat(cDIS1i); /delay(300); lcd_pos(4,7); /设置显示位置为第四行 for(i=0;iYZ) /重量大于阈值 led=1; /发光二极管点亮 delay(10); bell=0; /蜂鸣器响 delay(10); if(z
15、hongliangYZ) /重量小于阈值 led=0; /发光二极管熄灭 delay(10); bell=1; /蜂鸣器不响 delay(10); /*函数名称: display_weigh 函数功能: 电子秤显示界面*/void display_weigh() uint i; Trans_val(ss); /数据分离 for(i=0;i5;i+) ptri=ptri+0x2e;/ 更新数据 lcd_pos(2,3); /设置显示位置为第一行 for(i=0;i5;i+) lcd_wdat(ptri); /delay(300); /*函数名称:filter 函数功能:滤波*/float fil
16、ter() unsigned char i; float sum=0.00; for(i=0;i5;i+) sum+=xi; sum=sum/5; return sum; /*函数名称: fun_key 函数功能:单价输入*/ void funkey() 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();se
17、tflag=1;ab8=0;ptrl4=0;fuwei=1; ptr8=0; lcd_pos(3,3); /设置显示位置为第一行 for(i=0;i4;i+) lcd_wdat(0x20); delay(10); lcd_pos(4,3); /设置显示位置为第一行 for(i=0;i8;i+) lcd_wdat(0x20); delay(10); if(rekey=12) clr_screen(); display_right();setflag=1;ab8=0;ptrl4=0;fuwei=0; lcd_pos(3,3); /设置显示位置为第一行 for(i=0;i4;i+) lcd_wdat
18、(0x20); delay(15); lcd_pos(4,3); /设置显示位置为第一行 for(i=0;i=1&rekey4)break; lcd_pos(3,3); /设置显示位置为第一行 for(i=0;i4)break; lcd_pos(3,3); /设置显示位置为第一行 for(i=0;in;i+) lcd_wdat(ptrli); delay(5); if(rekey=14) n-; lcd_pos(3,3); /设置显示位置为第一行 for(i=0;i4;i+) lcd_wdat(0x20); delay(5); lcd_pos(3,3); /设置显示位置为第一行 for(i=0
19、;in;i+) lcd_wdat(ptrli); delay(5); if(rekey=13) lcd_pos(3,3); /设置显示位置为第一行 for(i=0;in;i+) lcd_wdat(ptrli); delay(50); setflag=1;fuwei=0; if(rekey=15) fuwei=1;setflag=1; if(fuwei=1) lcd_pos(4,3); /设置显示位置为第一行 for(i=0;i8;i+) lcd_wdat(0x20); delay(10); if(fuwei=0) if(setflag=1) if(m=0)xiaoshu=ab1; if(m=1)ge=ab0;xiaoshu=ab2; if(m=2)shi=ab0;ge=ab1;xiaoshu=ab3; danjia=shi*10+ge+xiaoshu*0.1; / (ptr3-2) /zhongliang=zhongliang*10; /danjia=1; /zhongliang=8900; /zhongliang=ptr0*1000+ptr1*100+ptr2*10+ptr3; /zhongliang=zhongliang*10; /danji
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1