您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 酒店餐饮 > TM1629A芯片参考程序
tm1629.c/**版权信息:*文件名:TM1629A芯片参考程序*当前版本:1.0*单片机型号:AT89S52*开发环境:KeiluVision3*晶震频率:12M*作者:*完成日期:2009-05-05功能:驱动共阴LED数码屏做时钟显示,可由按键控制时钟暂停,开始,停止以及其它数码管显示0-9数字,数码管可以由按键调节显示不同数字*/#includereg52.h#includeintrins.h#definenop_nop_();#defineucharunsignedchar#defineuintunsignedintsbitstb=P1^0;//定义片选通讯口sbitclk=P1^1;//定义时钟通讯口sbitdio=P1^2;//定义数据输入/输出通讯口bdatauchary=0;//定义可以位寻址全局变量ysbity7=y^7;ucharshow[16]={0x76,0x7b,0x38,0x38,0x3f,0x40,0x40,0x40,0x40,0x40};//初始化显示“HELLO”字符代码ucharCODE[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9显示代码ucharTIME_seconds,seconds_2,sub_1,sub_2,shi_1,shi_2;//时间寄存器,依次从秒个位至小时十位ucharTIME_count;//定时中断控制制位ucharT_count;//时钟小数点闪ucharcount4;//保存按键控制对应的数码管闪ucharkey_FLAG1;//按键标志位ucharkey_COUNT1;//按键移动数动显示数据ucharkey_LED=0;//按键单独显示赋值寄存器ucharcount7;第1页tm1629.c/*********************************功能:TM1629写数据**********************************/voidwrite(ucharwr_data){uchari;stb=0;//给有效的片选信号(片选信号是低电平有效)nop;nop;for(i=0;i8;i++)//开始传送8位数据,每循环一次传送一位数据{clk=0;nop;nop;wr_data=1;//移位数据,低位在前!nop;dio=CY;nop;nop;clk=1;nop;}}/*********************************功能:读按键子程序由y返回1BIT按键数据**********************************/unsignedcharread(){uchard;stb=0;//给有效的片选信号(片选信号是低电平有效)dio=1;//将DIO置高,因为没有按键按下时,键值默认为00H,此时为了与键值有区别for(d=0;d8;d++){clk=0;第2页tm1629.cnop;if(dio==1){y7=1;}else{y7=0;}clk=1;if(d!=7){y=(y1);}nop;nop;}return(y);}/*********************************TM1629控制指令功能:驱动LED屏做相应的显示**********************************/voidxianshi(ucharshow_led[16]){ucharh;stb=1;clk=1;dio=1;write(0x40);//写数据到显示寄存器,采用地址自动加一stb=1;write(0xc0);//显示寄存器的00H单元开始for(h=0;h16;h++){write(show_led[h]);//给显示寄存器送数据,}stb=1;write(0x8b);//显示控制参数,点亮数码屏幕,亮度可以通过改变低三位调节stb=1;第3页tm1629.c}//-------读按键以及相应的显示处理-------voidpanjian(){ucharcount3,key[4];stb=1;write(0x42);//送读按键命令(42H),for(count3=0;count35;count3++){key[count3]=read();//读4BIT按键数据,}if((key_FLAG1!=0x02)){if((key[0]==0x01)){key_LED=0;key_FLAG1=0x01;show[key_COUNT1]=CODE[key_LED];}//K3与SEG1按键按下,数码管显示数字0if((key[0]==0x02)){key_LED=1;key_FLAG1=0x01;show[key_COUNT1]=CODE[key_LED];}//K2与SEG1按键按下,数码管显示数字1if((key[0]==0x04)){key_LED=2;key_FLAG1=0x01;show[key_COUNT1]=CODE[key_LED];}//K1与SEG2按键按下,数码管显示数字2。if((key[0]==0x08)){key_LED=3;key_FLAG1=0x01;show[key_COUNT1]=CODE[key_LED];}//K0与SEG2按键按下,数码管显示数字3。if((key[0]==0x80)){key_LED=4;key_FLAG1=0x01;show[key_COUNT1]=CODE[key_LED];}//K0与SEG3按键按下,数码管显示数字4。if((key[0]==0x40)){key_LED=5;key_FLAG1=0x01;show[key_COUNT1]=CODE[key_LED];}//K1与SEG3按键按下,数码管显示数字5。if((key[0]==0x20)){key_LED=6;key_FLAG1=0x01;show[key_COUNT1]=CODE[key_LED];}//K2与SEG4按键按下,数码管显示数字6。if((key[0]==0x10)){key_LED=7;key_FLAG1=0x01;show[key_COUNT1]=CODE[key_LED];}//K3与SEG4按键按第4页tm1629.c下,数码管显示数字7。if((key[1]==0x01)){key_LED=8;key_FLAG1=0x01;show[key_COUNT1]=CODE[key_LED];}//K3与SEG5按键按下,数码管显示数字8。if((key[1]==0x02)){key_LED=9;key_FLAG1=0x01;show[key_COUNT1]=CODE[key_LED];}//K2与SEG5按键按下,数码管显示数字9}if((key[1]==0x04)){key_FLAG1=0x00;count7=0;}//K1与SEG6按键按下,key_FLAG1=0x00启动定时器,时间开始。if((key[1]==0x08)){count7=0x01;TR0=0;key_FLAG1=0x02;}//当K0与SEG6按键按下,key_FLAG1=0x02单独显示数字按键无效!暂停。if((key[1]==0x80))//K0与SEG7按键按下,key_FLAG1=0x00启动定时器,时间开始。{key_FLAG1=0x00;count7=0;shi_2=0;shi_1=0;sub_2=0;sub_1=0;seconds_2=0;TIME_seconds=0;}if((key[1]==0x40))//K1与SEG7按键按下,控制数码管右移一位{show[key_COUNT1]=count4;key_FLAG1=0x01;//key_FLAG1=0x00关闭定时器,时间暂停。key_COUNT1++;if((key_COUNT1==10)){key_COUNT1=0;}}if((key[1]==0x20))//K2与SEG7按键按下,控制数码管左移一位{第5页tm1629.cshow[key_COUNT1]=count4;key_FLAG1=0x01;//key_FLAG1=0x00关闭定时器,时间暂停。if((key_COUNT1==0)){key_COUNT1=10;}key_COUNT1-=1;}if((key_FLAG1==0x01)){count4=show[key_COUNT1];}//保存当前按键位显示数据if((count7!=0x01)){key_FLAG1=0;}}/**********************************定时中断函数入口功能:每50MS中断一次**********************************/voidtime0(void)interrupt1using2{TH0=0x3c;TL0=0xb0;TIME_count++;if(TIME_count==21){TIME_count=0;TIME_seconds++;//秒寄存器加1T_count^=0x80;}}/*********************************时钟函数功能:处理时钟显示**********************************/voidTIME_show(){//sub_1=sub_1|0x80;//shi_1=shi_1|0x80;show[15]=CODE[TIME_seconds];//数码屏上最后一个“8”字,依次下去show[14]=CODE[seconds_2];//数码屏倒数第二个“8”字,第6页tm1629.cshow[13]=CODE[sub_1]|T_count;show[12]=CODE[sub_2];show[11]=CODE[shi_1]|T_count;show[10]=CODE[shi_2];if(TIME_seconds==10)//对时间数据进行处理,以免溢出。{TIME_seconds=0;seconds_2+=1;}if(seconds_2==6){seconds_2=0;sub_1+=1;}if(sub_1==10){sub_1=0;sub_2+=1;}if(sub_2==6){sub_2=0;shi_1+=1;}if(shi_1==10){shi_1=0;shi_2+=1;}if(shi_2==6)//时钟每60小时自动清0{shi_2=0;shi_1=0;sub_2=0;sub_1=0;第7页tm1629.cseconds_2=0;TIME_seconds=0;}}/*********************************延时函数功能:1ms延时**********************************/voiddelay_ms(ucharcyc){//当将=1的时候,延时1msucharii,jj;for(jj=1;jj=cyc;jj++){for(ii=0;ii200;ii++){nop;}}}/*********************************主函数**********************************/voidmain(){ucharcount6;//按键按下时,所控制的位闪!P0=0xff;P1=0xff;P2=0xff;P3=0xff;//初始化单片机I/O口TMOD=0x01;//定时器设置TH0=0x3c;TL0=0xb0;IE=0x82;TF0=1;xianshi(show);//初始化显示“HELLO”字符_delay_ms(230);第8页tm1629.c_delay_ms(230);_delay_ms(230);_delay_ms(230);_delay_ms(230);//共延时1scount4=show[key_COUNT1];while(1)//循环{count6+=
本文标题:TM1629A芯片参考程序
链接地址:https://www.777doc.com/doc-1387929 .html