TM1620B主要资料网上查到的,使用中好多不明白的,但是最后还是解决了
参考比较多的方法
显示的方法还是有问题,自己要多注意修改,这样子写占内存
用一个&0x0020或许会好一点.
uint code a[] = {0x182f,0x0023,0x083e,0x003f,0x1033,0x103d,0x183d,0x0027,0x183f,0x103f}; //0,1,2,3,4,5,6,7,8,9
uint code b[] = {0x180f,0x0003,0x081e,0x001f,0x1013,0x101d,0x181d,0x0007,0x181f,0x101f}; //0,1,2.3,4,5,6,7,8,9,缺少h端
void Read_Key(void) //按键读取函数
{
uchar i,j;
STB=1;
CLK=1;
Delay_US(100);
STB=0;
command(0x42); //读按键命令
DIO=1; //将DIO置高
CLK=1;
//---------------
//---------------
Delay_US(100);
for(j=0;j<3;j++)//连续读3个字节
for(i=0;i<8;i++)
{
KEY[j]=KEY[j]>>1;
CLK=0;
Delay_US(100);
CLK=1;
Delay_US(100);
if(DIO)
{
KEY[j] = KEY[j]|0X80;
}
else
{
KEY[j] = KEY[j]&0X7f;
}
}
//-------------------------
if((KEY[0] == 0)&&(KEY[1] == 0)&&(KEY[2] == 0))
{
Keysta_Up = 1; //按键抬起
key_down_flag = 0;
}
//-------------------------
Delay_US(100);
STB=1;
//-------------------------
//-------------------------
}
void Send_date(uchar p)
{
uint i;
STB = 0; //保证 STB 为低电平,程序不依赖之前端口的状态
//保证程序在实际运动中不会出现端口迷失
for(i = 0;i < 8; i++)
{
if(p & 0x01)
{
DIO = 1; //需要传送的数据低位为1, 清零
}
else
{
DIO = 0; //需要传送的大数据低位为0, 置高
}
CLK = 0; //先将 CLK 清零
Delay_US(100);
CLK = 1; //送时钟的上升沿
Delay_US(100);
p = p >> 1; //准备送下一个字节
} //送完字节退出程序
}
void command(uchar com)
{
STB = 1;
CLK = 1;
Delay_US(100);
STB = 0;
Delay_US(100);
Send_date(com);
}
//输入16位字节
//在时钟的上升沿通过mcu向TM1620B 写数据
void Send_date16(unsigned int p)
{
uchar i;
STB = 0;//保证 STB 为低电平,程序不依赖之前端口的状态
//保证程序在实际运动中不会出现端口迷失
for(i = 0;i <16; i++)
{
if(p & 0x0001)
{
DIO = 1; //需要传送的数据低位为1, 清零
}
else
{
DIO = 0; //需要传送的大数据低位为0, 置高
}
CLK = 0; //先将 CLK 清零
Delay_US(100);
CLK = 1; //送时钟的上升沿
Delay_US(100);
p = p >> 1; //准备送下一个字节
} //送完字节退出程序
}
void Display1()//时钟显示
{
if(Clock_Flag == 0)
{
uchar temp[4];
temp[3] = TmData%10000/1000; //先把TmData求余数后再求商,最后在赋值给temp[0],即取出TmData的千位数
temp[2] = TmData%1000/100; //同上
temp[1] = TmData%100/10;
temp[0] = TmData%10;
A_Data = a[temp[0]];
B_Data = a[temp[1]];
C_Data = b[temp[2]];
D_Data = a[temp[3]];
command(0x01); //设置显示模式,5位8段
command(0x40); //设置数据命令,采用地址自动加1
command(0xc0); //设置显示地址,从00H开始
//---------------------------------------
Send_date16(Z_Data);
Send_date16(A_Data);
Send_date16(B_Data);
Send_date16(C_Data);
Send_date16(D_Data);
//---------------------------------------
command(0x88); //打开显示并设置为最暗
Delay_US(20);
STB=1;
}
else
{
uchar temp[4];
temp[3] = TmData%10000/1000; //先把TmData求余数后再求商,最后在赋值给temp[0],即取出TmData的千位数
temp[2] = TmData%1000/100; //同上
temp[1] = TmData%100/10;
temp[0] = TmData%10;
A_Data = a[temp[0]];
B_Data = a[temp[1]];
C_Data = a[temp[2]];
D_Data = a[temp[3]];
command(0x01); //设置显示模式,5位8段
command(0x40); //设置数据命令,采用地址自动加1
command(0xc0); //设置显示地址,从00H开始
//---------------------------------------
Send_date16(Z_Data);
Send_date16(A_Data);
Send_date16(B_Data);
Send_date16(C_Data);
Send_date16(D_Data);
//---------------------------------------
command(0x88); //打开显示并设置为最暗
Delay_US(20);
STB=1;
}
}
z