|
本帖最后由 冇妖氣 于 2019-12-23 10:33 編輯
初學單片機,用的是慧凈電子的HL-1開發板,七拼八湊的組成了通過LCD1602顯示時間及工作計數功能,按鍵可以實現屏幕內容切換。源碼分享給大家一起討論優化。界面顯示注釋: JS: 累計工作次數; CS :單次排量常數(可以通過按鍵設置);PL:累計排量總數(等于JS*CS)。
按鍵注釋: S1:設置按鍵,時間顯示界面可以設置時分秒,年月日,計數功能界面可以設置單次排量常數CS;
S2:數值加鍵,設置界面可以對對應位置數值進行加操作;
S3:數值減鍵,設置界面可以對對應位置數值進行減操作;
S4:顯示界面切換按鍵,在時間顯示和工作計數界面來回切換;
S5:模擬工作狀態下的閥門開關信號。接收一次低電平信號,計數一次。
代碼如下:- #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- // 定義4個鍵盤按鍵
- sbit s1=P3^0; //功能鍵
- sbit s2=P3^1; //加鍵
- sbit s3=P3^2; //減鍵
- sbit s4=P3^3; //顯示切換鍵
- sbit s5=P3^6; //模擬信號鍵
- sbit rd=P3^7;
- sbit dula=P2^6;
- sbit wela=P2^7;
- sbit lcden=P2^2;
- sbit rs=P2^0;
- sbit rw=P2^1;
- // DS1302操作
- sbit sclk=P1^1; //串行時鐘
- sbit IO=P1^0; //數據輸入輸出
- sbit rst=P1^2; //復位腳
- uchar s1num,s2num,s3num; //s1num時鐘功能調整,flag1時鐘調整狀態標志,count工作次數,counts排水量,s2num設置切換屏幕,s3num設置常數
- int miao,shi,fen,nian,yue,ri,week;
- int x1,x2,x3;
- unsigned long count;
- unsigned long counts;
- x3=0;
- /*//星期字表
- uchar code table1[]="SUN";
- uchar code table2[]="MON";
- uchar code table3[]="TUE";
- uchar code table4[]="WED";
- uchar code table5[]="THU";
- uchar code table6[]="FRI";
- uchar code table7[]="SAT";
- */
- //延時函數
- void delayms(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- //關閉數碼管函數
- void cmg88()
- {
- dula=1;
- P0=0x00;
- dula=0;
- }
- //液晶寫命令函數
- void write_com(uchar com)
- {
- rs=0;
- lcden=0;
- P0=com;
- delayms(5);
- lcden=1;
- delayms(5);
- lcden=0;
- }
- //液晶寫數據函數
- void write_date(uchar date)
- {
- rs=1;
- lcden=0;
- P0=date;
- delayms(5);
- lcden=1;
- delayms(5);
- lcden=0;
- }
- //向1302寫一個字節數據
- void write1302(uchar dat)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- sclk=0;
- IO=dat&0x01;
- dat=dat>>1;
- sclk=1;
- }
- }
- //根據命令,向1302寫一個字節數據
- void writeset1302(uchar cmd,uchar dat)
- {
- rst=0;
- _nop_();
- sclk=0;
- _nop_();
- rst=1;
- _nop_();
- write1302(cmd);
- write1302(dat);
- sclk=1;
- rst=0;
- IO=1;
- }
- //向1302讀一個字節數據
- uchar read1302(uchar cmd)
- {
- uchar i,value;
-
- rst=0;
- _nop_();
- sclk=0;
- _nop_();
- rst=1;
- _nop_();
- write1302(cmd);
- for(i=0;i<8;i++)
- {
- value=value>>1;
- sclk=0;
- if(IO)
- value=value|0x80;
- sclk=1;
- }
- rst=0;
- sclk=0;
- _nop_();
- sclk=1;
- IO=1;
-
- return value;
- }
- //根據命令向1302讀一個字節數據
- uchar readset1302(uchar cmd)
- {
- uchar dat;
- rst=0;
- sclk=0;
- rst=1;
- write1302(cmd);
- dat=read1302(cmd);
- sclk=1;
- rst=0;
- return(dat);
- }
- // 初始化1302
- void init1302()
- {
- // unsigned char flag;
-
- // flag= readset1302(0x81);
- // if(flag&0x80)
- // { //判斷時鐘芯片是否關閉
- writeset1302(0x8E,0x00); //根據寫狀態寄存器命令字,寫入不保護指令
- writeset1302(0x80,0x56); //根據寫秒寄存器命令字,寫入秒的初始值
- writeset1302(0x82,0x59); //根據寫分寄存器命令字,寫入分的初始值
- writeset1302(0x84,0x23); //根據寫小時寄存器命令字,寫入小時的初始值
- writeset1302(0x86,0x31); //根據寫日寄存器命令字,寫入日的初始值
- writeset1302(0x88,0x12); //根據寫月寄存器命令字,寫入月的初始值
- writeset1302(0x8c,0x18); //根據寫年寄存器命令字,寫入年的初始值
- writeset1302(0x90,0xa5); //打開充電功能 選擇2K電阻充電方式
- writeset1302(0x8E,0x80); //根據寫狀態寄存器命令字,寫入保護指令
- // }
- }
- //時分秒函數
- void write_sfm(uchar add,uchar dat)
- {
- uchar gw,sw;
- gw=dat%16;
- sw=dat/16;
- write_com(0x80+0x40+add);
- write_date(0x30+sw);
- write_date(0x30+gw);
- }
- //年月日函數
- void write_nyr(uchar add,uchar dat)
- {
- uchar gw,sw;
- gw=dat%16;
- sw=dat/16;
- write_com(0x80+add);
- write_date(0x30+sw);
- write_date(0x30+gw);
- }
- //星期函數
- /*void write_week(uchar xq)
- {
- uchar x;
- write_com(0x80+12);
- switch(xq)
- {
- case 1:
- for(x=0;x<3;x++)
- {
- write_date(table1[x]);
- }
- break;
- case 2:
- for(x=0;x<3;x++)
- {
- write_date(table2[x]);
- }
- break;
- case 3:
- for(x=0;x<3;x++)
- {
- write_date(table3[x]);
- }
- break;
- case 4:
- for(x=0;x<3;x++)
- {
- write_date(table4[x]);
- }
- break;
- case 5:
- for(x=0;x<3;x++)
- {
- write_date(table5[x]);
- }
- break;
- case 6:
- for(x=0;x<3;x++)
- {
- write_date(table6[x]);
- }
- break;
- case 7:
- for(x=0;x<3;x++)
- {
- write_date(table7[x]);
- }
- break;
- }
- write_com(0x80+12);
- } */
- //寫計工作次數函數
- void write_JS(uchar add,unsigned long dat)
- {
- uchar x,y,z,j,k;
- x=dat/10000;
- y=(dat%10000)/1000;
- z=(dat%1000)/100;
- j=(dat%100)/10;
- k=dat%10;
- write_com(0x80+add);
- write_date(0x30+x);
- write_date(0x30+y);
- write_date(0x30+z);
- write_date(0x30+j);
- write_date(0x30+k);
- }
- //寫單次排量函數
- void write_CS(uchar add,uchar dat)
- {
- uchar gw,sw;
- gw=dat%10;
- sw=dat/10;
- write_com(0x80+add);
- write_date(0x30+sw);
- write_date(0x30+gw);
- }
- //寫總排量函數
- void write_PL(uchar add,unsigned long dat)
- {
- uchar x,y,z,j,k;
- // a=dat/1000000;
- // b=(dat%1000000)/100000;
- x=(dat%100000)/10000;
- y=(dat%10000)/1000;
- z=(dat%1000)/100;
- j=(dat%100)/10;
- k=dat%10;
- write_com(0x80+0x40+add);
- // write_date(0x30+a);
- // write_date(0x30+b);
- write_date(0x30+x);
- write_date(0x30+y);
- write_date(0x30+z);
- write_date(0x30+j);
- write_date(0x30+k);
- }
- //液晶初始化
- void init()
- {
-
- rd=0;
- dula=0;
- wela=0;
- rw=0;
- lcden=0;
- miao=0;
- fen=0;
- shi=0;
- week=1;
- nian=0;
- yue=0;
- ri=0;
- s1num=0;
- s2num=0;
- write_com(0x38);
- write_com(0x0c);
- write_com(0x06);
- write_com(0x01);
- write_com(0x80+1);//年份前兩位固定顯示20
- write_date('2');
- write_date('0');
- delayms(5);
- write_com(0x80+5);
- write_date('-');
- delayms(5);
- write_com(0x80+8);
- write_date('-');
- delayms(5);
- write_com(0x80+0x40+4);
- write_date(':');
- delayms(5);
- write_com(0x80+0x40+7);
- write_date(':');
- delayms(5);
- }
- //鍵盤設置操作
- void keyscan()
- {
- if(s1==0&&s2num==0) //時鐘調整功能鍵,并且不處于計數界面
- {
- delayms(5);
- if(s1==0&&s2num==0)
- {
- s1num++;
-
- while(!s1);
- switch(s1num)
- {
- case 1:
- write_com(0x80+0x40+9);
- write_com(0x0f);
- break;
-
- case 2:
- write_com(0x80+0x40+6);
- break;
- case 3:
- write_com(0x80+0x40+3);
- break;
- case 4:
- write_com(0x80+14);
- break;
- case 5:
- write_com(0x80+10);
- break;
- case 6:
- write_com(0x80+7);
- break;
- case 7:
- write_com(0x80+4);
- break;
- case 8:
- s1num=0;
- writeset1302(0x8e,0x00);//功能鍵停止后,將設置的當前值存入1302
- writeset1302(0x80,miao);
- writeset1302(0x82,fen);
- writeset1302(0x84,shi);
- // writeset1302(0x8a,week);
- writeset1302(0x86,ri);
- writeset1302(0x88,yue);
- writeset1302(0x8c,nian);
- writeset1302(0x8e,0x80);
- write_com(0x0c);
- break;
- }
- }
- }
- if(s1num!=0&&s2num==0)
- {
- if(s2==0) //設置加鍵
- {
- delayms(5);
- if(s2==0)
- {
- while(!s2);
- switch(s1num)
- {
- case 1:
- x1=miao%16;
- x2=miao/16;
- x1++;
- if(x1==10)
- {
- x1=0;
- x2++;
- if(x2>=6)
- x2=0;
- }
- miao=x1+x2*16;
- write_sfm(8,miao);
- write_com(0x80+0x40+9);
- break;
- case 2:
- x1=fen%16;
- x2=fen/16;
- x1++;
- if(x1==10)
- {
- x1=0;
- x2++;
- if(x2>=6)
- x2=0;
- }
- fen=x1+x2*16;
- write_sfm(5,fen);
- write_com(0x80+0x40+6);
- break;
- case 3:
- x1=shi%16;
- x2=shi/16;
- x1++;
- if(x1==10)
- {
- x1=0;
- x2++;
- }
- if(x2>=2&&x1>=4)
- {
- x1=0;
- x2=0;
- }
- shi=x1+x2*16;
- write_sfm(2,shi);
- write_com(0x80+0x40+3);
- break;
- case 4:
- x1=week%10;
- x2=week/10;
- x1++;
- if(x1==8)
- x1=1;
- week=x2*10+x1;
- // write_week(week);
- // write_com(0x80+14);
- break;
- case 5:
- x1=ri%16;
- x2=ri/16;
- x1++;
- if(x1==10)
- {
- x1=0;
- x2++;
- }
- if(x2==3&&x1==2)
- {
- x2=0;
- x1=0;
- }
- ri=x1+x2*16;
- write_nyr(9,ri);
- write_com(0x80+10);
- break;
- case 6:
- x1=yue%16;
- x2=yue/16;
- x1++;
- if(x2==1&&x1==3)
- {
- x1=1;
- x2=0;
- }
- if(x1==10)
- {
- x1=0;
- x2++;
- }
- yue=x1+x2*16;
- write_nyr(6,yue);
- write_com(0x80+7);
- break;
- case 7:
- x1=nian%16;
- x2=nian/16;
- x1++;
- if((x2==9)&&(x1==10))
- {
- x1=0;
- x2=0;
- }
- if(x1==10)
- {
- x2++;
- x1=0;
- }
- nian=x1+x2*16;
- write_nyr(3,nian);
- write_com(0x80+4);
- break;
- }
- }
- }
- if(s3==0&&s2num==0)
- {
- delayms(5);
- if(s3==0&&s2num==0)
- {
- while(!s3);
- switch(s1num)
- {
- case 1:
- x1=miao%16;
- x2=miao/16;
- x1--;
- if(x1==-1)
- {
- x1=9;
- x2--;
- if(x2==-1)
- x2=5;
- }
- miao=x1+x2*16;
- write_sfm(8,miao);
- write_com(0x80+0x40+9);
- break;
- case 2:
- x1=fen%16;
- x2=fen/16;
- x1--;
- if(x1==-1)
- {
- x1=9;
- x2--;
- if(x2==-1)
- x2=5;
- }
- fen=x1+x2*16;
- write_sfm(5,fen);
- write_com(0x80+0x40+6);
- break;
- case 3:
- x1=shi%16;
- x2=shi/16;
- x1--;
- if(x1==-1)
- {
- x1=9;
- x2--;
- if(x2==-1)
- {
- x2=2;
- x1=3;
- }
- }
- shi=x1+x2*16;
- write_sfm(2,shi);
- write_com(0x80+0x40+3);
- break;
- case 4:
- x1=(week)%16;
- x2=(week)/16;
- x1--;
- if(x1==0)
- x1=7;
- week=x1+x2*16;
- // write_week(week);
- // write_com(0x80+14);
- break;
- case 5:
- x1=ri%16;
- x2=ri/16;
- x1--;
- if(x1==-1)
- {
- x1=9;
- x2--;
- if(x2==-1)
- {
- x1=1;
- x2=3;
- }
- }
- ri=x1+x2*16;
- write_nyr(9,ri);
- write_com(0x80+10);
- break;
- case 6:
- x1=yue%16;
- x2=yue/16;
- x1--;
- if((x2==1)&&(x1==-1))
- {
- x1=9;
- x2--;
- }
- if((x2==0)&&(x1==0))
- {
- x1=2;
- x2=1;
- }
- yue=x1+x2*16;
- write_nyr(6,yue);
- write_com(0x80+7);
- break;
- case 7:
- x1=nian%16;
- x2=nian/16;
- x1--;
- if(x1==-1)
- {
- x1=9;
- x2--;
- if(x2==-1)
- {
- x1=9;
- x2=9;
- }
- }
- nian=x1+x2*16;
- write_nyr(3,nian);
- write_com(0x80+4);
- break;
- }
- }
- }
- }
- if(s3num==0&&s1num==0) //切換屏幕
- {
- if(s4==0)
- {
- delayms(5);
- if(s4==0)
- {
- s2num++;
- while(!s4)
- {
- if(s2num==1)
- {
- write_com(0x01);
- write_com(0x80);
- write_date('J');
- write_com(0x80+1);
- write_date('S');
- write_com(0x80+2);
- write_date(':');
- write_com(0x80+4);
- write_JS(3,count);
-
-
-
- write_com(0x80+11);
- write_date('C');
- write_com(0x80+12);
- write_date('S');
- write_com(0x80+13);
- write_date(':');
- write_CS(14,x3);
- write_com(0x80+0x40);
- write_date('P');
- write_com(0x80+0x40+1);
- write_date('L');
- write_com(0x80+0x40+2);
- write_date(':');
- counts=count*x3;
- write_PL(3,counts);
- }
- if(s2num==2)
- {
- s2num=0;
- write_com(0x01);
- write_com(0x80+1);//年份前兩位固定顯示20
- write_date('2');
- write_date('0');
- delayms(5);
-
- write_com(0x80+5);
- write_date('-');
- delayms(5);
- write_com(0x80+8);
- write_date('-');
- delayms(5);
-
- write_com(0x80+0x40+4);
- write_date(':');
- delayms(5);
- write_com(0x80+0x40+7);
- write_date(':');
- delayms(5);
- }
- }
- }
- }
- }
- if(s2num==1&&s1num==0)
- {
- if(s1==0)
- {
- delayms(5);
- if(s1==0)
- {
- s3num++;
- while(!s1)
- switch(s3num)
- {
- case 1: write_com(0x80+15);
- write_com(0x0f);
- break;
- case 2: s3num=0;
- write_com(0x0c);
- writeset1302(0x8e,0x00);
- writeset1302(0xc0,x3);
- writeset1302(0x8e,0x80);
- break;
- }
- }
- }
-
- if(s3num!=0)
- {
- if(s2==0)
- {
- delayms(100);
- if(s2==0)
- {
-
- x3++;
- _nop_();
- if(x3==99)
- x3=0;
-
- }
- write_CS(14,x3);
- write_com(0x80+15);
- }
- if(s3==0)
- {
- delayms(100);
- if(s3==0)
- {
- x3--;
- _nop_();
- if(x3==-1)
- x3=99;
- }
- write_CS(14,x3);
- write_com(0x80+15);
- }
- }
- }
- /* if(s3num==0)
- {
- if(s5==0)
- {
- delayms(100);
- if(s5==0)
- {
- while(!s5)
- {
- count=count+1;
- counts=count*x3;
- if(s2num==1&&s3num==0)
- {
- write_JS(3,count);
- write_PL(3,counts);
- }
- }
- }
- }
- }*/
-
- if(s5==0)
- {
- delayms(100);
- if(s5==0)
- {
- while(!s5)
- {
- count=count+1;
- counts=count*x3;
- if(s2num==1&&s3num==0)
- {
- write_JS(3,count);
- write_PL(3,counts);
- }
- }
- }
- }
- }
-
-
- void main()
- {
-
- cmg88();
- init();
- init1302();
- while(1)
- {
- keyscan();
- if(s1num==0&&s2num==0)
- {
- miao=readset1302(0x81);
- fen=readset1302(0x83);
- shi=readset1302(0x85);
- ri=readset1302(0x87);
- yue=readset1302(0x89);
- nian=readset1302(0x8d);
- week=readset1302(0x8b);
- write_sfm(8,miao);
- write_sfm(5,fen);
- write_sfm(2,shi);
- write_nyr(9,ri);
- write_nyr(6,yue);
- write_nyr(3,nian);
- // write_week(week);
- }
- }
- }
復制代碼
|
-
-
1302時鐘+1602+鍵盤.rar
2019-12-23 10:33 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
101.51 KB, 下載次數: 2, 下載積分: 黑幣 -5
|