您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > TM1639驱动代码
数码管和按键驱动芯片TM1639驱动代码2010年06月24日星期四00:28//********************************************************************************************************************************//TM1639.h//数码管和按键驱动芯片TM1639函数接口和芯片操作相关宏定义//********************************************************************************************************************************#ifndef_TM1639_H#define_TM1639_H//位使能#defineDIG00xc0#defineDIG10xc2#defineDIG20xc4#defineDIG30xc6#defineDIG40xc8#defineDIG50xca#defineDIG60xcc#defineDIG70xce//显示亮度级别#defineLEVEL_OFF0x80#defineLEVEL_10x88#defineLEVEL_20x89#defineLEVEL_40x8a#defineLEVEL_100x8b#defineLEVEL_110x8c#defineLEVEL_120x8d#defineLEVEL_130x8e#defineLEVEL_140x8f//初始化IC端口voidInitTM1639();//连续传送多个数据voidSeriesInData(unsignedcharstarAddr,unsignedchar*data,unsignedcharloop,unsignedcharlevel);//传送一个数据(本质是连续模式)voidOneByteInData(unsignedcharstarAddr,unsignedchar*data,unsignedcharlevel);//清楚所有显示数据voidClearAll();//读取按键键值voidKeyRead(int*key);//测试模式,内部使用,检验硬件完整性voidICTest();#endif//********************************************************************************************************************************//TM1639.C//数码管和按键驱动芯片TM1639函数代码//********************************************************************************************************************************#includeBitOpt.h#includeTM1639.h#includespce061a.h//端口位操作全局变量,根据情况修改端口BIT16*bitPort1639=(BIT16*)P_IOA_Data;BIT16*bitPort_Dir1639=(BIT16*)P_IOA_Dir;BIT16*bitPort_Att1639=(BIT16*)P_IOA_Attrib;//端口设置,根据情况修改端口位#defineDIOWRB0(bitPort1639)#defineDIO_DIRWRB0(bitPort_Dir1639)#defineDIO_ATTWRB0(bitPort_Att1639)#defineCLKWRB1(bitPort1639)#defineCLK_DIRWRB1(bitPort_Dir1639)#defineCLK_ATTWRB1(bitPort_Att1639)#defineSTBWRB2(bitPort1639)#defineSTB_DIRWRB2(bitPort_Dir1639)#defineSTB_ATTWRB2(bitPort_Att1639)//工作模式,可以进行|组合#defineMD_WRITE0x40//采用地址自动加一方式写显存#defineMD_AUTOMD_WRITE#defineMD_NORMALMD_WRITE#defineMD_READKEY0x42//读按键命令#defineMD_FIX0x44//采用固定地址方式写显存#defineMD_TEST0x48//测试模式//****************************************************************//写入输入1个字节(8bit)到LED_IC程序开始//输入8BIT数据//在时钟的上升沿通过MCU向LED驱动IC——TM16xx写数据//----------------------------------------------------------------voidindate(unsignedcharinput){unsignedinti;//DIO设为输出DIO_DIR=1;DIO_ATT=1;STB=0;//保证“STB”为低电平,程序不依赖于之前端口的状态//保证程序在实际运行中不会出现“端口迷失”for(i=0;i8;i++){CLK=0;//先将“CLK”清零if((input&0x01)!=0)DIO=1;//需要传送的数据的低位为“1”,则把“DIO”清零elseDIO=0;//需要传送的数据的低位为“0”,则把“DIO”置高CLK=1;//送时钟的上升沿input=input1;//准备送下一个BIT}//送完一个字节后退出循环}//****************************************************************//写入输入1个字节(8bit)到LED_IC程序开始//从LED_IC读入1个字节(8bit)程序开始//输出8BIT数据//在时钟的上升沿通过MCU从LED驱动IC——TM16xx读数据//----------------------------------------------------------------unsignedcharoutdate(){unsignedchari,out=0;//DIO设为上拉输入DIO_DIR=0;DIO_ATT=0;DIO=1;STB=0;//保证“STB”为低电平,程序不依赖于之前端口的状态//保证程序在实际运行中不会出现“端口迷失”for(i=0;i8;i++){CLK=0;//先将“CLK”清零out=out1;if(DIO==0)out=out&0x7f;//如果“DIO”为低电平,则把out的最高位清“0”,其他各位保持不变else//如果“DIO”为高电平,则把out的最高位置“1”,其他各位保持不变out=out|0x80;CLK=1;//送时钟的上升沿}return(out);//返回读到的1字节数据}//****************************************************************//采用固定地址方式传输地址和数据开始//采用固定地址方式//----------------------------------------------------------------/*voiddisplay2(unsignedcharadress,unsignedchardata){DIO=1;CLK=1;STB=1;//通讯开始前通讯端口全部初始化为“1”indate(MD_FIX);//数据设置命令STB=1;indate(adress);//传显示数据对应的地址indate(data);//保持“STB”=“0”,传1BYTE显示数据STB=1;//传完显示数据后将“STB”置“1”}*//****************************************************************初始IC三个端口DIO,CLK,STB全部设置成不带反相器高电平输出****************************************************************/voidInitTM1639(){CLK_DIR=1;CLK_ATT=1;CLK=1;STB_DIR=1;STB_ATT=1;STB=1;DIO_DIR=1;DIO_ATT=1;DIO=1;}/****************************************************************连续传递数据,数据最多16bytestatAddr:起始地址data:连续写入数据的起始数据地址len:连续写入数据的长度,len*2+DIG0DIG7leve:亮度级别注:如果len*2+DIG0地址DIG7那么,多出来的地址返回到DIG0,如此循环。本函数可以防止上电后马上传显示数据,会出现乱码。****************************************************************/voidSeriesInData(unsignedcharstarAddr,unsignedchar*data,unsignedcharlen,unsignedcharlevel){inti;//通讯开始前通讯端口全部初始化为“1”DIO=1;CLK=1;STB=1;indate(MD_AUTO);//传数据设置命令,设置采用地址自动加1方式写显示数据,STB=1;//数据设置命令传完后需要将“STB”置“1”indate(starAddr);//传起始地址//关键部分(数据分两次传递到两个地址里面去)for(i=0;ilen;++i){indate(*data&0x0f);//低地址indate(*data4&0x0f);//高地址++data;}STB=1;//传完所有的显示数据后(最多14BYTE)后,将“STB置“1”indate(level);STB=1;//显示控制命令传完后将“STB”置“1”}/****************************************************************连续一位数码管数据statAddr:起始地址data:连续写入数据的起始数据地址leve:亮度级别注:本质上这个函数也是使用连续模式写入的,非连续模式我写不进去。这个函数可以防止由于使用SeriesInData函数导致写入长度越界****************************************************************/voidOneByteInData(unsignedcharstarAddr,unsignedchar*data,unsignedcharlevel){DIO=1;CLK=1;STB=1;//通讯开始前通讯端口全部初始化为“1”indate(MD_AUTO);//传数据设置命令,设置采用地址自动加1方式写显示数据,STB=1;//数据设置命令传完后需要将“STB”置“1”indate(starAddr);//传起始地址//关键部分(数据分两次传递到两个地址里面去)indate(*data&0x0f);//低地址indate(*data4&0x0f);//高地址STB=1;//传完所有的显示数据后(最多14BYTE)后,将“STB置“1”indate(level);STB=1;//显示控制命令传完后将“STB”置“1}/*******************************************
本文标题:TM1639驱动代码
链接地址:https://www.777doc.com/doc-7101907 .html