赞
踩
https://download.csdn.net/download/u013384657/89278770
因为protues里面没有TM1620这个芯片,但是又要用到它的仿真,所以这里就用单片机来模拟它的通讯协议来模仿这个芯片的功能。
【右边那个单片机代码】
//0.05us
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
sbit din=P3^3;
sbit clk=P3^4;
sbit stb=P3^2;
sbit smg1=P1^2;
sbit smg2=P1^3;
sbit smg3=P1^4;
sbit smg4=P1^5;
sbit smg5=P1^6;
sbit smg6=P1^7;
uchar time=0,mode=0;//系统变量
uchar dat[15];
uchar num[12]={0,0,0,0,0,0,0,0,0,0,0,0};//显存
uchar jishu=0;//接收计数
uchar mode_xian=0;//显示模式 0:4-10 1:5-9 2:6-8
uchar mode_data=0x40;//数据模式 0x40自动加 0x44固定
uchar mode_pwm=0;//显示模式,开关+占空比
//===========================================================
//延时
void delay(uint i)
{
while(i--);
}
void up()//等待上升沿
{
bit a=0,b=0;
a=clk;
b=clk;
while(!stb)
{
a=b;
b=clk;
if(!a && b)
break;
}
}
uchar read_byte()//读取一个字节
{
uchar i=0,a=0;
for(i=0;i<8;i++)
{
a>>=1;
up();//等待上升沿
if(din)
a+=0x80;
}
return a;
}
void read()//读取一个命令
{
uchar i=0;
jishu=0;
while(!stb)
{
dat[i]=read_byte();
jishu++;
if(i<15)
i++;
}
}
void clear()//清除
{
uchar i;
if(dat[0]>0)//自动清零
{
for(i=0;i<15;i++)
{
dat[i]=0;
}
}
}
//===================================================
void main() //主函数
{
//设置INT0
IT0=1;//跳变沿出发方式(下降沿)
EX0=1;//打开INT0的中断允许。
EA=1;//打开总中断
clear();
while(1)
{
//P0=mode_pwm;
//4-10
if(mode_xian==0)
{
P2=num[0];
smg5=(num[1]& 0x10)>0;
smg6=(num[1]& 0x20)>0;
smg1=0;delay(1000);smg1=1;
P2=num[2];
smg5=(num[3]& 0x10)>0;
smg6=(num[3]& 0x20)>0;
smg2=0;delay(1000);smg2=1;
P2=num[4];
smg5=(num[5]& 0x10)>0;
smg6=(num[5]& 0x20)>0;
smg3=0;delay(1000);smg3=1;
P2=num[6];
smg5=(num[7]& 0x10)>0;
smg6=(num[7]& 0x20)>0;
smg4=0;delay(1000);smg4=1;
}
//5-9
if(mode_xian==1)
{
P2=num[0];
smg6=(num[1]& 0x10)>0;
smg1=0;delay(1000);smg1=1;
P2=num[2];
smg6=(num[3]& 0x10)>0;
smg2=0;delay(1000);smg2=1;
P2=num[4];
smg6=(num[5]& 0x10)>0;
smg3=0;delay(1000);smg3=1;
P2=num[6];
smg6=(num[7]& 0x10)>0;
smg4=0;delay(1000);smg4=1;
P2=num[8];
smg6=(num[9]& 0x10)>0;
smg5=0;delay(1000);smg5=1;
}
//6-8
if(mode_xian==2)
{
P2=num[0];
smg1=0;delay(1000);smg1=1;
P2=num[2];
smg2=0;delay(1000);smg2=1;
P2=num[4];
smg3=0;delay(1000);smg3=1;
P2=num[6];
smg4=0;delay(1000);smg4=1;
P2=num[8];
smg5=0;delay(1000);smg5=1;
P2=num[10];
smg6=0;delay(1000);smg6=1;
}
}
}
void Int0() interrupt 0 //外部中断0的中断函数
{
uchar i=0,j;
read();//读取一个命令
i=(dat[0]>>4);
if(i==0)
mode_xian=dat[0];
if(i==4)
mode_data=dat[0];
if(i==8)
mode_pwm=dat[0];
if(i==12)
{
if(mode_data==0x44)//固定
num[dat[0] & 0x0f]=dat[1];
else //自动加
{
i=dat[0] & 0x0f;//初始地址
for(j=1;j<jishu-1;j++)
{
num[i]=dat[j];
i++;
}
}
}
clear();//清除
}
【左边那个单片机代码】
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
sbit TM1620_CLK_Pin=P2^1;
sbit TM1620_DIN_Pin=P2^0;
sbit TM1620_STB_Pin=P2^2;
sbit k1=P1^0;
sbit k2=P1^1;
//数码管编码
uchar code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar time=0,mode=0;//系统变量
//延时
void delay(uint i)
{
while(i--);
}
void TM1620Sendata(uchar TM1620Data)
{
uchar i;
for(i =0;i<8;i++)
{
TM1620_CLK_Pin=0; //CLK低
if(TM1620Data & 0x01)
{
TM1620_DIN_Pin=1; //DIO高
}
else
{
TM1620_DIN_Pin=0; //DIO低
}
delay(10);
TM1620_CLK_Pin=1; //CLK高
TM1620Data >>=1;
}
TM1620_CLK_Pin=0; //CLK低
delay(10);
TM1620_DIN_Pin=0; //DIO低
}
void TM1620Sencmd(uchar com)
{
TM1620_STB_Pin=1; //高
delay(10);
TM1620_STB_Pin=0; //
TM1620Sendata(com);
}
void TM1620_Dis(uchar p,uchar p2,uchar open)
{
uchar i;
TM1620Sencmd(0x02); //设置显示模式,6位8段模式
TM1620Sencmd(0X40); //设置数据命令,采用地址自动加1模式 0X40
//TM1620Sencmd(0x44); //固定地址
TM1620Sencmd(0xC0); //设置地址从00H开始
TM1620Sendata(p); //从00H开始,偶数地址送显示数据
TM1620Sendata(0x00); //01H
TM1620Sendata(p2); //02H
TM1620Sendata(0x00); //03H
//其他数据直接给0了 上面发了4个,下面发8个
for(i = 0 ;i < 8;i++)
{
TM1620Sendata(0x00);
}
if(open>0)
TM1620Sencmd(0x88+open); //设置显示命令,设置占空比open=1~7对应2,4,10,11,12,13,14
else
TM1620Sencmd(0x80); //关闭
TM1620_STB_Pin=1; //高
}
void main() //主函数
{
while(1)
{
if(!k1)
{
TM1620_Dis(smgduan[0],smgduan[1],0x04);
while(!k1);
}
if(!k2)
{
TM1620_Dis(smgduan[2],smgduan[3],0x04);
while(!k2);
}
}
}
这样就可以进行仿真了,方便调试。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。