|
本帖最后由 daxiao 于 2015-3-22 02:31 编辑
- //按键接P2口
- //LCD数据口接P0口
- //DOUT=P3^0;
- //PD_SCK=P3^1;
- //RS=P1^1; VOUT 空接 RST 空接 NC PSB 接VCC
- //RW=P1^2;
- //E=P1^3;
- //FMQ=P1^0; 蜂鸣器
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit ADDO=P3^0; //51CPU 准双向I/0 输入使能(DOUT) / 串行数据输出
- sbit ADSK=P3^1; // 使能AD(PD_SCK) / 串行时钟输入
- sbit RS=P1^1; //寄存器选择引脚,搞电平选择数据寄存器,低电平选择指令寄存器
- sbit RW=P1^2; //读写操作使能引脚,高电平使能读操作,低电平使能写操作
- sbit E=P1^3; //总使能引脚
- sbit FMQ=P1^0; //蜂鸣器
- //----------------------AD转换程序--//
- unsigned long ReadCount(void) //无参数,返回长整形变量
- {
- unsigned long Count; //声明长整形变量Count
- unsigned char i; //声明字符型变量i
- ADSK=0; //串行输入拉低
- Count=0; //变量Count置零
- while(ADDO); //等待串行输出拉高
- for(i=0;i<24;i++) //接收24个数据和发送24个脉冲
- {
- ADSK=1; //发送脉冲
- Count=Count<<1; //变量左移
- ADSK=0; //拉低
- if(ADDO)Count++; //读入数据(高>>低)
- }
- ADSK=1; //发送第25个脉冲(选择A通道、128增益。)
- Count=Count^0x800000; //按位相异或
- ADSK=0; //串行拉低
- return Count; //返回
- }
- //--------------------延时子函数--------//
- void delay(unsigned char delayata)
- {
- uchar i,j;
- for(i=0;i<delayata;i++)
- {
- for(j=0;j<121;j++)
- {;}
- }
- }
- //-------------------------------------单键扫描子函数-----//
- unsigned char JP()
- {
- unsigned char x=0x00;
- bit i=0;
- x=P2; //扫描Y坐标
- FMQ=0; //响起蜂鸣器
- delay(125); //延时去抖动
- P2=0x0f;
- delay(2);
- x+=P2; //扫描X坐标
- switch(x)
- {
- case 0xee:x=0x30;break; //按下0
- case 0xed:x=0x31;break; //按下1
- case 0xeb:x=0x34;break; //按下4
- case 0xe7:x=0x37;break; //按下7
- case 0xde:x=0x46;break; //按下F/.
- case 0xdd:x=0x32;break; //按下2
- case 0xdb:x=0x35;break; //按下5
- case 0xd7:x=0x38;break; //按下8
- case 0xbe:x=0x45;break; //按下E
- case 0xbd:x=0x33;break; //按下3
- case 0xbb:x=0x36;break; //按下6
- case 0xb7:x=0x39;break; //按下9
- case 0x7e:x=0x44;break; //按下D
- case 0x7d:x=0x43;break; //按下C
- case 0x7b:x=0x42;break; //按下B
- case 0x77:x=0x41;break; //按下A
- default:x=0xff;break;
- }
- FMQ=1; //关闭蜂鸣器
- while(i==0) //等待按键松开
- {
- P2=0xf0;
- delay(150);
- if(P2==0xf0)
- {
- i=1;
- }
- else{i=0;}
- }
- return x; //返回x(ASCII码)
- }
- //------------------12864写指令子函数-----//
- void write_12864com(unsigned char com)
- {
- RS=0;
- RW=0;
- delay(1);
- E=1;
- P0=com;
- delay(2);
- E=0;
- delay(1);
- }
- //------------------12864写数据子函数-----//
- void write_12864dat(unsigned char dat)
- {
- RS=1;
- RW=0;
- delay(1);
- E=1;
- P0=dat;
- delay(2);
- E=0;
- delay(1);
- }
- //------------------------------LCD初始化-----//
- void initinal(void)
- {
- delay(100);
- write_12864com(0x30); //8位并行通信
- delay(1);
- write_12864com(0x30); //8位并行通信
- delay(1);
- write_12864com(0x02);
- delay(2);
- write_12864com(0x06);
- delay(2);
- write_12864com(0x0c);
- delay(2);
- write_12864com(0x01);
- delay(2);
- write_12864com(0x80);
- delay(2);
- }
- //--------------------主函数-------------//
- void main(void)
- {
- uchar LCD[16]={"0123456789ABCDEF"};
- code uchar JM1[]={0xb5,0xda,0xc8,0xfd,0xd7,0xe9,0xb5,0xe7,0xd7,0xd3,0xb3,0xc6};
- code uchar JM2[]={"单价: 00.0元 "};
- code uchar JM3[]={"重量: 00.000KG "};
- code uchar JM4[]={"总价: 0000.0元 "};
- uchar DJ[3]; //单价
- uchar ZL[5]; //重量
- uchar QPZL[5]; //去皮时的重量
- uchar ZJ[5]; //总价
- unsigned long J1;
- uint J2,J3,J6=0;
- bit J5=1;
- uint J7;
- uchar i;
- uchar JM5[]={5679};
- initinal(); //初始化
- for(i=0;i<3;i++) //填值
- {
- DJ[i]=0;
- }
- for(i=0;i<5;i++) //填值
- {
- ZL[i]=0;
- }
- for(i=0;i<5;i++) //填值
- {
- QPZL[i]=0;
- }
- for(i=0;i<5;i++) //填值
- {
- ZJ[i]=0;
- }
- write_12864com(0x81); //定位
- for(i=0;i<12;i++)
- {
- write_12864dat(JM1[i]); //显示 第三组电子称
- }
- write_12864com(0x90); //定位
- for(i=0;JM2[i]!='\0';i++)
- {
- write_12864dat(JM2[i]); //显示 单价:00.0元
- }
- write_12864com(0x88); //定位
- for(i=0;JM3[i]!='\0';i++)
- {
- write_12864dat(JM3[i]); //显示 重量: 00.000KG
- }
- write_12864com(0x98); //定位
- for(i=0;JM4[i]!='\0';i++)
- {
- write_12864dat(JM4[i]); //显示 总价: 0000.0元
- }
- P2=0xf0;
- while(1)
- {
- while(P2==0xf0) //但没有按键按下的时候进入,有按键按下的时候跳出来
- {
- J1=ReadCount(); //读AD值
- J3=((J1-8388608)/150)-11; //取值
- ZL[0]=(J3/10000)%10; //重量十位
- if(ZL[0]>3){FMQ=0;} //超重报警
- else{FMQ=1;}
- ZL[1]=(J3/1000)%10; //重量个位
- ZL[2]=(J3/100)%10; //计算位
- ZL[3]=(J3/10)%10;
- ZL[4]=J3%10;
- J7=ZL[4];
- J7+=ZL[3]*10;
- J7+=ZL[2]*100;
- J7+=ZL[1]*1000;
- J7+=ZL[0]*10000;
- J3=QPZL[4];
- J3+=QPZL[3]*10;
- J3+=QPZL[2]*100;
- J3+=QPZL[1]*1000;
- J3+=QPZL[0]*10000;
- J7-=J3;
- ZL[0]=J7/10000;
- J7%=10000;
- ZL[1]=J7/1000;
- J7%=1000;
- ZL[2]=J7/100;
- J7%=100;
- ZL[3]=J7/10;
- J7%=10;
- ZL[4]=J7;
- write_12864com(0x8b); //定位
- write_12864dat(LCD[ZL[0]]); //送显示
- write_12864dat(LCD[ZL[1]]); //送显示
- write_12864dat(0x2e); //送显示
- write_12864dat(LCD[ZL[2]]); //送显示
- write_12864dat(LCD[ZL[3]]); //送显示
- write_12864dat(LCD[ZL[4]]); //送显示
- J7=DJ[2]*ZL[3];
- J7+=DJ[2]*ZL[2]*10;
- J7+=DJ[2]*ZL[1]*100;
- J7+=DJ[2]*ZL[0]*1000;
- J7/=10;
- J7+=DJ[1]*ZL[3];
- J7+=DJ[1]*ZL[2]*10;
- J7+=DJ[1]*ZL[1]*100;
- J7+=DJ[1]*ZL[0]*1000;
- J7/=10;
- J7+=DJ[0]*ZL[3];
- J7+=DJ[0]*ZL[2]*10;
- J7+=DJ[0]*ZL[1]*100;
- J7+=DJ[0]*ZL[0]*1000;
- ZJ[0]=J7/10000;
- J7%=10000;
- ZJ[1]=J7/1000;
- J7%=1000;
- ZJ[2]=J7/100;
- J7%=100;
- ZJ[3]=J7/10;
- J7%=10;
- ZJ[4]=J7;
- write_12864com(0x9b); //定位
- i=ZJ[0];
- i=LCD[i];
- write_12864dat(i); //送显示
- i=ZJ[1];
- i=LCD[i];
- write_12864dat(i); //送显示
- i=ZJ[2];
- i=LCD[i];
- write_12864dat(i); //送显示
- i=ZJ[3];
- i=LCD[i];
- write_12864dat(i); //送显示
- write_12864dat(0x2e); //显示点
- i=ZJ[4];
- i=LCD[i];
- write_12864dat(i); //送显示
- P2=0xf0;
- delay(1);
- }
- J2=JP();
- if(J6>2){J6=0;}
- if(J2<0x40)
- {
- J2-=0x30;
- DJ[J6]=J2;
- J2=0xff;
- J6++;
- }
- else
- {
- switch(J2)
- {
- case 0x41:P2=0xf0;while(P2==0xf0);J2=0xff;break; //按下A锁定界面
- case 0x42:J2=0xff;break; //解除锁定
- case 0x43:J1=ReadCount(); //去皮
- J3=((J1-8388608)/150)-11;
- QPZL[0]=(J3/10000)%10;
- QPZL[1]=(J3/1000)%10;
- QPZL[2]=(J3/100)%10;
- QPZL[3]=(J3/10)%10;
- QPZL[4]=J3%10;
- J2=0xff;
- break;
- case 0x44:DJ[0]=0;DJ[1]=0;DJ[2]=0;J6=0;J2=0xff;break; //单价 复位
- case 0x45:QPZL[0]=0;QPZL[1]=0;QPZL[2]=0;QPZL[3]=0;QPZL[4]=0;J2=0xff;break; //重量复位
- case 0x46:DJ[0]=0;DJ[1]=0;DJ[2]=0;J6=0;QPZL[0]=0;QPZL[1]=0;QPZL[2]=0;QPZL[3]=0;QPZL[4]=0;J2=0xff;break; //单价 重量 复位
- default:break;
- }
- }
- write_12864com(0x93);
- i=DJ[0];
- i=LCD[i];
- write_12864dat(i);
- i=DJ[1];
- i=LCD[i];
- write_12864dat(i);
- write_12864dat(0x2e);
- i=DJ[2];
- i=LCD[i];
- write_12864dat(i);
- }
- }
复制代码
|
评分
-
查看全部评分
|