文档库 最新最全的文档下载
当前位置:文档库 › tm1638

tm1638

tm1638
tm1638

#include

#include"tm1628_1.h"

uchar code tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00 //引脚定义

sbit DIO=P0^4;

sbit CLK=P0^5;

sbit STB_1=P0^6;

sbit STB=P0^7;

void TM1638_Write(unsigned char DATA) //写数据函数

{

unsigned char i;

for(i=0;i<8;i++)

{

CLK=0;

if(DATA&0X01)

DIO=1;

else

DIO=0;

DATA>>=1;

CLK=1;

}

}

void Write_COM(bit mode,unsigned char cmd) //发送命令字

{

if(mode==1)

STB_1=0;

else

STB=0;

TM1638_Write(cmd);

if(mode==1)

STB_1=1;

else

STB=1;

}

unsigned char TM1638_Read(void) //读数据函数

{

unsigned char i;

unsigned char temp=0;

DIO=1; //设置为输入

for(i=0;i<8;i++)

{

temp>>=1;

CLK=0;

if(DIO)

temp|=0x80;

CLK=1;

}

return temp;

}

void Write_1_DATA(unsigned char add,unsigned char DATA) //指定地址写入数据

{

Write_COM(1,0x44);

STB_1=0;

TM1638_Write(0xc0|add);

TM1638_Write(DATA);

STB_1=1;

}

unsigned int Read_key(void)

{

unsigned int c[4],c1[4],date[16],i,key_value=0,key_value1=0;

STB=0;

TM1638_Write(0x42);

for(i=0;i<4;i++)

c[i]=TM1638_Read();

STB=1; //4个字节数据合成一个字节

for(i=0;i<4;i++)

key_value|=c[i]<

for(i=0;i<8;i++)

{

if(key_value&(1<

date[i]=1;

else

date[i]=0;

}

key_value=date[0]+(date[2]<<4)+(date[4]<<1)+(date[6]<<5)+(date[1]<<2)+(date[3]<<6)+(date[5]<<3) STB_1=0;

TM1638_Write(0x42);

for(i=0;i<4;i++)

c1[i]=TM1638_Read();

STB_1=1; //4个字节数据合成一个字节

for(i=0;i<4;i++)

key_value1|=c1[i]<

for(i=0;i<8;i++)

{

if(key_value1&(1<

date[i]=1;

else

date[i]=0;

}

key_value1=date[0]+(date[2]<<4)+(date[4]<<1)+(date[6]<<5)+(date[1]<<2)+(date[3]<<6)+(date[5]<<3 key_value=(key_value1<<8)+key_value;

return key_value;

}

void Write_DATA(unsigned char add,unsigned char DATA) //指定地址写入数据

{

Write_COM(0,0x44);

STB=0;

TM1638_Write(0xc0|add);

TM1638_Write(DATA);

STB=1;

}

void init_TM1638(void)

{

unsigned char i;

Write_COM(0,0x8f);//亮度

Write_COM(0,0x40); //写数据命令

STB=0;

TM1638_Write(0xc0); //写地址命令

for(i=0;i<16;i++)

TM1638_Write(0x00);

STB=1;

Write_COM(1,0x8f);//亮度

Write_COM(1,0x40); //写数据命令

STB_1=0;

TM1638_Write(0xc0); //写地址命令

for(i=0;i<16;i++)

TM1638_Write(0x00);

STB_1=1;

}

#include

#include

#include

typedef unsigned char uchar;

typedef unsigned int uint;

uchar aa,ge,shi,bai,num;

void init();

#define ADDRESS_FIX_MODE 0X40

#define READ_KEY 0X42

#define ADDRESS_INCREASE_MODE 0X44

#define TM1638_DIG0 0XC0

#define TM1638_DIG1 0XC2

#define TM1638_DIG2 0XC4

#define TM1638_DIG3 0XC6

#define TM1638_DIG4 0XC8

#define TM1638_DIG5 0XCA

#define TM1638_DIG6 0XCC

#define TM1638_DIG7 0XCE

#define DISPLAY_OFF 0X80

#define DISPLAY_ON 0X88

#define SET_PLUS_WIDTH1 0X88

#define SET_PLUS_WIDTH2 0X89

#define SET_PLUS_WIDTH4 0X8A

#define SET_PLUS_WIDTH10 0X8B

#define SET_PLUS_WIDTH11 0X8C

#define SET_PLUS_WIDTH12 0X8D

#define SET_PLUS_WIDTH13 0X8E

#define SET_PLUS_WIDTH14 0X8F

sbit STB = P2^2;

sbit CLK = P2^1;

sbit DIO = P2^0;

const uchar CathodeCode[ 0x10 ] = { 0X3F, 0X06, 0X5B, 0X4F, 0X66, 0X6D, 0X7D,

0X07, 0X7F, 0X6F, 0X77, 0X7C, 0X58, 0X5E,

0X79, 0X71 };

void DelayUs(uint Us)

{

while(--Us);

}

void DelayMs(uint Ms)

{

while(Ms--)

{

DelayUs(200);

DelayUs(200);

DelayUs(200);

DelayUs(200);

DelayUs(200);

}

}

void TM1638_WriteCmd(uchar Cmd)

{

uchar i;

STB=0;

for(i=0;i<8;i++)

{

CLK=0;

DelayUs(1);

Cmd >>=1;

DIO=CY;

CLK=1;

DelayUs(1);

}

STB=1;

DelayUs(2);

}

void TM1638_WriteData(uchar Dig,uchar Data) {

uchar i;

STB=0;

for(i=0;i<8;i++)

{

CLK=0;

DelayUs(1);

Dig >>=1;

DIO=CY;

CLK=1;

DelayUs(2);

}

for(i=0;i<8;i++)

{

CLK=0;

DelayUs(1);

Data >>=1;

DIO=CY;

CLK=1;

DelayUs(2);

}

STB=1;

DelayUs(2);

}

void init()

{

num=0;

TMOD=0X01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;

ET0=1;

TR0=1;

}

void main()

{

init();

while(1)

{

if(aa==20)

{

aa=0;

num++;

}

if(num==240)

num=0;

bai=num/100;

shi=num%100/10;

ge=num%10;

DelayUs(200);

TM1638_WriteCmd(DISPLAY_ON );

TM1638_WriteCmd( ADDRESS_FIX_MODE );

TM1638_WriteData(TM1638_DIG5, CathodeCode[bai]);

TM1638_WriteData(TM1638_DIG6, CathodeCode[shi]);

TM1638_WriteData(TM1638_DIG7, CathodeCode[ge]);

}

}

void timer()interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

aa++;

}

#include"REG52.H"

#include"stdio.h"

#include"TM1638CMD.H"

typedef unsigned char UINT8; /* 类型定义*/

typedef unsigned int UINT16;

/******************************** 引脚定义**************************************

单片机TM1638

P20 STB

P21 CLK

P22 DIO

************************************************************************ ********/

sbit STB = P2^2; /* 定义TM1638片选线*/

sbit CLK = P2^1; /* 定义TM1638时钟线*/

sbit DIO = P2^0; /* 定义TM1638数据输入,输出线*/

/****************************** 共阴数码管码表********************************/

const UINT8 CathodeCode[ 0x10 ] = { 0X3F, 0X06, 0X5B, 0X4F, 0X66, 0X6D, 0X7D,

0X07, 0X7F, 0X6F, 0X77, 0X7C, 0X58, 0X5E,

0X79, 0X71 };

UINT8 KeyCode[4]; /* 保存键值*/

/*********************************************************************** ********

* 函数名: DelayUs

* 描述: 微秒级延时.

* 输入: UINT8 Us:

* 要延时Us的时间.

* 返回: 无.

************************************************************************ *******/

void DelayUs( UINT16 Us )

{

while(--Us);

}

/*********************************************************************** ********

* 函数名: DelayMs

* 描述: 微秒级延时.

* 输入: UINT8 Us:

* 要延时的Ms时间.

* 返回: 无.

************************************************************************ *******/

void DelayMs( UINT16 Ms )

{

while( Ms-- )

{

DelayUs(200); /* 5次1ms */

DelayUs(200);

DelayUs(200);

DelayUs(200);

DelayUs(200);

}

}

/*********************************************************************** ********

* 函数名: TM1638_WriteCmd

* 描述: 向TM1638写入命令.

* 输入: UINT8 mCmd:

* 要发送的命令.

* 返回: 无.

************************************************************************ *******/

void TM1638_WriteCmd( UINT8 mCmd )

{

UINT8 i;

STB = 0; /* 使能片选*/

for( i = 0; i < 8 ; i++ )

{

CLK = 0; /* 拉低CLK */

DelayUs(1);

mCmd >>= 1; /* 数据右移一位,最低位存入CY */

DIO = CY; /* 发送数据到信号线上*/

CLK = 1; /* 拉高CLK */

DelayUs(1);

}

STB = 1; /* 禁止片选*/

DelayUs(2);

}

/*********************************************************************** ********

* 函数名: TM1638_WriteCmd

* 描述: 向TM1638写入命令.

* 输入: UINT8 mDig:

* 对应的位.

UINT8 mData:

对应的数据.

* 返回: 无.

************************************************************************ *******/

void TM1638_WriteData( UINT8 mDig, UINT8 mData )

{

UINT8 i;

STB = 0; /* 使能片选*/

for( i = 0; i < 8 ; i++ )

{

CLK = 0; /* 拉低CLK */

DelayUs(1);

mDig >>= 1; /* 数据右移一位,最低位存入CY */

DIO = CY; /* 发送数据到信号线上*/

CLK = 1; /* 拉高CLK */

DelayUs(1);

}

for( i = 0; i < 8 ; i++ )

{

CLK = 0; /* 拉低CLK */

DelayUs(1);

mData >>= 1; /* 数据右移一位,最低位存入CY */

DIO = CY; /* 发送数据到信号线上*/

CLK = 1; /* 拉高CLK */

DelayUs(1);

}

STB = 1; /* 禁止片选*/

DelayUs(2);

}

/*********************************************************************** ********

* 函数名: TM1638_ReadData

* 描述: 从TM1638读数据.

* 输入: UINT8 mCmd:

* 要发送的命令.

* 返回: 无.

************************************************************************

void TM1638_ReadData( UINT8 mCmd )

{

UINT8 i,j;

UINT8 ByteCnt = 0;

UINT8 RecData = 0;

STB = 0; /* 使能片选*/

for( i = 0; i < 8 ; i++ )

{

CLK = 0; /* 拉低CLK */

DelayUs(1);

mCmd >>= 1; /* 数据右移一位,最低位存入CY */

DIO = CY; /* 发送数据到信号线上*/

CLK = 1; /* 拉高CLK */

DelayUs(1);

}

DIO = 1; /* 拉高数据线*/

DelayUs(3);

/* 等待3 Us */

for( i = 0; i < 4; i++ )

{

for( j = 0; j < 8 ; j++ )

{

CLK = 0; /* 拉低CLK */

DelayUs(1);

RecData >>= 1; /* 右移一位*/

if( DIO == 1 )

{

RecData |= 0x80;

}

CLK = 1; /* 拉高CLK */

DelayUs(1);

}

KeyCode[ ByteCnt++ ] = RecData;

RecData = 0;

}

STB = 1; /* 禁止片选*/

}

/*********************************************************************** ********

* 函数名: main

* 描述: 主程序.

* 输入: 无.

* 返回: 无.

************************************************************************ *******/

void main( void )

{

UINT8 i;

DelayUs(200); /* 上电延时,等待系统其它元件正常工作*/

TM1638_WriteCmd( DISPLAY_ON ); /* 开显示*/

TM1638_WriteCmd( ADDRESS_FIX_MODE ); /* 地址固定模式*/

for( i = 0; i < 16; i++ ) /* 带小数点从0显示到F */

{

TM1638_WriteData( TM1638_DIG0, CathodeCode[ i ] | 0x80 );

TM1638_WriteData( TM1638_DIG1, CathodeCode[ i ] | 0x80 );

TM1638_WriteData( TM1638_DIG2, CathodeCode[ i ] | 0x80 );

TM1638_WriteData( TM1638_DIG3, CathodeCode[ i ] | 0x80 );

TM1638_WriteData( TM1638_DIG4, CathodeCode[ i ] | 0x80 );

TM1638_WriteData( TM1638_DIG5, CathodeCode[ i ] | 0x80 );

TM1638_WriteData( TM1638_DIG6, CathodeCode[ i ] | 0x80 );

TM1638_WriteData( TM1638_DIG7, CathodeCode[ i ] | 0x80 );

DelayMs( 20 ); /* 延时20 Ms */

}

TM1638_WriteData( TM1638_DIG0, 0xFF ); /* 全亮*/

TM1638_WriteData( TM1638_DIG1, 0xFF );

TM1638_WriteData( TM1638_DIG2, 0xFF );

TM1638_WriteData( TM1638_DIG3, 0xFF );

TM1638_WriteData( TM1638_DIG4, 0xFF );

TM1638_WriteData( TM1638_DIG5, 0xFF );

TM1638_WriteData( TM1638_DIG6, 0xFF );

TM1638_WriteData( TM1638_DIG7, 0xFF );

for( i = 0; i < 8 ;i++ ) /* 亮度调整*/

{

TM1638_WriteCmd( SET_PLUS_WIDTH1 | i );

DelayMs( 20 ); /* 延时20 Ms */

}

TM1638_WriteCmd( SET_PLUS_WIDTH4 ); /* 设置亮度为4/16,防止电流过大影响数码管寿命*/

while(1)

{

TM1638_ReadData( READ_KEY ); /* 读键值*/

TM1638_WriteData( TM1638_DIG0, CathodeCode[ KeyCode[0] / 16 ] ); /* 显示读取到的键值*/

TM1638_WriteData( TM1638_DIG1, CathodeCode[ KeyCode[0] % 16 ] | 0X80 );

TM1638_WriteData( TM1638_DIG2, CathodeCode[ KeyCode[1] / 16 ] );

TM1638_WriteData( TM1638_DIG3, CathodeCode[ KeyCode[1] % 16 ] | 0X80 );

TM1638_WriteData( TM1638_DIG4, CathodeCode[ KeyCode[2] / 16 ] );

TM1638_WriteData( TM1638_DIG5, CathodeCode[ KeyCode[2] % 16 ] | 0X80 );

TM1638_WriteData( TM1638_DIG6, CathodeCode[ KeyCode[3] / 16 ] );

TM1638_WriteData( TM1638_DIG7, CathodeCode[ KeyCode[3] % 16 ] );

DelayMs( 5 );

}

相关文档