|
51單片機(jī)驅(qū)動(dòng)TM1640輪流顯示數(shù)字1-8
代碼如下:
#include<reg51.h>
#include<intrins.h>
#define Delay(us) {_nop_();_nop_();_nop_();_nop_();}
#define FOSC 18432000L
//*******1640驅(qū)動(dòng)************
sbit sda=P1^1; //TM1640數(shù)據(jù)線
sbit scl=P3^7; //TM1640時(shí)鐘線
unsigned char date[] = {
0xb7,0x82,0x9d,0x3d,0x2e,0x3b,0xbb,0x25,0xbf,0x3f,0xaf,0x9e,0x9d,0x82,0x3b,0x8b,0xbc,0x6f,0x2f,0x40};
//*****************************
//*********START***************
void start() //1640開(kāi)始
{
//scl=0;
sda=1;
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
sda=0;
_nop_();
_nop_();
scl=0;
_nop_();
_nop_();
}
//**************************************************************
void stop() //1640結(jié)束
{
scl=0;
_nop_();
_nop_();
sda=0;
//scl=1;
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
sda=1;
_nop_();
_nop_();
}
//***********************************************************
void write(unsigned char date) //1640寫(xiě)字節(jié)
{
unsigned char i,aa;
aa=date;
//sda=0;
//scl=0;
for(i=0;i<8;i++)
{
scl=0;
if(aa&0x01)
{
sda=1;
_nop_();
_nop_();
}
else
{
sda=0;
_nop_();
_nop_();
}
scl=1;
_nop_();
aa=aa>>1;
}
//scl=0;
//sda=0;
}
//**************向TM1640發(fā)送顯示數(shù)據(jù)***************************
void send(unsigned char date1)
//void send()
{
unsigned char ii;
// unsigned char mask;
start();
write(0x40); //設(shè)置數(shù)據(jù),地址加1模式
stop();
start();
write(0xC0); //起始地址
for(ii=0;ii<16;ii++) //16個(gè)地址
{
write(date1);
}
/* for(mask=0x80;mask!=0;mask>>=1)
{
if((mask&date1) == 0)
I2C_SDA = 0;
else
I2C_SDA = 1;
I2CDelay();
I2C_SCL = 1;
I2CDelay();
I2C_SCL = 0;
}*/
stop();
start();
write(0x8f); //控制顯示,開(kāi)顯示,脈沖寬度為14/16
stop();
}
/*
void send1()
{
unsigned char i;
start();
//write(0x40); //設(shè)置數(shù)據(jù),地址加1模式
write(0x44); //固定地址模式
stop();
start();
write(0x00);
write(0xff);
stop();
start();
write(0x01);
write(0x01);
stop();
start();
write(0x02);
write(0x01);
stop();
start();
write(0x03);
write(0x01);
stop();
start();
write(0x04);
write(0x01);
stop();
start();
write(0x05);
write(0x01);
stop();
start();
write(0x06);
write(0x01);
stop();
start();
write(0x8f); //控制顯示,開(kāi)顯示,脈沖寬度為14/16
stop();
}
*/
//**********************************************************
void delay(unsigned int z) //延時(shí)子程序
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=487;y>0;y--);
}
void main()
{ /* unsigned char h;
while(1)
{
for(h=0;h>20;h++)
{
send(date[h]);
delay(200);
delay(200);
delay(200);
delay(200);
delay(200);
//send(date[20]);
}
}*/
while(1)
{
send(date[1]);
delay(200);
send(date[2]);
delay(200);
send(date[3]);
delay(200);
send(date[4]);
delay(200);
send(date[5]);
delay(200);
send(date[6]);
delay(200);
send(date[7]);
delay(200);
send(date[8]);
delay(200);
}
}
|
|