洗衣機控制
- #include<reg52.h>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit rs=P2^0;//定義寫數據(命令)
- sbit rw=P2^1;//定義讀寫控制
- sbit en=P2^2;//定義使模塊使能
- sbit rst=P2^3;
- sbit scl=P3^6;//定義IIC
- sbit sda=P3^7;
- sbit s1=P1^2;//功能鍵
- sbit s2=P1^0;//加數鍵
- sbit s3=P1^1;//減數鍵
- sbit s4=P1^4;//
- sbit s5=P1^3;
- sbit fw=P3^3;
- sbit d1z=P1^5;
- sbit d1f=P1^6;
- sbit d2t=P1^7;
- uchar zshi,fshi,zong,tuoshi,s1num;
- uchar kk,zz,ftuoshi,fzshi,ffshi,fzong,s5num,s4num;
- uchar w,h,t,k,f,g,x;
- uchar code mb1[]="正轉時間: 00秒";
- uchar code mb2[]="反轉時間:00秒";
- uchar code mb3[]="總洗衣時間:00分";
- uchar code mb4[]="總脫水時間:00分";
- void ys(uint z)//延時子程序
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void writecom12864(uchar com,uchar add)//寫命令
- {
- rs=0;
- rw=0;
- P0=com;
- ys(5);
- rw=1;
- ys(5);
- rw=0;
- P0=add;
- ys(5);
- rw=1;
- ys(5);
- }
- void writedat12864(uchar dat)//寫數據
- {
-
- rs=1;
- rw=0;
- P0=dat;
- ys(5);
- rw=1;
- ys(5);
- }
- uchar readcom12864(uchar add)//讀命令程序
- {
- uchar Data;
- rs = 0;
- P0= add; //Reg Addr
- rw = 0;
- rw = 1;
- P0 = 0xff;
- en = 0;
- Data = P0;
- en = 1;
- return Data;
- }
- void busy(void)//讀忙程序
- {
- uchar temp;
- do
- {
- temp = readcom12864(0x0f);
- }while(temp & 0x80);
- }
- void clear()//清屏
- {
- uchar temp;
- temp = readcom12864(0x01);
- temp |= 0x40;
- writecom12864(0x01, temp);
- busy();
- busy();
- }
- void gbxy(uchar x,uchar y)//光標坐標
- {
- writecom12864(0x05,x);
- writecom12864(0x06,y);
- }
- void ret(void)
- {
- rst = 0;
- ys(50);//Delay100ms(1);
- rst= 1;
- ys(50);//Delay100ms(1);
- }
- void init12864()//初始化
- {
- uchar i;
- ys(50);
- writecom12864(0x01, 0x02); /* 顯示功能打開,鍵盤關*/
- writecom12864(0x02, 0x7f); /* 128x64, BG Code 64列 */
- writecom12864(0x03, 0x03); /* 正常顯示范圍,不允許中斷,ASCII 1 ,16*16字體,正常字體,不反白,文字模式 */
- writecom12864(0x04, 0x02);//光標設定
- writecom12864(0x10, 0x70); /* (1/9偏壓,Cont=100111)(1/8,效果也行,B0110_1110) */
- writecom12864(0x11, 0xf0); /* 升壓開,內升壓,內部V0,內部偏壓,ICON順序不變,SEG=143, COM=63 */
- writecom12864(0x12, 0xf7); /* 12.5Khz, X6, 大電流11110111 */
- clear();
- ys(50);
- gbxy(0,0);
- for(i=0;i<14;i++)
- {
- writedat12864(mb1[i]);
- ys(20);
- }
- gbxy(0,0x10);
- for(i=0;i<14;i++)
- {
- writedat12864(mb2[i]);
- ys(20);
- }
- gbxy(0,0x1f);
- for(i=0;i<16;i++)
- {
- writedat12864(mb3[i]);
- ys(20);
- }
- gbxy(0,0x2f);
- for(i=0;i<16;i++)
- {
- writedat12864(mb4[i]);
- ys(20);
- }
- TMOD=0X11;
- T2CON=0;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- RCAP2L=0xb0;
- RCAP2H=0x3c;
- EA=1;
- ET2=1;
- ET0=1;
- ET1=1;
- TR0=0;
- TR1=0;
- }
- void disp(uchar dat)//液晶顯示
- {
- uchar shi,ge;
- shi=dat/10;
- ge=dat%10;
- writedat12864(0x30+shi);
- writedat12864(0x30+ge);
- }
- ////////////////////
- void ysus()
- {
- _nop_();_nop_();_nop_();
- _nop_();_nop_();_nop_();
- _nop_();_nop_();
- }
- void start()
- {
- sda=1;
- ysus();
- scl=1;
- ysus();
- sda=0;
- ysus();
- }
- void stop()
- {
- sda=0;
- ysus();
- scl=1;
- ysus();
- sda=1;
- ysus();
- }
- void ack()
- {
- uchar i;
- scl=1;
- ysus();
- while((sda==1)&&(i<200))i++;
- scl=0;
- ysus();
- }
- void writebyte(uchar dat)
- {
- uchar i;
- scl=0;
- for(i=0;i<8;i++)
- {
- if(dat&0x80)
- {
- sda=1;
- }
- else
- sda=0;
- dat=dat<<1;
- ysus();
- scl=1;
- ysus();
- scl=0;
- ysus();
- }
- sda=1;
- ysus();
- }
- uchar readbyte()
- {
- uchar i,j;
- scl=0;
- ysus();
- sda=1;
- ysus();
- for(i=0;i<8;i++)
- {
- scl=1;
- ysus();
- j=j<<1;
- if(sda)
- j++;
- scl=0;
- ysus();
- }
- return j;
- }
- void writeiic(uchar add,uchar dat)
- {
- start();
- writebyte(0xa0);
- ack();
- writebyte(add);
- ack();
- writebyte(dat);
- ack();
- stop();
- }
- uchar readiic(uchar dat)
- {
- uchar a;
- start();
- writebyte(0xa0);
- ack();
- writebyte(dat);
- ack();
- start();
- writebyte(0xa1);
- ack();
- a=readbyte();
- stop();
- return a;
- }
- //////////////////////////
- void key()
- {
- if(s1==0)
- {
- ys(5);
- if(s1==0)
- {
- fw=0;
- ys(100);
- fw=1;
- s1num++;
- while(!s1);
- ys(5);
- while(!s1);
- if(s1num==1)
- {
- gbxy(10,0);
- writecom12864(0x04, 0x05);
- }
- if(s1num==2)
- {
- writeiic(1,zshi);
- gbxy(10,0x10);
- }
- if(s1num==3)
- {
- writeiic(2,fshi);
- gbxy(12,0x1f);
- }
- if(s1num==4)
- {
- writeiic(3,zong);
- gbxy(12,0x2f);
- }
- if(s1num==5)
- {
- s1num=0;
- writeiic(4,tuoshi);
- writecom12864(0x04, 0x00);
- }
- }
- }
- if(s1num!=0)
- {
- if(s2==0)
- {
- ys(5);
- if(s2==0)
- {
- fw=0;
- ys(100);
- fw=1;
- while(!s2);
- ys(5);
- while(!s2);
- if(s1num==1)
- {
- zshi++;
- if(zshi==100)
- zshi=0;
- writeiic(1,zshi);
- gbxy(10,0);
- disp(zshi);
- }
- if(s1num==2)
- {
- fshi++;
- if(fshi==100)
- fshi=0;
- writeiic(2,fshi);
- gbxy(10,0x10);
- disp(fshi);
- }
- if(s1num==3)
- {
- zong++;
- if(zong==100)
- zong=0;
- writeiic(3,zong);
- gbxy(12,0x1f);
- disp(zong);
- }
- if(s1num==4)
- {
- tuoshi++;
- if(tuoshi==100)
- tuoshi=0;
- writeiic(4,tuoshi);
- gbxy(12,0x2f);
- disp(tuoshi);
- }
- }
- }
- if(s3==0)
- {
- ys(5);
- if(s3==0)
- {
- fw=0;
- ys(100);
- fw=1;
- while(!s3);
- ys(5);
- while(!s3);
- if(s1num==1)
- {
- zshi--;
- if(zshi==-1)
- zshi=99;
- writeiic(1,zshi);
- gbxy(10,0);
- disp(zshi);
- }
- if(s1num==2)
- {
- fshi--;
- if(fshi==-1)
- fshi=99;
- writeiic(2,fshi);
- gbxy(10,0x10);
- disp(fshi);
- }
- if(s1num==3)
- {
- zong--;
- if(zong==-1)
- zong=99;
- writeiic(3,zong);
- gbxy(12,0x1f);
- disp(zong);
- }
- if(s1num==4)
- {
- tuoshi--;
- if(tuoshi==-1)
- tuoshi=99;
- writeiic(4,tuoshi);
- gbxy(12,0x2f);
- disp(tuoshi);
- }
- }
- }
- }
- if(s4==0)
- {
- ys(5);
- if(s4==0)
- {
- s4num++;
- while(!s4);
- ys(5);
- while(!s4);
- if(s4num==1)
- {
- k=0;
- TR0=1;
- TR2=1;
- d1z=0;
- kk=0;
- zz=0;
- fw=0;
- ys(200);
- fw=1;
- }
- if(s4num==2)
- {
- s4num=0;
- TR0=0;
- TR2=0;
- k=1;
- d1z=1;
- d1f=1;
- kk=1;
- zz=0;
- zshi=readiic(1);
- fshi=readiic(2);
- zong=readiic(3);
- gbxy(10,0);
- disp(zshi);
-
- gbxy(10,0x10);
- disp(fshi);
-
- gbxy(12,0x1f);
- disp(zong);
-
- gbxy(12,0x2f);
- disp(tuoshi);
-
- fw=0;
- ys(200);
- fw=1;
- }
- }
- }
- if(s5==0)
- {
- ys(5);
- if(s5==0)
- {
- s5num++;
- while(!s5);
- if(s5num==1)
- {
- TR1=1;
- d2t=0;
- fw=0;
- ys(200);
- fw=1;
- }
- if(s5num==2)
- {
- s5num=0;
- TR1=0;
- d2t=1;
-
- tuoshi=readiic(4);
- gbxy(12,0x2f);
- disp(tuoshi);
-
- fw=0;
- ys(200);
- fw=1;
- }
- }
- }
- }
- void main()
- {
- ret();
- init12864();
- zshi=readiic(1);
- fshi=readiic(2);
- zong=readiic(3);
- tuoshi=readiic(4);
- gbxy(10,0);
- disp(zshi);
- gbxy(10,0x10);
- disp(fshi);
- gbxy(12,0x1f);
- disp(zong);
- gbxy(12,0x2f);
- disp(tuoshi);
- while(1)
- {
- fzshi=readiic(1);
- ffshi=readiic(2);
- fzong=readiic(3);
- ftuoshi=readiic(4);
- key();
- if(k==1)
- {
- d1z=1;
- d1f=1;
- TR0=0;
- TR2=0;
- zz=0;
- kk=1;
- }
- if(w==20)
- {
- w=0;
- if(kk!=1)
- {
- zshi--;
- if(zshi==-1)
- {
- zshi=readiic(1);
- TR2=0;
- d1z=1;
- ys(4000);
- d1f=0;
- TR2=1;
- zz=1;
- kk=1;
- }
- gbxy(10,0);
- disp(zshi);
- }
- if(zz==1)
- {
- TR2=1;
- fshi--;
- if(fshi==-1)
- {
- d1f=1;
- fshi=readiic(2);
- zz=0;
- kk=0;
- TR2=0;
-
- ys(4000);
- d1z=0;
- TR2=1;
- }
- gbxy(10,0x10);
- disp(fshi);
- }
- }
- }
- }
- void t0() interrupt 1//控制洗衣總時間
- {
-
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- t++;
- if(t==20)
- {
- t=0;
- h++;
- if(h==60)
- {
- h=0;
- zong--;
- if(zong==0)
- {
- zz=0;
- kk=1;
- k=1;
- zong=fzong;
- zshi=fzshi;
- fshi=ffshi;
- gbxy(10,0);
- disp(zshi);
-
- gbxy(10,0x10);
- disp(fshi);
-
- gbxy(12,0x1f);
- disp(zong);
- fw=0;
- ys(2000);
- fw=1;
- }
- gbxy(12,0x1f);
- disp(zong);
- }
- }
- }
- void t1() interrupt 3//控制脫水時間
- {
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- g++;
- if(g==20)
- {
- g=0;
- f++;
- if(f==60)
- {
- f=0;
- tuoshi--;
- if(tuoshi==0)
- {
- TR1=0;
- d2t=1;
- tuoshi=ftuoshi;
-
- fw=0;
- ys(2000);
- fw=1;
- }
- gbxy(12,0x2f);
- disp(tuoshi);
- }
- }
- }
- void t2() interrupt 5//控制電機正反轉時間
- {
- TF2=0;
- w++;
- }
復制代碼
|