⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tm1637.c

📁 一款廉价的多按键多数码管输出IC
💻 C
字号:
/*
 *文件名:     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);//根据按键值,给显示寄存器送相应的显示数据
 }
}							    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -