TM1637

  1. /*  
  2.  *文件名:     TM1637(TM6920)  
  3.  *当前版本:   1.0  
  4.  *单片机型号: AT89S52  
  5.  *开发环境:   Keil uVision3  
  6.  *晶震频率:   12M  
  7.   *完成日期:   2008-6-19  
  8.  *功能:     按键控制数码屏显示0-8;其中0-3由K1与KS1,KS2,KS3,KS4控制,4-8由K2与KS1,KS2,KS3,KS4,KS5控制  
  9. */   
  10. #include<reg52.h>   
  11. #include<intrins.h>   
  12. #define nop _nop_(); //恒定义nop为空指令   
  13. sbit clk = P1^0;  //设置串行时钟通讯口   
  14. sbit dio = P1^1;  //设置串行数据传送通讯口   
  15. sbit ack = P1^2;  //设置应答信号在p1.2口   
  16. unsigned char m=0x00;   
  17. bdata unsigned char y,t;//定义可以位寻址的两个全局变量   
  18. sbit y7=y^7;   
  19. sbit t5 = t^5;   
  20. //----------给IC写数据(包括开始信号,8位数据,ACK应答信号)--   
  21. void write(unsigned char p)   
  22. {   
  23.   unsigned int i;   
  24.   clk = 1;  //给芯片发送开始信号   
  25.   dio = 1;   
  26.   nop;   
  27.   nop;   
  28.   dio = 0;   
  29.   nop;   
  30.   nop ;   
  31.   clk = 0;  //开始信号传送完   
  32.   for(i=0;i<8;i++) //开始传送8位数据   
  33.    {   
  34.      clk =0;   
  35.      if((p&0x01)!=0)   
  36.       {   
  37.          dio=1;   
  38.        }   
  39.      else   
  40.        {   
  41.          dio=0;   
  42.        }   
  43.        clk =1;   
  44.        p=p>>1;   
  45.     }      
  46.          //8位数据传送完1   
  47.    clk = 0;//判断芯片发过来的ACK应答信号   
  48.    nop;   
  49.    nop;   
  50.    dio = 1;   
  51.    nop;   
  52.    nop ;   
  53.    clk = 1;   
  54.    ack = dio;//将应答信号给ACK。   
  55.    nop;   
  56.    nop;   
  57. }   
  58. //---------读按键数据子程序-----------   
  59. void read()   
  60. {   
  61.      
  62.   unsigned char x=0;   
  63.   nop;   
  64.   nop;   
  65.   clk = 0;   
  66.  for(x=0;x<8;x++) //读按键数据开始   
  67.  {   
  68.    clk = 0;   
  69.    nop;   
  70.    if(dio==1)   
  71.     {   
  72.      y7 = 1;   
  73.      }   
  74.   else   
  75.     {   
  76.      y7 = 0;   
  77.      }   
  78.     clk = 1;   
  79.     nop;   
  80.     nop;   
  81.     //y=(y>>1);   
  82.     if(x!=7){y=(y>>1);}//读按键时,不需要开始信号,直接读8位数据。   
  83.   }   
  84.   clk = 0;   
  85.    nop;   
  86.    nop;   
  87.    dio = 1;   
  88.    nop;   
  89.    nop ;   
  90.    clk = 1;   
  91.    ack = dio;   
  92.    nop;   
  93.    nop;      //ACK应答信号   
  94. }    
  95. //---------结束信号-------------------   
  96. void jieshu()   
  97. {   
  98.   clk = 0;   
  99.   nop;   
  100.   nop;   
  101.   dio = 0;   
  102.   nop;   
  103.   nop;   
  104.   clk = 1;   
  105.   nop;   
  106.   nop;   
  107.   nop;   
  108.   dio = 1;   
  109. }   
  110. //----------显示子函数------------   
  111. void xianshi(unsigned char q)   
  112. {   
  113.   unsigned char a=0;   
  114.   dio = 1;   
  115.   clk = 1;   
  116.   write(0x40);//写命令40H(数据设置),地址自动加一   
  117.   while(ack); //判断ACK应答信号,为1就死循环等待,为0就继续执行,表明数据已经发送成功。   
  118.   jieshu(); //调用结束信号,一个字节命令发送完毕,可以发送下一个命令   
  119.   nop;   
  120.   nop;   
  121.   nop;   
  122.   nop;   
  123.   write(0xc0);//写起始地址命令(0C0H),地址从00H单元开始。   
  124.   while(ack);   
  125.   for(a=0;a<6;a++)   
  126.    {   
  127.      write(q);//给显示寄存器写显示数据,值可根据实参改变   
  128.      while(ack);//送一字节数据需要ACK信号,ACK为1,死循环,ACK为0,就继续送数据   
  129.     }   
  130.     jieshu(); //将所有数据送完后,发结束信号,可以发送下一条命令   
  131.     nop;   
  132.     nop;   
  133.     nop;   
  134.     write(0x8b); //送开屏命令,(8BH),亮度可以根据低三位调节。   
  135.     while(ack);   
  136.     jieshu();   
  137. }   
  138. //----------判按键子程序-----------   
  139. void panjian(unsigned char k)   
  140. {   
  141.     if((k==0xf7)){m=0x3f;} //当K1与SEG1按键按下时候;给q送3FH,数码管显示数字0。   
  142.     if ((k==0xf6)){m=0x06;}//当K1与SEG2按键按下时候;给q送06H,数码管显示数字1。   
  143.     if((k==0xf5)){m=0x5b;}//当K1与SEG3按键按下时候;给q送5BH,数码管显示数字2。   
  144.     if((k==0xf4)){m=0x4f;} //当K1与SEG4按键按下时候;给q送4FH,数码管显示数字3。   
  145.     if ((k==0xef)){m=0x66;}//当K2与SEG1按键按下时候;给q送66H,数码管显示数字4。   
  146.     if((k==0xee)){m=0x6d;}//当K2与SEG2按键按下时候;给q送6DH,数码管显示数字5。   
  147.     if ((k==0xed)){m=0x7d;}//当K2与SEG3按键按下时候;给q送06H,数码管显示数字6。   
  148.     if((k==0xec)){m=0x07;}//当K2与SEG4按键按下时候;给q送5BH,数码管显示数字7。   
  149.     if((k==0xeb)){m=0x7f;}//当K2与SEG4按键按下时候;给q送5BH,数码管显示数字8。   
  150. }   
  151.    
  152. //----------主函数-----------------   
  153. void main()   
  154. {   
  155.  P0=0x00;   
  156.  P1=0xff;   
  157.  P2=0x00;   
  158.  P3=0x00;//初始化单片机I/O口   
  159.  while(1)//循环读按键   
  160.  {             
  161.  dio = 1;   
  162.  clk = 1;   
  163.  write(0x42);//送读按键命令(42H),   
  164.  while(ack); //送应答信号,如果没有应答信号(ACK=1)就死循环,有应答信号(ACK=0)就继续往下执行。   
  165.  read();    //读8位按键数据,其中高三位为0,低5位为按键编码。编码表见说明书第5页。   
  166.  while(ack);//送应答信号,如果没有应答信号(ACK=1)就死循环,有应答信号(ACK=0)就继续往下执行。   
  167.  jieshu(); //读完反码,发结束信号,按键读取完毕。   
  168.  panjian(y);//判断按键值。   
  169.  xianshi(m);//根据按键值,给显示寄存器送相应的显示数据   
  170.  }   
  171. }                                 
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值