|
以前研究过tm1640,,虽然和1639不同,但可以参考一下改一下的
#include<reg51.h>
#define nop _nop_();
#define uchar unsigned char //方便书写
#define uint unsigned int
sbit sda=P2^7; //TM1640时钟线
sbit scl=P2^6; //TM1640数据线
uchar data1[16]={1,2,3,4}; //用户控制单元 往这个16个单元存 1 显示1 存2显示2
uchar xsld[8]={0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f};//控制显示的亮度 88最暗 8f最亮
uchar code tm1640dis[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00,0xff};//共阴极
// //0 1 2 3 4 5 6 7 8 9 a b c d e f 全灭 全开
//************共阴数码管显示0-F************************
//*********START***********************************************
void tm1640start() //1640开始
{
sda=1;
scl=1;
sda=0;//下降沿
scl=0;
}
//**************************************************************
void tm1640stop() //1640结束
{
sda=0;
scl=1;
sda=1; //上升沿
scl=1;
}
//***********************************************************
void tm1640write(uchar date) //1640写字节
{
uchar i;
for(i=0;i<8;i++)
{
scl=0;
if(date&0x01)
{
sda=1;//"1"
}
else
{
sda=0;//"0"
}
scl=1; //上升沿 数据送入
date=date>>1; //数据右移
}
scl=0;
sda=0;
}
//**************向TM1640发送显示数据****方式2循环送入 测试OK*********************
void tm1640send()
{
tm1640start();
tm1640write(0x40); //地址+1模式
tm1640stop();
tm1640start();
tm1640write(0xc0); //送第一个地址,0XCO
tm1640write(tm1640dis[data1[0]]); //第1个数码管 显示的值 显示data1单元的 数字 0-F
tm1640write(tm1640dis[data1[1]]); //第2个数码管 显示的值 显示data1单元的 数字 0-F
tm1640write(tm1640dis[data1[2]]); //第3个数码管 显示的值 显示data1单元的 数字 0-F
tm1640write(tm1640dis[data1[3]]); //第4个数码管 显示的值 显示data1单元的 数字 0-F
tm1640write(tm1640dis[data1[4]]); //第5个数码管 显示的值 显示data1单元的 数字 0-F
tm1640write(tm1640dis[data1[5]]); //第6个数码管 显示的值 显示data1单元的 数字 0-F
tm1640write(tm1640dis[data1[6]]); //第7个数码管 显示的值 显示data1单元的 数字 0-F
tm1640write(tm1640dis[data1[7]]); //第8个数码管 显示的值 显示data1单元的 数字 0-F
tm1640write(tm1640dis[data1[8]]); //第9个数码管 显示的值 显示data1单元的 数字 0-F
tm1640write(tm1640dis[data1[9]]); //第10个数码管 显示的值 显示data1单元的 数字 0-F
tm1640write(tm1640dis[data1[10]]); //第11个数码管 显示的值 显示data1单元的 数字 0-F
tm1640write(tm1640dis[data1[11]]); //第12个数码管 显示的值 显示data1单元的 数字 0-F
tm1640write(tm1640dis[data1[12]]); //第13个数码管 显示的值 显示data1单元的 数字 0-F
tm1640write(tm1640dis[data1[13]]); //第14个数码管 显示的值 显示data1单元的 数字 0-F
tm1640write(tm1640dis[data1[14]]); //第15个数码管 显示的值 显示data1单元的 数字 0-F
tm1640write(tm1640dis[data1[15]]); //第16个数码管 显示的值 显示data1单元的 数字 0-F
tm1640stop();
tm1640start();
tm1640write(xsld[1]); //控制显示,开显示,脉冲宽度为14/16 88-8f
tm1640stop();
}
void tm1640init() //初始化
{
tm1640send(); //刷新该程序,即可刷新显示 显示data1[0]-data[15]的数字
}
|
|