- ****************************************************************************************************/ #include < REG52.h>
- #include<stdio.h> #include<intrins.h>//************************************************************************************************** #define tm1616 1
- #define tm1618 2
- #define tm1618a 3
- #define tm1620 4
- #define tm1620b 5
- #define tm1623 6
- #define tm1624 7
- #define tm1626a 8
- #define tm1626b 9
- #define tm1626c 10
- #define tm1626d 11
- #define tm1628 12
- #define tm1629 13
- #define tm1629a 14
- #define tm1629b 15
- #define tm1629c 16
- #define tm1629d 17
- #define tm1638 18
- #define tm1668 19
- #define tw1628 20
- #define icmodel tm1616 //这里选择的TM1616,更改“tm1616”可以得到其他型号IC的驱动程序
- #if icmodel== tm1616
- #define seg 7
- #define grid 4
- #define dismodel 1
- #elif icmodel== tm1618
- #define seg 5
- #define grid 7
- #define key 3
- #define dismodel 4
- #elif icmodel== tm1618a
- #define seg 7
- #define grid 5
- #define key 4
- #define dismodel 2
- #elif icmodel== tm1620
- #define seg 8
- #define grid 6
- #define dismodel 3
- #elif icmodel== tm1620b
- #define seg6
- #define grid7
- #define key3
- #define dismodel 4
- #elif icmodel== tm1623
- #define seg 11
- #define grid 7
- #define key 4
- #define dismodel 4
- #elif icmodel== tm1624
- #define seg 11
- #define grid 7
- #define dismodel 4
- #elif icmodel== tm1626a
- #define seg 10
- #define grid 7
- #define key 5
- #define sw 2
- #define led 6
- #define dismodel 4
- #elif icmodel== tm1626b
- #define seg 11
- #define grid 7
- #define key 5
- #define sw 4
- #define led 6
- #define dismodel 4
- #elif icmodel== tm1626c
- #define seg 11
- #define grid 7
- #define key 5
- #define led 1
- #define dismodel 4
- #elif icmodel== tm1626d
- #define seg 10
- #define grid 7
- #define key 5
- #define led 1
- #define dismodel 4
- #elif icmodel== tm1628
- #define seg 10
- #define grid 7
- #define key 4
- #define dismodel 4
- #elif icmodel== tm1629
- #define seg 16
- #definegrid 8
- #definekey 4
- #definedismodel 1
- #elif icmodel== tm1629a
- #defineseg 16
- #definegrid 8
- #definedismodel 1
- #elif icmodel== tm1629b
- #defineseg 14
- #definegrid 8
- #definekey 4
- #definedismodel 1
- #elif icmodel== tm1629c
- #defineseg 15
- #definegrid 8
- #definekey 4
- #definedismodel 1
- #elif icmodel== tm1629d
- #defineseg 12
- #definegrid 8
- #definekey 4
- #definedismodel 1
- #elif icmodel== tm1638
- #defineseg 10
- #definegrid 8
- #definekey 4
- #definedismodel 1
- #elif icmodel== tm1668
- #define seg 10
- #definegrid 7
- #definekey 5
- #definedismodel 1
- #elif icmodel== tw1628
- #defineseg 10
- #definegrid 7
- #definekey 5
- #define dismodel 1
- #else
- #error "你必须确认IC的型号是否存在?"
- #endif
- #define dissetmode 0x03 / /显示模式设置
- #define writedatamode_z 0x40 //采用地址自动加一方式写显存
- #define writeledmode_z 0x41 //采用地址自动加一方式写LED显存命令
- #define readkeymode 0x42 //读按键命令
- #define readswmode 0x43 //读SW口命令
- #define writedatamode_g 0x44 //采用固定地址方式写显存
- #define writeledmode_g 0x45 //采用固定地址方式写LED显存命令
- #define startaddress 0xc0 //起始地址
- #define disconmode 0x8c //显示控制
- #define datacount 2*grid //采用地址自动加一方式传输数据的个数
- //定义全局变量
- unsigned char k1, k2, k3, k4, k5; //按键值寄存器
- unsigned da_sw; //SW寄存器
- unsigned int count;
- //端口的定义
- sbit STB= P2^0;
- sbitCLK= P2^1;
- sbitDIO= P2^2; / /串行通讯口
- sbit SPEAK = P2^7; //外接蜂鸣器,可以不必理会
- //*********************************************子程序开始************************************
- //----------------------------------------------延时程序开始---------------------------------
- void delay(int k)
- { unsigned char i,j;
- for(;k>0;k--)
- for(j=255;j>0;j--)
- for(i=255;i>0;i--);
- }
- / /----------------------------------------------延时程序结束---------------------------------- //----------------------------------------------写入输入1个字节(8bit)到LED_IC程序开始---------
- //输入8BIT数据
- //在时钟的上升沿通过MCU向LED驱动IC——TM16xx写数据
- void indate(unsigned char p)
- { unsigned int i;
- STB=0; //保证“STB”为低电平,程序不依赖于之前端口的状态
- //保证程序在实际运行中不会出现“端口迷失”
- for(i=0;i<8;i++)
- { CLK=0; //先将“CLK”清零
- if((p& 0x01)!=0)
- { DIO=1; //需要传送的数据的低位为“1”,则把“DIO”清零
- }else
- {
- DIO=0; //需要传送的数据的低位为“0”,则把“DIO”置高
- }
- CLK=1; //送时钟的上升沿
- p=p>>1; //准备送下一个BIT } //送完一个字节后退出循环
- }
- / /----------------------------------------------写入输入1个字节(8bit)到LED_IC程序结束--------- //----------------------------------------------从LED_IC读入1个字节(8bit)程序开始-------------
- //输出8BIT数据
- //在时钟的上升沿通过MCU从LED驱动IC——TM16xx读数据
- # ifdef key
- unsigned char outdate()
- { unsigned char i,k=0; //i——控制循环次数,k——临时保存读到的数据
- DIO=1; //释放DIO为输入
- STB=0; //保证“STB”为低电平,程序不依赖于之前端口的状态 //保证程序在实际运行中不会出现“端口迷失”
- for(i=0;i<8;i++)
- { CLK=0; //先将“CLK”清零
- k=k>>1;
- if(( P2 & 0x04)==0)
- {
- k=k& 0x7f; //如果“DIO”为低电平,则把k的最高位清“0”,其他各位保持不变
- }
- else
- {
- k=(k| 0x80& 0xff); //如果“DIO”为高电平,则把k的最高位置“1”,其他各位保持不变
- }
- CLK=1; //送时钟的上升沿
- } //送完一个字节后退出循环
- return(k); //返回读到的1字节数据
- }
- #endif
- / /----------------------------------------------从LED_IC读入1个字节(8bit)程序结束----------- //----------------------------------------------采用地址自动加一方式传输地址和数据开始------
- //采用地址自动加1方式
- //上电后LED-DRIVER显存中的数据是随机的,上电后马上传显示控制命令字(打开显示),会出现乱码。
- //为避免上述现象,用户可以先传显示控制命令将显示关掉(见应用手册中详细介绍),然后正常操作
- //也可以先主动刷新LED-DRIVER显存中的数据。然后开显示
- //这里采用是第二种方法
- void display(unsigned char disa)
- {
- unsigned int i; //i——控制本次需要传多少个字节显示数据
- DIO=1;CLK=1;
- STB=1; //通讯开始前通讯端口全部初始化为“1”
- indate( writedatamode_z); //传数据设置命令,设置采用地址自动加1方式写显示数据,
- STB=1; //数据设置命令传完后需要将“STB”置“1”
- indate(startaddress); //传起始地址
- //地址命令传完后,“STB”保持为“0”继续传需要显示的数据
- for(i=0;i<datacount;i++)
- {
- indate(disa); //在连续传显示的数据过程中,“STB”一直保持为”0“
- }
- STB=1; //传完所有的显示数据后(最多14BYTE)后,将“STB置“1”
- indate(disconmode); //传显示控制命令
- STB=1; //显示控制命令传完后将“STB”置“1”
- }
- / /----------------------------------------------采用地址自动加一方式传输地址和数据结束------- //----------------------------------------------采用固定地址方式传输地址和数据开始-----------
- //采用固定地址方式
- void display2(unsigned char adress,disa)
- {
- DIO=1;
- CLK=1;
- STB=1; //通讯开始前通讯端口全部初始化为“1”
- indate( writedatamode_g); //数据设置命令
- STB=1;
- indate(adress); //传显示数据对应的地址
- indate(disa); //保持“STB”=“0”,传1BYTE显示数据
- STB=1; //传完显示数据后将“STB”置“1”
- }
- / /----------------------------------------------采用固定地址方式传输地址和数据结束------------- //----------------------------------------------按键扫描程序开始------------------------------
- //按键扫描 //只要定义了key都将执行按键扫描程序,且必须从低字节开始读
- # ifdef key
- unsigned char keyscan()
- {
- STB=1;
- indate(readkeymode); //传数据设置命令,设置为读按键
- //“STB”保持为“0”,读键值
- //将读到的键值保存在MCU的寄存器中
- //根据IC型号读指定字节,不允许多读,否则会造成读按键不稳定
- if(key >=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
- //----------------------------------------------按键扫描程序结束----------------------------------
- //----------------------------------------------PWM数据传输开始-----------------------------------
- # ifdef led
- unsigned char in_led()
- {
- STB=1;
- indate( writeledmode_z); //数据设置命令,设置为写LED显存
- STB=1;
- indate( 0xc0); //起始地址,这里的地址和
- indate( 0x0f); //LED1宽度设置
- indate( 0x0f); //LED2宽度设置
- indate( 0x0f); //LED3宽度设置
- indate( 0x00); //关闭LED123同步调节
- indate( 0x0f); //LED4宽度设置
- indate( 0x0f); //LED5宽度设置
- indate( 0x0f); //LED6宽度设置
- indate( 0x00); //关闭LED456同步调节
- STB=1;
- return 0;
- }
- #endif //----------------------------------------------PWM数据传输结束-------------------------------------
- # ifdef led
- unsigned 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 sw
- unsigned char out_sw()
- {
- STB=1;
- indate(readswmode); //数据设置命令,设置为读SW输入口
- d a_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); //采用固定地址方式向C0地址单元写00
- delay(10);
- #ifdef key
- keyscan(); //调用按键扫描程序
- #endif //本程序仅仅提供按键扫描,2次按键扫描的时间不得<10MS,在这里不提供按键处理程序
- #ifdef led
- in_led(); //6路PWM输出口输出"1"
- delay(10);
- in_led_g( 0xc0, 0x00); //让LED1输出"0"
- #endif
- #ifdef sw out_sw(); //调用读SW输入口程序
- #endif //这里不提供SW口处理程序
- _nop_();
- }
- //*********************************************主程序结束*******************************************
复制代码
|