• 大小: 9KB
    文件类型: .c
    金币: 1
    下载: 0 次
    发布日期: 2021-06-25
  • 语言: 其他
  • 标签: TM1638  

资源简介

此代码为官方TM1638的51单片机驱动代码,共阳转共阴,稍作修改即可移植到别的平台

资源截图

代码片段和文件信息


#include
#include
#define nop _nop_();
#define uchar unsigned char
#define uint  unsigned int
sbit TM1638_STB =P1^0; //定义片选通讯口
sbit TM1638_CLK =P1^1; //定义时钟通讯口
sbit TM1638_DIO =P1^3; //定义数据输入/输出通讯口
bdata uchar y=0;//定义可以位寻址全局变量y
sbit y7 =y^7;
uchar Show[16] = {0x760x7b0x380x380x3f0x400x400x400x400x40};//初始化显示“HELLO”字符代码
                             //    -----    共阴代码寄存器组
uchar Show_LED[16];  //转换后的共阳显示代码寄存器
uchar CODE[10] = {0x3f0x060x5b0x4f0x660x6d0x7d0x070x7f0x6f}; //0~9显示代码
uchar TIME_secondsseconds_2sub_1sub_2shi_1shi_2; //时间寄存器依次从秒个位至小时十位
uchar TIME_count; //定时中断控制制位
uchar T_count;   //时钟小数点闪
uchar count4;    //保存按键控制对应的数码管闪
uchar Key_FLAG1;//按键标志位
uchar Key_COUNT1;//按键移动数动显示数据
uchar Key_LED=0;  //按键单独显示赋值寄存器
uchar count7;
/*********************************   
功能: TM1638写数据
**********************************/
void TM1638_InData(uchar wr_data)
{
     uchar i;
 TM1638_STB =0;    //给有效的片选信号(片选信号是低电平有效)
 nop;
 nop;  
 for(i=0;i<8;i++)//开始传送8位数据,每循环一次传送一位数据
 {
     TM1638_CLK =0;
 nop;
 nop;
     wr_data >>= 1;//移位数据,低位在前!
     nop;
     TM1638_DIO = CY;
     nop;
     nop;
     TM1638_CLK =1;
     nop;
   }
}
/*********************************  
功能:读按键子程序 由y 返回1BIT按键数据
**********************************/
unsigned char Read_TM1668_Data()
{
  uchar d;
  TM1638_STB = 0;   //给有效的片选信号(片选信号是低电平有效)
  TM1638_DIO = 1;   //将TM1638_DIO置高,因为没有按键按下时,键值默认为00H,此时为了与键值有区别
  for(d=0;d<8;d++)
   {
     TM1638_CLK = 0;
 nop;
   if(TM1638_DIO==1)
     {
     y7 = 1;
 }
  else
     {
 y7 = 0;
 }
 TM1638_CLK = 1;
 if(d!=7){y=(y>>1);}   
 nop;
 nop;
}
return(y);
}
/*********************************
    将共阴代码转换为驱动共阳代码
 将Show[]数组寄存器数据转换至Show_LED2[]
**********************************/
void conver_CODE()
{
   uchar count1count2xconver[16];   //转换原理将Show[]的前8个元素(Show[0]~ Show[7])的第0位 放在Show_LED[]的第1个元素(Show_LED[0])
   for(count1=0;count1<16;count1++)    //Show[]的前8个元素(Show[0]~ Show[7])的第1位 放在Show_LED[]的第2个元素(Show_LED[1]),依此类推
    {
  conver[count1] = Show[count1];
 }
   for(count1=0;count1<8;count1++)
    {
  y = 0x00;
  for(count2=0;count2<8;count2++)
   {
      x = conver[count2];
  if((x&0x01) != 0){ y7 = 1;}
  if(count2 != 0x07){y >>= 1;}
  conver[count2]=(x>>1);
}
  Show_LED[count1*2] = y;



  y = 0x00;
  for(count2=0;count2<8;count2++)   //Show[]的后8个元素(Show[8]~ Show[15])的第0位 放在Show_LED[]的第1个元素(Show_LED[1])
   {
      x = conver[count2+8];  //Show[]的后8个元素(Show[8]~ Show[15])的第1位 放在Show_LED[]的第2个元素(Show_LED[1]),依次类推
  if((x&0x01) != 0){ y7 = 1;}
  if(count2 != 0x07){y >>= 1;}
  conver[count2+8]=(x>>1);
}
  Show_LED[count1*2+1] = y;
}
}
    
/*********************************
    TM1638控制指令
功能: 驱动LED屏做相应的显示
**********************************/
void Display_TM1638_Order(uchar Show_led[16])
{
  uchar h;
  TM1638_STB = 1;
  TM1638_CLK =

评论

共有 条评论