资源描述
E:Itemdesigntmxx led demoswcurrency.c/*File name:Author:Version:Date:MCU:leddriver demo programmexcwyleddemo 0.12006年7月21日AT89S5212Mkeilc v3.05c/ 文件名/ 作者/ 版本/ 完成日期/ 单片机型号/ 单片机使用的晶体频率/ 软件开发环境Description: 本程序是深圳市天微电子有限公司LED驱动IC的演示程序,采用C语言编写/ 用于详细说明此程序文件完成的主要功能,与其他模块/ 或函数的接口,输出值、取值范围、含义及参数间的控/ 制、顺序、独立或依赖等关系Others:本程序仅仅提供演示,任何个人或企业直接使用本程序造成的损失本公司不承担任何责任/ 其它内容的说明Function List:1.delay()2.indate()3.outdate()4.display()延时程序通过MCU向LEDdriver中写入一字节的数据通过MCU从LEDdriver中读出一字节的数据采用地址自动加1方式的显示程序5.display2() 采用固定地址方式的显示程序6.in_led()7.out_sw()采用地址自动加一方式先LED显存读SW输入口状态/ 主要函数列表,每条记录应包括函数名及功能简要说明History:1. Date:Author:/ 修改历史记录列表,每条修改记录应包括修改日期、修改/ 作者及修改内容简述2006年7月21日9:02xcwyModification:1)进一步添加了详细的注释2. Date:Author:xcwy2006年12月17日Modification:1)修改为本公司通用的LED驱动程序* */#include #include#include/*#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#definetm1616tm1618tm1618atm1620tm1620btm1623tm1624tm1626atm1626btm1626ctm1626dtm1628tm1629tm1629atm1629btm1629ctm1629dtm1638tm1668tw16281234567891011121314151617181920#defineicmodeltm1616/这里选择的TM1616,更改“tm1616”可以得到其他型号IC的驱动程序#if icmodel=tm1616Page: 1E:Itemdesigntmxx led demoswcurrency.c#define seg#define grid74#define dismodel 1#elif icmodel=tm1618#define seg#define grid#define key573#define dismodel 4#elif icmodel=tm1618a#define seg#define grid#define key754#define dismodel 2#elif icmodel=tm1620#define#defineseggrid86#definedismodel 3#elif icmodel=tm1620b#define#define#defineseggridkey673#definedismodel 4#elif icmodel=tm1623#define#define#defineseggridkey1174#definedismodel 4#elif icmodel=tm1624#define#defineseggrid117#definedismodel 4#elif icmodel=tm1626a#define#define#define#define#defineseggridkeyswled107526#definedismodel 4#elif icmodel=tm1626b#define#define#define#define#defineseggridkeyswled117546#definedismodel 4#elif icmodel=tm1626c#define#define#define#defineseggridkeyled11751#definedismodel 4#elif icmodel=tm1626d#define#define#define#defineseggridkeyled10751#definedismodel 4#elif icmodel=tm1628#define#define#defineseggridkey1074#definedismodel 4#elif icmodel=tm1629Page: 2E:Itemdesigntmxx led demoswcurrency.c#define#define#defineseggridkey1684#definedismodel 1#elif icmodel=tm1629a#define#defineseggrid168#definedismodel 1#elif icmodel=tm1629b#define#define#defineseggridkey1484#definedismodel 1#elif icmodel=tm1629c#define#define#defineseggridkey1584#definedismodel 1#elif icmodel=tm1629d#define#define#defineseggridkey1284#definedismodel 1#elif icmodel=tm1638#define#define#defineseggridkey1084#definedismodel 1#elif icmodel=tm1668#define#define#defineseggridkey1075#definedismodel 1#elif icmodel=tw1628#endif#else#error 你必须确认IC的型号是否存在?#define#define#define#defineseggridkeydismodel10751#define#define#define#define#define#define#define#define#define#definedissetmodewritedatamode_zwriteledmode_zreadkeymodereadswmodewritedatamode_gwriteledmode_gstartaddressdisconmodedatacount0x030x400x410x420x430x440x450xc00x8c2*grid/显示模式设置/采用地址自动加一方式写显存/采用地址自动加一方式写LED显存命令/读按键命令/读SW口命令/采用固定地址方式写显存/采用固定地址方式写LED显存命令/起始地址/显示控制/采用地址自动加一方式传输数据的个数/定义全局变量unsigned char k1,k2,k3,k4,k5;unsigned da_sw;/按键值寄存器/SW寄存器unsigned int/端口的定义count;sbitsbitSTBCLK=P20;=P21;sbitsbitDIOSPEAK=P22;=P27;/串行通讯口/外接蜂鸣器,可以不必理会/*子程序开始*Page: 3E:Itemdesigntmxx led demoswcurrency.c/-延时程序开始-void delay(int k)unsigned char i,j;for(;k0;k-)for(j=255;j0;j-)for(i=255;i0;i-);/-延时程序结束-/-写入输入1个字节(8bit)到LED_IC程序开始-/输入8BIT数据/在时钟的上升沿通过MCU向LED驱动ICTM16xx写数据void indate(unsigned char p)unsigned int i;STB=0;/保证“STB”为低电平,程序不依赖于之前端口的状态/保证程序在实际运行中不会出现“端口迷失”for(i=0;i1;DIO=1;DIO=0;/需要传送的数据的低位为“1”,则把“DIO”清零/需要传送的数据的低位为“0”,则把“DIO”置高/送时钟的上升沿/准备送下一个BIT/送完一个字节后退出循环/-写入输入1个字节(8bit)到LED_IC程序结束-/-从LED_IC读入1个字节(8bit)程序开始-/输出8BIT数据/在时钟的上升沿通过MCU从LED驱动ICTM16xx读数据#ifdef keyunsigned char outdate()unsigned char i,k=0;DIO=1;STB=0;/i控制循环次数,k临时保存读到的数据/释放DIO为输入/保证“STB”为低电平,程序不依赖于之前端口的状态/保证程序在实际运行中不会出现“端口迷失”for(i=0;i1;if(P2&0x04)=0)k=k&0x7f;/先将“CLK”清零/如果“DIO”为低电平,则把k的最高位清“0”,其他各位保持不变elsek=(k|0x80&0xff); /如果“DIO”为高电平,则把k的最高位置“1”,其他各位保持不变CLK=1;return(k);/送时钟的上升沿/送完一个字节后退出循环/返回读到的1字节数据#endif/-从LED_IC读入1个字节(8bit)程序结束-/-采用地址自动加一方式传输地址和数据开始-/采用地址自动加1方式Page: 4E:Itemdesigntmxx led demoswcurrency.c/上电后LED-DRIVER显存中的数据是随机的,上电后马上传显示控制命令字(打开显示),会出现乱码。/为避免上述现象,用户可以先传显示控制命令将显示关掉(见应用手册中详细介绍),然后正常操作/也可以先主动刷新LED-DRIVER显存中的数据。然后开显示/这里采用是第二种方法void display(unsigned char disa)unsigned int i;DIO=1;CLK=1;STB=1;indate(writedatamode_z);STB=1;indate(startaddress);/i控制本次需要传多少个字节显示数据/通讯开始前通讯端口全部初始化为“1”/传数据设置命令,设置采用地址自动加1方式写显示数据,/数据设置命令传完后需要将“STB”置“1”/传起始地址/地址命令传完后,“STB”保持为“0”继续传需要显示的数据for(i=0;i=1)k1=outdate();if(key=2)k2=outdate();if(key=3)k3=outdate();if(key=4)k4=outdate();if(key=5)k5=outdate();STB=1;return 0;/读键结束将“STB”置“1”#endif/-按键扫描程序结束-Page: 5E:Itemdesigntmxx led demoswcurrency.c/-PWM数据传输开始-#ifdef ledunsigned char in_led()STB=1;indate(writeledmode_z);STB=1;/数据设置命令,设置为写LED显存indate(0xc0);indate(0x0f);indate(0x0f);indate(0x0f);indate(0x00);indate(0x0f);indate(0x0f);indate(0x0f);indate(0x00);/起始地址,这里的地址和/LED1宽度设置/LED2宽度设置/LED3宽度设置/关闭LED123同步调节/LED4宽度设置/LED5宽度设置/LED6宽度设置/关闭LED456同步调节STB=1;return 0;#endif/-PWM数据传输结束-#ifdef ledunsigned char in_led_g(unsigned char adress_led,da_led)STB=1;indate(writeledmode_g);STB=1;indate(adress_led);indate(da_led);STB=1;return 0;#endif/-读入SW口状态开始-#ifdef swunsigned char out_sw()STB=1;indate(readswmode);/数据设置命令,设置为读SW输入口da_sw=outdate();STB=1;return 0;#endif/-读入SW口状态结束-/*子程序结束*/*主程序开始*void main(void)SPEAK=0;DIO=1;CLK=1;STB=1;indate(dissetmode);/传显示模式设置命令,设置为7个“GRID”方式/这里不在详细给出多个显示模式的设置程序请参考产品应用手册,显示模式在上电设置好后不允许更改STB=1;display(0xff);delay(10);display2(0xC0,0x00);delay(10);#ifdef keyPage: 6/全亮/采用固定地址方式向C0地址单元写00E:Itemdesigntmxx led demoswcurrency.ckeyscan();/调用按键扫描程序#endif/本程序仅仅提供按键扫描,2次按键扫描的时间不得10MS,在这里不提供按键处理程序#ifdef ledin_led();delay(10);in_led_g(0xc0,0x00);#endif#ifdef swout_sw();/6路PWM输出口输出1/让LED1输出0/调用读SW输入口程序#endif/这里不提供SW口处理程序_nop_();/*主程序结束*Page: 7
展开阅读全文