- #include <STC15.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
-
- #define TM1640MEDO_ADD 0x44 //地址模式的设置0x40自动加一模式 0x44固定地址模式
- #define TM1640MEDO_DISPLAY 0x88 //设置亮度小:0x88 0x89 0x8a 0x8b 0x8c 0x8d 0x8f最大0x80关闭
- #define TM1640MEDO_DISPLAY_OFF 0x80 //宏定义 关亮度设置
- #define Delay(us){_nop_();_nop_();_nop_();_nop_();}
- sbit DIN = P3^7; //TM1640数据线
- sbit SCLK = P3^6; //TM1640时钟线
- uchar buff[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //数字0~F
- // 0 1 2 3 4 5 6 7 8 9 A b C d E F -
- //**************************************************************************************************
- //功能:延时1毫秒
- //***************************************************************************************************
- void Delay_xms(uint x)
- {
- uint i,j;
- for(i=0;i<x;i++)
- for(j=0;j<112;j++);
- }
- //功能:12us延时
- void Delay_us(uint t)
- {
- for(;t>0;t--)
- {
- _nop_();
- }
- }
- //启始
- void TM1640_start()
- {
- DIN=1;
- SCLK=1;
- Delay_us(1);
- DIN=0;
- Delay_us(1);
- SCLK=0;
- Delay_us(1);
- }
- //结束
- void TM1640_stop()
- {
- DIN=0;
- SCLK=1;
- Delay_us(1);
- DIN=1;
- Delay_us(1);
- }
- //写数据
- void TM1640_write(uchar date)
- {
- uchar i;
- uchar aa;
- aa=date;
- DIN=0;
- SCLK=0;
- for(i=0;i<8;i++)
- {
- SCLK=0;
- Delay_us(1);
- if(aa&0x01)
- {
- DIN=1;
- Delay_us(1);
- }
- else
- {
- DIN=0;
- Delay_us(1);
- }
- SCLK=1;
- Delay_us(1);
- aa=aa>>1;
- }
- DIN=0;
- SCLK=0;
- }
- //TM1640初始化
- void TM1640_Init(void)
- {
- TM1640_start();
- TM1640_write( TM1640MEDO_ADD ); //设置工作模式
- TM1640_stop();
- TM1640_start();
- TM1640_write( TM1640MEDO_DISPLAY );//设置显示亮度
- TM1640_stop();
- }
- //固定地址模式的显示输出函数
- void TM1640_display(uchar address,uchar date)
- {
- TM1640_start();
- TM1640_write( 0xc0 + address ); //传显示数据对应的地址,0-15位数码管
- // TM1640_write( buff[date] + 0x80 ); //传1BYTE显示数据,对应显示buff[]数组内容,显示小数点
- TM1640_write( buff[date] ); //传1BYTE显示数据,对应显示buff[]数组内容,不显示小数点
- TM1640_stop();
- }
- void main()
- {
- uchar i,j,k;
- TM1640_Init();
-
- while(1)
- {
- //16位同时依次显示各段
- j=1;
- for(i=0; i<8; i++)
- {
- for(k=0; k<16; k++)
- {
- TM1640_start();
- TM1640_write( 0xc0 + k );
- TM1640_write(j);
- TM1640_stop();
- }
- Delay_xms(3000);
- j = j<<1;
- }
-
- //16位同时依次显示:0~F
- for(i=0; i<16; i++)
- {
- for(j=0; j<16; j++)
- {
- TM1640_display( j, i );
- }
- Delay_xms(5000);
- }
-
- //从0~F,各位同时显示数字
- for(i=0; i<16; i++)
- {
- TM1640_display(i,i);
- }
- Delay_xms(50000);
- }
- }
复制代码
|