includedef.h#definemodeset0x00//对于TM1629无效,对于1721都配置为SEG引脚#definewritedatamode_z0x40//采用地址自动加一方式写显存#definewritedatamode_g0x44//采用固定地址方式写显存#definestartaddress0xc0//起始地址#definereadkeymode0x42//读按键#defineleddisconmode0x8a//LED显示控制#definelcddisconmode0x94//LCD显示控制#definedatacount0x10//采用地址自动加一方式传输数据的个数ucharcodebuf_led[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//存放共阴数码管的段代码,不带小数点ucharcodebuf_ledp[10]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF};//存放共阴数码管的段代码,带小数点//moneyucharcodebuf_lcd[10]={0xEB,0x60,0xC7,0xE5,0x6C,0xAD,0xAF,0xE0,0xEF,0xED};//存放共阴数码管的段代码,不带小数点ucharcodebuf_lcdp[10]={0xFB,0x70,0xD7,0xF5,0x7C,0xBD,0xBF,0xF0,0xFF,0xFD};//存放共阴数码管的段代码,带小数点//weight//ucharcodebuf_lcd[10]={0xBE,0x06,0x7C,0x5E,0xC6,0xDA,0xFA,0x0E,0xFE,0xDE};//ucharcodebuf_lcdp[10]={0xbf,0x07,0x7d,0x5f,0xC7,0xDb,0xFb,0x0f,0xFf,0xDf};uchardatabuf_ser[16]={0};//存放送到LED驱动芯片显存中的值//------------------------------------------------LED串行写1BYTE数据开始----------------------------------------------------------------------voidindata(charp){unsignedinti;STB=0;//保证“STB”为低电平,程序不依赖于之前端口的状态,保证程序在实际运行中不会出现“端口迷失”for(i=0;i8;i++){CLK=0;//先将“CLK”清零if((p&0x01)!=0){DIO=1;//需要传送的数据的低位为“1”,则把“DIO”清零}else{DIO=0;//需要传送的数据的低位为“0”,则把“DIO”置高}CLK=1;//送时钟的上升沿p=p1;//准备送下一个BIT_nop_();_nop_();_nop_();_nop_();}//送完一个字节后退出循环}//------------------------------------------------LED串行写1BYTE数据结束----------------------------------------------------------------------#ifdefONKEYSCAN//------------------------------------------------LED串行读1BYTE数据开始-----------------------------------------------------------------------//输出8BIT数据//在时钟的上升沿通过MCU从LED驱动IC——TM16xx读数据unsignedcharoutdata(){unsignedchari,k=0;//i——控制循环次数,k——临时保存读到的数据DIO=1;//释放DIO为输入STB=0;//保证“STB”为低电平,程序不依赖于之前端口的状态,保证程序在实际运行中不会出现“端口迷失”for(i=0;i8;i++){CLK=0;//先将“CLK”清零k=k1;if(DIO==0){k=k&0x7f;//如果“DIO”为低电平,则把k的最高位清“0”,其他各位保持不变}else{k=(k|0x80&0xff);//如果“DIO”为高电平,则把k的最高位置“1”,其他各位保持不变}CLK=1;//送时钟的上升沿}//送完一个字节后退出循环return(k);//返回读到的1字节数据}//------------------------------------------------LED串行读1BYTE数据结束-----------------------------------------------------------------------#endif//------------------------------------------------采用地址自动加一方式传输显示内容-------------------------------------------------------------voidser_display_a(){uintj;//j——控制本次需要传多少个字节显示数据uchartempdis;tempdis=0;DIO=1;CLK=1;STB=1;//通讯开始前通讯端口全部初始化为“1”indata(modeset);//传输模式设置命令STB=1;indata(writedatamode_z);//传数据设置命令,设置采用地址自动加1方式写显示数据STB=1;//数据设置命令传完后需要将“STB”置“1”indata(startaddress);//传起始地址//地址命令传完后,“STB”保持为“0”继续传需要显示的数据for(j=0;jdatacount;j++){if((disbit==0)&&(j5)){tempdis=(buf_ser[j]4)&0xf0;buf_ser[j]=(buf_ser[j]4)&0x0f;buf_ser[j]|=tempdis;}indata(buf_ser[j]);//在连续传显示的数据过程中,STB保持为0}STB=1;//传完所有的显示数据后(最多14BYTE)后,将“STB置“1”if(disbit==1){indata(leddisconmode);//传LED显示控制命令}else{indata(lcddisconmode);//传LCD显示控制命令}STB=1;//显示控制命令传完后将“STB”置“1”}//采用固定地址方式voidser_display_g(ucharaddress,uchardisa){DIO=1;CLK=1;STB=1;//通讯开始前通讯端口全部初始化为“1”indata(writedatamode_g);//传数据设置命令,设置采用固定地址模式STB=1;indata(address);//传显示数据对应的地址indata(disa);//保持“STB”=“0”,传1BYTE显示数据STB=1;//传完显示数据后将“STB”置“1”if(disbit==1){indata(leddisconmode);//传LED显示控制命令}else{indata(lcddisconmode);//传LCD显示控制命令}STB=1;//显示控制命令传完后将“STB”置“1”}//------------------------------------------上电自检------------------------------------------------voiddischeck(){uchardisi,discyc,disdata;uchartempdis,tempdisl;for(discyc=0;discyc10;discyc++){if(disbit==1){disdata=buf_ledp[discyc];}else{disdata=buf_lcdp[discyc];}DIO=1;CLK=1;STB=1;//通讯开始前通讯端口全部初始化为“1”indata(writedatamode_z);//传数据设置命令,设置采用地址自动加1方式写显示数据STB=1;//数据设置命令传完后需要将“STB”置“1”indata(startaddress);//传起始地址//地址命令传完后,“STB”保持为“0”继续传需要显示的数据for(disi=0;disidatacount;disi++){tempdis=disdata;if((disbit==0)&&(disi5)){tempdis=((disdata4)&0xf0);tempdisl=((disdata4)&0x0f);tempdis|=tempdisl;}indata(tempdis);//在连续传显示的数据过程中,“STB”一直保持为”0“}STB=1;//传完所有的显示数据后(最多14BYTE)后,将“STB置“1”if(disbit==1){indata(leddisconmode);//传LED显示控制命令}else{indata(lcddisconmode);//传LCD显示控制命令}STB=1;//显示控制命令传完后将“STB”置“adcdata_int=adccon();//启动ADC,采集初始数据作为每次测量的极小值}ser_display_a();//显示内容初始化}#includedef.h#definemodeset0x00//对于TM1629无效,对于1721都配置为SEG引脚#definewritedatamode_z0x40//采用地址自动加一方式写显存#definewritedatamode_g0x44//采用固定地址方式写显存#definestartaddress0xc0//起始地址#definereadkeymode0x42//读按键#defineleddisconmode0x8a//LED显示控制#definelcddisconmode0x94//LCD显示控制#definedatacount0x10//采用地址自动加一方式传输数据的个数ucharcodebuf_led[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//存放共阴数码管的段代码,不带小数点ucharcodebuf_ledp[10]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF};//存放共阴数码管的段代码,带小数点//moneyucharcodebuf_lcd[10]={0xEB,0x60,0xC7,0xE5,0x6C,0xAD,0xAF,0xE0,0xEF,0xED};//存放共阴数码管的段代码,不带小数点ucharcodebuf_lcdp[10]={0xFB,0x70,0xD7,0xF5,0x7C,0xBD,0xBF,0xF0,0xFF,0xFD};//存放共阴数码管的段代码,带小数点//weight//ucharcodebuf_lcd[10]={0xBE,0x06,0x7C,0x5E,0xC6,0xDA,0xFA,0x0E,0xFE,0xDE};//ucharcodebuf_lcdp[10]={0xbf,0x07,0x7d,0x5f,0xC7,0xDb,0xFb,0x0f,0xFf,0xDf};uchardatabuf_ser[16]={0};//存放送到LED驱动芯片显存中的值//------------------------------------------------LED串行写1BYTE数据开始------