|
本帖最后由 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);
- }
- }
復制代碼
|
評分
-
查看全部評分
|