欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
51單片機(jī)+TM1680驅(qū)動(dòng)數(shù)碼顯示屏源程序
[打印本頁(yè)]
作者:
zhengqiusheng
時(shí)間:
2023-12-9 11:08
標(biāo)題:
51單片機(jī)+TM1680驅(qū)動(dòng)數(shù)碼顯示屏源程序
單片機(jī)源程序如下:
/***************************************************************************
深圳天微電子
*文 件 名:TM1680-V1.0
*當(dāng)前版本:V1.0
*注意事項(xiàng):1、A1\A0 采用MCU進(jìn)行控制,實(shí)際使用時(shí),可以將A1\A0任意接高低電平,TM1680 ID改為相應(yīng)指令即可;
2、該程序采用STC15W芯片模擬IIC協(xié)議,IO口為雙向IO口(無(wú)需設(shè)置輸入與輸出),如果MCU的IO口需要設(shè)置輸入和輸出,則在ACK時(shí)需要設(shè)置為輸入
3、該芯片支持標(biāo)準(zhǔn)IIC協(xié)議
4、SDA、SCL需要外接上拉電阻;
5、不同的MCU需要根據(jù)芯片時(shí)鐘頻率調(diào)整延時(shí)時(shí)間;
*免責(zé)聲明:1.此程序?yàn)門M1680驅(qū)動(dòng)LED演示程序,僅作參考之用。
********************************************************************************/
#include <reg52.h>
#include <intrins.h>
#include <tm1680.h>
/***端口定義***/
//sbit SDA=P3^0; //TM1680通訊端口設(shè)置
//sbit SCL=P3^1;
sbit SDA=P1^0; //TM1680通訊端口設(shè)置
sbit SCL=P1^1;
sbit KEY=P3^2;
//sbit MA1=P1^6;
//sbit MA0=P1^7;
///***按鍵功能設(shè)置***/
//sbit KEY0=P3^2;
//sbit KEY1=P3^3;
//sbit KEY2=P3^6;
/***顯示數(shù)據(jù)***/
unsigned char TM1680perseg[8]={0x10,0x20,0x40,0x80,0x01,0x02,0x04,0x8};
//unsigned char DispA[8]={0x10,0xFE,0x92,0x92,0xFE,0x92,0x10,0x10};
//地址 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23
unsigned char code table0[24]={0xff,0xff,0xff,0xff,0xF0,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; //0 ok
//地址 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23
unsigned char code table1[24]={0x00,0x00,0x00,0xFF,0xF0,0x00,0x00,0xFF,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0x00,0x0C,0xff,0xff,0xff,0x00,0x00,0x00,0xff}; //1 ok
//地址 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23
unsigned char code table2[24]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x0c,0xff,0xff,0xff,0xff}; //2 ok
//地址 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23
unsigned char code table3[24]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0x00,0x0C,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; //3 ok
//地址 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23
unsigned char code table4[24]={0xff,0xf0,0x00,0xff,0xf0,0xff,0xff,0xFF,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x0C,0xff,0xff,0xff,0x00,0x00,0x00,0xff}; //4 ok
//地址 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23
unsigned char code table5[24]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xFF,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x0C,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; //5 ok
//地址 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23
unsigned char code table6[24]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xFF,0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; //6 ok
//地址 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23
unsigned char code table7[24]={0xff,0xff,0xff,0xFF,0xF0,0x00,0x00,0xFF,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0x00,0x0C,0xff,0xff,0xff,0x00,0x00,0x00,0xff}; //7 ok
//地址 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23
unsigned char code table8[24]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xFF,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; //8 ok
//地址 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23
unsigned char code table9[24]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xFF,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x0C,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; //9 ok
unsigned char KEY_TEMP;
/*******************************/
/****** 函數(shù)功能:延時(shí)函數(shù) *****/
/*******************************/
void delayms(unsigned int n)
{
unsigned int i;
while(n--)
{
for(i=0;i<300;i++);
}
}
/*******************************/
/****** 函數(shù)功能:延時(shí)函數(shù) *****/
/*******************************/
void delayus(unsigned char n) //256
{
while (--n)
{
_nop_();
}
}
/*******************************/
/****** 函數(shù)功能:起始操作 *****/
/*******************************/
void TM1680start(void)
{
SDA=1;
SCL=1;
SDA=1;
delayus(4);
delayus(10);
SDA=0;
delayus(14); //起始信號(hào),必須大于4.7us
SCL=0;
}
/*******************************/
/****** 函數(shù)功能:反饋操作 *****/
/*******************************/
void Ack(void)
{
SCL = 0;
delayus(8);
SCL = 1;
delayus(8);
while(SDA);
SCL=0;
delayus(15);
}
/*******************************/
/****** 函數(shù)功能:反饋操作 *****/
/*******************************/
/*void TM1680SetAck(bit ack)
{
SCL=0; delayus(5);
SDA = ack; //寫應(yīng)答信號(hào)
SCL = 1; //拉高時(shí)鐘線
delayus(5); //延時(shí)
SCL = 0; //拉低時(shí)鐘線
delayus(5); //延時(shí)
}*/
/*******************************/
/****** 函數(shù)功能:停止操作 *****/
/*******************************/
void TM1680stop(void)
{
SDA=0;
SCL=1;
delayus(10);
SDA=1; //停止信號(hào),大于5us
delayus(10);
SCL=1;
SDA=1;
}
/*******************************/
/****** 函數(shù)功能:送數(shù)據(jù) *****/
/*******************************/
void TM1680SendByte(unsigned char sbyte)
{
unsigned char i=0;
for(i=0; i<8; i++)
{
SCL=0;delayus(2);
if(sbyte&0x80)
{
SDA=1; //高位先發(fā)
}else{
SDA=0;
}
delayus(5);
SCL=1;
delayus(5); //高電平的時(shí)間大于4us
sbyte<<=1;
delayus(3);
}
SCL=0; delayus(5);
SDA=0; delayus(5);
}
/*******************************/
/****** 函數(shù)功能: 讀操作 *****/
/*******************************/
/*unsigned char TM1680RecvByte(void)
{
unsigned char i=0, sbyte;
SDA=1;delayus(6);
for(i=0; i<8; i++)
{
SCL=0;delayus(6);
if(SDA)
{
sbyte |= 0x01 ; //置1
}else{
sbyte &= 0xfe; //置0
}
delayus(3);
SCL=1;
delayus(5); //高電平的時(shí)間大于4us
sbyte<<=1;
}
SCL=0;
return sbyte;
}*/
/******************************底層函數(shù)結(jié)束**************************/
/******************************功能函數(shù)**************************/
/***單字節(jié)寫操作函數(shù)***/
/***寫命令函數(shù):開始--ID-ACK--命令-ACK--結(jié)束***/
/****************************************************************/
/*
void TM1680WriteCmd(unsigned char scmd)
{
TM1680start();
TM1680SendByte(TM1680ID);
Ack();
TM1680SendByte(scmd);
Ack();
TM1680stop();
}*/
/************* 寫一個(gè)字節(jié)數(shù)據(jù):***********************/
/********** 開始--ID-ACK-內(nèi)部地址-ACK--數(shù)據(jù)-ACK-結(jié)束**/
/***************************************************/
void TM1680WriteOneByte(unsigned char faddr, unsigned char sdate)
{
TM1680start();
TM1680SendByte(TM1680ID); //寫TM1680器件地址
Ack();
TM1680SendByte(faddr); //eeprom 地址
Ack();
TM1680SendByte(sdate); //寫數(shù)據(jù)
Ack();
TM1680stop();
}
/******************************************/
/**** 函數(shù)功能:函數(shù)功能:頁(yè)操作 *******/
/*****************************************/
void TM1680PageAllWrite(unsigned char faddr, unsigned char sdat1,unsigned char sdat2,unsigned char cnt)
{
unsigned char i=0;
TM1680start();
TM1680SendByte(TM1680ID);
Ack();
TM1680SendByte(faddr); //eeprom 地址
Ack();
for(i=0; i<cnt;i++)
{
TM1680SendByte(sdat1); //寫數(shù)據(jù)
Ack();
TM1680SendByte(sdat2); //寫數(shù)據(jù)
Ack();
}
TM1680stop();
}
void TM1680PageAll_GD_Write(unsigned char faddr, unsigned char sdat1, unsigned char sdat2,unsigned char cnt)
{
unsigned char i=0;
for(i=0; i<cnt; i=i+2)
{
TM1680WriteOneByte( faddr+i, sdat1);
TM1680WriteOneByte( faddr+2, sdat2);
}
TM1680stop();
}
/******************************************/
/**** 按鍵函數(shù)功能:函數(shù)功能: 按鍵 *******/
/*****************************************/
void KEY_DEL()
{
if(KEY==0)
{
delayus(30);
if(KEY==0);
{
delayus(10);
while(KEY==0);
KEY_TEMP++;
}
}
if( KEY_TEMP==20)
KEY_TEMP=0;
}
/********************************************************/
/**** 函數(shù)功能: 先初始化后 再寫命令+寫數(shù)據(jù) *******/
/******************************************************/
/*void TM1680WriteCmdDate(unsigned char faddr, unsigned char sdate, unsigned char cnt)
{
unsigned char i=0;
TM1680start();
TM1680SendByte(TM1680ID);
Ack();
TM1680SendByte(SYSDIS);
Ack();
TM1680SendByte(COM8NMOS);
Ack();
TM1680SendByte(RCMODE1);
Ack();
TM1680SendByte(SYSEN);
Ack();
TM1680SendByte(LEDON);
Ack();
TM1680SendByte(PWM16);
Ack();
TM1680SendByte(BLINKOFF);
Ack();
TM1680SendByte(faddr);
Ack();
for(i=0; i<cnt; i++)
{
TM1680SendByte(sdate);
Ack();
}
TM1680stop();
}
*/
/******************************************/
/**** 函數(shù)功能: TM1680 初始化 *******/
/*****************************************/
void TM1680Init(void)
{
TM1680start();
TM1680SendByte(TM1680ID);
Ack();
TM1680SendByte(SYSDIS);
Ack();
TM1680SendByte(COM16NMOS); //根據(jù)需求進(jìn)行選擇
Ack();
TM1680SendByte(RCMODE1);
Ack();
TM1680SendByte(SYSEN);
Ack();
TM1680SendByte(LEDON);
Ack();
// TM1680SendByte(LEDOFF);
// Ack();
TM1680SendByte(PWM12);
Ack();
TM1680SendByte(BLINKOFF);
Ack();
TM1680stop();
delayms(50);
}
/******************************************/
/************* PWM調(diào)節(jié)測(cè)試 ***********/
/*****************************************/
//void PWMTest(unsigned char sTime)
//{
// unsigned char i=0;
//
// for(i=0;i<16;i++)
// {
// TM1680WriteCmd(PWM01 | i);
// delayms(sTime);
// delayms(sTime);
// }
//}
/******************************************/
/************* TM1680ID判斷 *********/
/*****************************************/
//void TM1680IDChange(void)
//{
// switch(TM1680ID)
// {
// case 0xe4: MA1=0; MA0=0; break;
// case 0xe5: MA1=0; MA0=1; break;
// case 0xe6: MA1=1; MA0=0; break;
// case 0xe7: MA1=1; MA0=1; break;
// default:break;
// }
//}
/******************************************/
/******** 函數(shù)功能:逐漸點(diǎn)亮每一段 *********/
/*****************************************/
void TM1680PerDisp(void)
{
unsigned char i=0,j=0;
unsigned char faddr=0x00, fdate=TM1680perseg[0];
for(i=0;i<24; i++)
{
for(j=0;j<8;j++)
{
fdate=fdate|TM1680perseg[j];
TM1680WriteOneByte(faddr,fdate);
delayms(20);
}
faddr+=2;
fdate=TM1680perseg[0];
}
}
void TM1680_SZR(unsigned char *ss) small
{
unsigned char dd;
unsigned char *tab;
tab=ss;
for(dd=0;dd<24;dd++)
{
TM1680WriteOneByte(4*dd,*tab) ;
tab = tab+1;
}
}
///////////////////////////////////////////////
void TM1680_SZG(unsigned char *ss) small
{
unsigned char dd;
unsigned char *tab;
tab=ss;
for(dd=0;dd<24;dd++)
{
TM1680WriteOneByte((4*dd+2),*tab) ;
tab = tab+1;
}
}
//void TM1680_SZ0(void)
//{
// TM1680WriteOneByte(0,table0[0]);
// TM1680WriteOneByte(4,table0[1]);
// TM1680WriteOneByte(8,table0[2]);
// TM1680WriteOneByte(12,table0[3]);
// TM1680WriteOneByte(16,table0[4]);
// TM1680WriteOneByte(20,table0[5]);
// TM1680WriteOneByte(24,table0[6]);
// TM1680WriteOneByte(28,table0[7]);
// TM1680WriteOneByte(32,table0[8]);
// TM1680WriteOneByte(36,table0[9]);
// TM1680WriteOneByte(40,table0[10]);
// TM1680WriteOneByte(44,table0[11]);
// TM1680WriteOneByte(48,table0[12]);
// TM1680WriteOneByte(52,table0[13]);
// TM1680WriteOneByte(56,table0[14]);
// TM1680WriteOneByte(60,table0[15]);
// TM1680WriteOneByte(64,table0[16]);
// TM1680WriteOneByte(68,table0[17]);
// TM1680WriteOneByte(72,table0[18]);
// TM1680WriteOneByte(76,table0[19]);
// TM1680WriteOneByte(80,table0[20]);
// TM1680WriteOneByte(84,table0[21]);
// TM1680WriteOneByte(88,table0[22]);
// TM1680WriteOneByte(92,table0[23]);
//
//}
//
//
//
////////////////////////////////////////////
////////////// 主函數(shù) ///////////////
///////////////////////////////////////////
void main(void)
{
//unsigned char i=0,j=0,//fdate=0x10;
//TM1680IDChange();
delayms(200);
TM1680Init();
TM1680PageAllWrite(0x00, 0x00, 0x00,48); //上電清零
//TM1680PageAll_GD_Write(0x00, 0x00, 0x00,96);
delayms(20);
TM1680PageAllWrite(0x00, 0xff,0xff, 48); //上電全部顯示
//TM1680PageAll_GD_Write(0x00, 0xFF, 0xff,96);
delayms(800);
TM1680Init();
TM1680PageAllWrite(0x00, 0x00, 0x00,48); //上電清零
delayms(20);
TM1680PageAllWrite(0x00, 0xff,0x00, 48);
//TM1680PageAll_GD_Write(0x00, 0x00, 0x00,96);
///delayms(20);
///TM1680PageAll_GD_Write(0x00, 0xFF,0x00,96);
delayms(800);
TM1680Init();
TM1680PageAllWrite(0x00, 0x00, 0x00,48); //上電清零
delayms(20);
TM1680PageAllWrite(0x00, 0x00,0xff, 48); //清零
//TM1680PageAll_GD_Write(0x00, 0x00, 0xFF,96);
delayms(800);
//TM1680PerDisp(); //每一段顯示
//TM1680Init();
TM1680Init();
TM1680PageAllWrite(0x00, 0x00, 0x00,48); //上電清零
delayms(20);
// TM1680WriteOneByte(0,0xff);
// TM1680WriteOneByte(4,0xff);
// TM1680WriteOneByte(8,0xff);
//
//
//
//TM1680WriteOneByte(4,0xff);
// delayms(20);
//TM1680_SZ0( );
while(1)
{
KEY_DEL() ;
switch(KEY_TEMP)
{
case 0:
{
TM1680_SZR(table0);
}
break;
case 1:
{
TM1680_SZR(table1);
}
break;
case 2:
{
TM1680_SZR(table2);
}
break;
case 3:
{
TM1680_SZR(table3);
}
break;
case 4:
{
TM1680_SZR(table4);
}
break;
case 5:
{
TM1680_SZR(table5);
}
break;
case 6:
{
TM1680_SZR(table6);
}
break;
case 7:
{
TM1680_SZR(table7);
}
break;
case 8:
{
TM1680_SZR(table8);
}
break;
case 9:
{
TM1680_SZR(table9);
}
break;
case 10:
{
TM1680PageAllWrite(0x00, 0x00, 0x00,48); //上電清零
delayms(20);
TM1680_SZG(table0);
}
break;
……………………
…………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
原理圖: 無(wú)
仿真: 無(wú)
代碼:
TM1680CX-16X24.zip
(44.66 KB, 下載次數(shù): 58)
2023-12-9 11:08 上傳
點(diǎn)擊文件名下載附件
完整程序
下載積分: 黑幣 -5
作者:
gqth6020
時(shí)間:
2024-2-29 11:23
下載學(xué)習(xí)一下!
作者:
joyb
時(shí)間:
2024-2-29 16:11
1680多重的ROW/COM模式(32ROW/8COM和24ROW/16COM),可以給個(gè)原理圖
作者:
wkman
時(shí)間:
2024-3-1 15:07
多重的ROW/COM模式 什么意思?初次沒看懂
作者:
digger63
時(shí)間:
2024-6-21 10:13
應(yīng)該可以和其它I2C設(shè)備共用I2C端口吧?
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1