欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

TM1637

发布时间:2023/12/14 编程问答 37 豆豆
生活随笔 收集整理的这篇文章主要介绍了 TM1637 小编觉得挺不错的,现在分享给大家,帮大家做个参考.
  • /*  
  •  *文件名:     TM1637(TM6920)  
  •  *当前版本:   1.0  
  •  *单片机型号: AT89S52  
  •  *开发环境:   Keil uVision3  
  •  *晶震频率:   12M  
  •   *完成日期:   2008-6-19  
  •  *功能:     按键控制数码屏显示0-8;其中0-3由K1与KS1,KS2,KS3,KS4控制,4-8由K2与KS1,KS2,KS3,KS4,KS5控制  
  • */   
  • #include<reg52.h>   
  • #include<intrins.h>   
  • #define nop _nop_(); //恒定义nop为空指令   
  • sbit clk = P1^0;  //设置串行时钟通讯口   
  • sbit dio = P1^1;  //设置串行数据传送通讯口   
  • sbit ack = P1^2;  //设置应答信号在p1.2口   
  • unsigned char m=0x00;   
  • bdata unsigned char y,t;//定义可以位寻址的两个全局变量   
  • sbit y7=y^7;   
  • sbit t5 = t^5;   
  • //----------给IC写数据(包括开始信号,8位数据,ACK应答信号)--   
  • void write(unsigned char p)   
  • {   
  •   unsigned int i;   
  •   clk = 1;  //给芯片发送开始信号   
  •   dio = 1;   
  •   nop;   
  •   nop;   
  •   dio = 0;   
  •   nop;   
  •   nop ;   
  •   clk = 0;  //开始信号传送完   
  •   for(i=0;i<8;i++) //开始传送8位数据   
  •    {   
  •      clk =0;   
  •      if((p&0x01)!=0)   
  •       {   
  •          dio=1;   
  •        }   
  •      else   
  •        {   
  •          dio=0;   
  •        }   
  •        clk =1;   
  •        p=p>>1;   
  •     }      
  •          //8位数据传送完1   
  •    clk = 0;//判断芯片发过来的ACK应答信号   
  •    nop;   
  •    nop;   
  •    dio = 1;   
  •    nop;   
  •    nop ;   
  •    clk = 1;   
  •    ack = dio;//将应答信号给ACK。   
  •    nop;   
  •    nop;   
  • }   
  • //---------读按键数据子程序-----------   
  • void read()   
  • {   
  •      
  •   unsigned char x=0;   
  •   nop;   
  •   nop;   
  •   clk = 0;   
  •  for(x=0;x<8;x++) //读按键数据开始   
  •  {   
  •    clk = 0;   
  •    nop;   
  •    if(dio==1)   
  •     {   
  •      y7 = 1;   
  •      }   
  •   else   
  •     {   
  •      y7 = 0;   
  •      }   
  •     clk = 1;   
  •     nop;   
  •     nop;   
  •     //y=(y>>1);   
  •     if(x!=7){y=(y>>1);}//读按键时,不需要开始信号,直接读8位数据。   
  •   }   
  •   clk = 0;   
  •    nop;   
  •    nop;   
  •    dio = 1;   
  •    nop;   
  •    nop ;   
  •    clk = 1;   
  •    ack = dio;   
  •    nop;   
  •    nop;      //ACK应答信号   
  • }    
  • //---------结束信号-------------------   
  • void jieshu()   
  • {   
  •   clk = 0;   
  •   nop;   
  •   nop;   
  •   dio = 0;   
  •   nop;   
  •   nop;   
  •   clk = 1;   
  •   nop;   
  •   nop;   
  •   nop;   
  •   dio = 1;   
  • }   
  • //----------显示子函数------------   
  • void xianshi(unsigned char q)   
  • {   
  •   unsigned char a=0;   
  •   dio = 1;   
  •   clk = 1;   
  •   write(0x40);//写命令40H(数据设置),地址自动加一   
  •   while(ack); //判断ACK应答信号,为1就死循环等待,为0就继续执行,表明数据已经发送成功。   
  •   jieshu(); //调用结束信号,一个字节命令发送完毕,可以发送下一个命令   
  •   nop;   
  •   nop;   
  •   nop;   
  •   nop;   
  •   write(0xc0);//写起始地址命令(0C0H),地址从00H单元开始。   
  •   while(ack);   
  •   for(a=0;a<6;a++)   
  •    {   
  •      write(q);//给显示寄存器写显示数据,值可根据实参改变   
  •      while(ack);//送一字节数据需要ACK信号,ACK为1,死循环,ACK为0,就继续送数据   
  •     }   
  •     jieshu(); //将所有数据送完后,发结束信号,可以发送下一条命令   
  •     nop;   
  •     nop;   
  •     nop;   
  •     write(0x8b); //送开屏命令,(8BH),亮度可以根据低三位调节。   
  •     while(ack);   
  •     jieshu();   
  • }   
  • //----------判按键子程序-----------   
  • void panjian(unsigned char k)   
  • {   
  •     if((k==0xf7)){m=0x3f;} //当K1与SEG1按键按下时候;给q送3FH,数码管显示数字0。   
  •     if ((k==0xf6)){m=0x06;}//当K1与SEG2按键按下时候;给q送06H,数码管显示数字1。   
  •     if((k==0xf5)){m=0x5b;}//当K1与SEG3按键按下时候;给q送5BH,数码管显示数字2。   
  •     if((k==0xf4)){m=0x4f;} //当K1与SEG4按键按下时候;给q送4FH,数码管显示数字3。   
  •     if ((k==0xef)){m=0x66;}//当K2与SEG1按键按下时候;给q送66H,数码管显示数字4。   
  •     if((k==0xee)){m=0x6d;}//当K2与SEG2按键按下时候;给q送6DH,数码管显示数字5。   
  •     if ((k==0xed)){m=0x7d;}//当K2与SEG3按键按下时候;给q送06H,数码管显示数字6。   
  •     if((k==0xec)){m=0x07;}//当K2与SEG4按键按下时候;给q送5BH,数码管显示数字7。   
  •     if((k==0xeb)){m=0x7f;}//当K2与SEG4按键按下时候;给q送5BH,数码管显示数字8。   
  • }   
  •    
  • //----------主函数-----------------   
  • void main()   
  • {   
  •  P0=0x00;   
  •  P1=0xff;   
  •  P2=0x00;   
  •  P3=0x00;//初始化单片机I/O口   
  •  while(1)//循环读按键   
  •  {             
  •  dio = 1;   
  •  clk = 1;   
  •  write(0x42);//送读按键命令(42H),   
  •  while(ack); //送应答信号,如果没有应答信号(ACK=1)就死循环,有应答信号(ACK=0)就继续往下执行。   
  •  read();    //读8位按键数据,其中高三位为0,低5位为按键编码。编码表见说明书第5页。   
  •  while(ack);//送应答信号,如果没有应答信号(ACK=1)就死循环,有应答信号(ACK=0)就继续往下执行。   
  •  jieshu(); //读完反码,发结束信号,按键读取完毕。   
  •  panjian(y);//判断按键值。   
  •  xianshi(m);//根据按键值,给显示寄存器送相应的显示数据   
  •  }   
  • }                                 
  • 总结

    以上是生活随笔为你收集整理的TM1637的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。