#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 );
}