|
本帖最后由 冇妖气 于 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);
- }
- }
- }
复制代码
|
|