当前位置:   article > 正文

TM1620仿真

TM1620仿真

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);
        } 
    }
}

这样就可以进行仿真了,方便调试。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/752136
推荐阅读
相关标签
  

闽ICP备14008679号