光立方基于74hc595的上位机(取模软件)控制程序光立方基于74hc595的上位机(取模软件)控制程序第一页共六页光立方基于74hc595的上位机(取模软件)控制程序#includereg52.h//头文件#includeintrins.h//头文件#defineucharunsignedchar//宏定义sbitSHCP=P1^0;//595移位寄存器时钟,上升沿有效sbitSTCP=P1^1;//595存储器时钟,上升沿有效sbitDS=P1^2;//数据输入端sbitOE=P1^3;//数据输出端sbitKEY1=P3^0;//组合按键sbitKEY2=P3^1;//调时按键sbitKEY3=P3^2;//调分按键uchari,j,hour,min,sec;//定义的全局变量,初值默认为零uchartab1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//0-9,和分隔符-的段码(共阳数码管)uchartab2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选码/*………延时子程序…………*/voiddelay(uchartime)//入口参数time{ucharm,n;//定义局部变量for(m=0;mtime;m++)光立方基于74hc595的上位机(取模软件)控制程序光立方基于74hc595的上位机(取模软件)控制程序第二页共六页for(n=0;n10;n++);}/*....发送数据子程序.....*/voidwrite595(uchardat)//带有参数,函数入口dat{uchartmp,k;//定义局部变量for(k=0;k8;k++)//循环8次,发送一个字节的数据{tmp=dat&0x80;//取最高位的数据,并将数据放入tmp中dat=1;//数据左移一位DS=tmp;//将tmp中的数据写入DS端SHCP=0;//将SHCP置0SHCP=1;//将SHCP置1,则上升沿到来,寄存器数据移位}STCP=0;//将STCP置0STCP=1;//将STCP置1,数据存入存储器}/*………..数码管显示子程序…………*/voiddisplay(void){光立方基于74hc595的上位机(取模软件)控制程序光立方基于74hc595的上位机(取模软件)控制程序第三页共六页for(i=0;i8;i++)//循环8次,数码管显示一个字节{switch(i){case0:write595(tab1[hour/10]);break;//数据取整,显示时十位case1:write595(tab1[hour%10]);break;//数据取余,显示时个位case2:write595(tab1[10]);break;//显示时与分之间的横杠case3:write595(tab1[min/10]);break;//数据取整,显示分十位case4:write595(tab1[min%10]);break;//数据取余,显示分个位case5:write595(tab1[10]);break;//显示分与秒之间的横杠case6:write595(tab1[sec/10]);break;//数据取整,显示秒十位case7:write595(tab1[sec%10]);break;//数据取余,显示秒个位}OE=0;//打开输出,输出595存储器数据光立方基于74hc595的上位机(取模软件)控制程序光立方基于74hc595的上位机(取模软件)控制程序第四页共六页P2=~tab2[i];//位选输出,选通对应的时分秒数码管delay(10);//调用延时子程序OE=1;//关闭输出,同时具有消隐作用}}/*………………时间调整函数………………….*/voidtimeadjust(void){if((!KEY1)&&(!KEY2))//当KEY1和KEY2同时按下时执行此语句{delay(10);//延时if((!KEY1)&&(!KEY2)){while(!KEY2);hour++;}//确实有按键按下,则时加1,到24自动归0}if((!KEY1)&&(!KEY3))//当KEY1和KEY3同时按下时执行此语句{delay(10);//延时if((!KEY1)&&(!KEY3)){while(!KEY3);min++;}//确实有按键按下,则分加1,到60自动归0}光立方基于74hc595的上位机(取模软件)控制程序光立方基于74hc595的上位机(取模软件)控制程序第五页共六页}/*………………主函数………………*/voidmain(void){TMOD=0x01;//定时器T0,工作方式1TH0=(65536-50000)/256;//T0高八位装定时初值TL0=(65536-50000)%256;//T0低八位装定时初值EA=1;//开总中断ET0=1;//开T0中断TR0=1;//开定时器T0while(1)//循环{display();//调用显示子程序timeadjust();}}/*……………中断函数……………*/voidtimer0_intp()interrupt1//中断号为1{TH0=(65536-50000)/256;//重装高八位初值TL0=(65536-50000)%256;//重装低八位初值光立方基于74hc595的上位机(取模软件)控制程序光立方基于74hc595的上位机(取模软件)控制程序第六页共六页j++;//中断次数计数变量,每发生一次中断加1if(j==20){j=0;sec++;}//j中断20次为1秒,同时秒加1elseif(sec==60){sec=0;min++;}//秒到60,归0同时分加1elseif(min==60){min=0;hour++;}//分到60,归0同时时加1elseif(hour==24)hour=0;//时到24,归0}