【例4.4】74HC595驱动数码管实现秒计时
1.输出数据用cy进位输出
2.使用定时器定时1秒
CY(Carry)在单片机里是进位标志。CY=0是无溢出,CY=1有溢出。用于表示加法进算中的进位和减法运算中的借位,加法运算中有进位或减法运算中有借位则CY位置1,否则为0。对无符号数的运算,判断只需CY即可,对于无符号数的运算,CY位就可以表示其是否溢出。但如果是有符号数,则不能按CY标志来判断了。
#include#includesbit sbclk=P2^5: //H74HC595的时钟引脚sbit sbsck=P2^6; //74HC595的控制引脚sbit sbser=P2^0;//74HC595的数据引脚unsigned char temp;unsigned char counter=0x00;//计数器bit bT0flg=0;//T0标志位unsigned char code sbserY_CODE[]=//字形编码{0xc0.0xf9.0xa4.0xb0.0x99,0x92,0x82,0xf8,0x80,0x90,};/定时器0初始化函数void InitT0(void){TMOD=0x01;//使用工作方式1TH0=0xFF;TL0=0x9C;//100ms定时ET0=1;//开启定时器0中断TR0=1;//启动定时器}//定时器0中断处理函数void Timer0Deal(void) interrupt 1 using l{ET0=0;//关闭中断TH0=0xFF;//重新装入预置值TL0=0x9C;ET0=1://打开T0中断counter++:if(counter==10)//定时1s{bTOfg=1;//定时器中断标志位置位counter=0;}}//H74HC595的输出函数,参数为待输出的数据void output595(unsigned char temp){unsigned char;for(i=0;i<8;i++){temp<<=1//移位sbser=CY;//数据输入sbclk=1://发送控制信号_nop_();//延时_nop_();sbclk=0;//清除控制信号}}//74HC595的时钟输出函数void clk595 (){sbsck=0;//时钟线清除_ nop _();sbsck=1;//时钟线++_ nop _();sbsck=0;}void main(){unsigned char timer;InitT0();//初始化TOEA=1;//开启中断while(1)//循环输出0~9{while(bTOflg==0);//等待秒信号bTOflg=0;timer++;//秒计数器增加if(timer>9){timer=0;//到9则恢复到0 } output595(sbserY_CODE[timer]); clk595();}}