电子大神的日记本,供应链专家的功夫茶盘,在这里记录、分享与共鸣。

登录以开始

32*64点阵屏

首先附上电路图:attachment download

然后就是程序了:

#include"io.h"
#include"font.h"
#include"write_data_595.h"

uchar th;
uchar tl;
uint temp_ds18b20;

uchar hour_shi,hour_ge,minite_shi,minite_ge,sec_shi,sec_ge;
uchar  num_ds1302[8]={9,8,7,6,5,4,3,2};
//秒 分 时 日 月 星期 年 控制
uchar set_clk[8]={0x00,0x41,0x16};
uchar get_clk[8];
void RTInputByte(uchar d)//写入一个字节
{
  uchar i=0;
  ACC=d;
  for(i=8;i>0;i--)
  {
    T_IO=ACC0;
 T_CLK=1;
 T_CLK=0;
 ACC=ACC>>1;
  }
}
uchar RTOutputByte(void)//读一个字节
{
    uchar i=0;
    for(i=0;i<8;i++)
    {
     ACC=ACC>>1;
     ACC7=T_IO;
  T_CLK=1;
  T_CLK=0;
 }
 return(ACC);
}
void W1302(uchar ucAddr, uchar ucDa)
{
  T_RST=0;
  T_CLK=0;
  T_RST=1;
  RTInputByte(ucAddr);
  RTInputByte(ucDa);
  T_CLK=1;
  T_RST=0;
}
/*uchar R1302(uchar ucAddr)
{
  uchar R_DATA=0;
  T_RST=0;
  T_CLK=0;
  T_RST=1;
  RTInputByte(ucAddr);
  R_DATA=RTOutputByte();
  T_CLK=1;
  T_RST=0;
  return R_DATA;
}  */
void BurstW1302T(uchar *pWClock)
{
  uchar i=0;
  W1302(0x8e,0x00);
  T_RST = 0;
  T_CLK = 0;
  T_RST = 1;
  RTInputByte(0xbe);
  for(i=0;i<8;i++)
  {
    RTInputByte(*pWClock);
 pWClock++;
  }
  T_CLK=1;
  T_RST=0;
}
void BurstR1302T(uchar *pRClock)
{
  uchar i=0;
  T_RST = 0;
  T_CLK = 0;
  T_RST = 1;
  RTInputByte(0xbf);
  for(i=0;i<8;i++)
  {
    *pRClock=RTOutputByte();
  pRClock++;
  }
  T_CLK=1;
  T_RST=0;
}

void delay_ds18b20(uint z)  //延时子函数
{
 uint x,y;
 for(x=z;z>0;z--)
  for(y=11;y>0;y--);
}
void dsreset(void)       //温度采集复位函数
{
  uint i;
  DS=0;
  i=103;
  while(i>0)i--;
  DS=1;
  i=4;
  while(i>0)i--;
}

bit tmpreadbit(void)       //read a bit
{
   uint i;
   bit dat;
   DS=0;i++;          //i++ for delay
   DS=1;i++;i++;
   dat=DS;
   i=8;while(i>0)i--;
   return (dat);
}

uchar tmpread(void)   //read a byte date
{
  uchar i,j,dat;
  dat=0;
  for(i=1;i<=8;i++)
  {
    j=tmpreadbit();
    dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好一个字节在DAT里
  }
  return(dat);
}

void tmpwritebyte(uchar dat)   //write a byte to ds18b20
{
  uint i;
  uchar j;
  bit testb;
  for(j=1;j<=8;j++)
  {
    testb=dat&0x01;
    dat=dat>>1;
    if(testb)     //write 1
    {
      DS=0;
      i++;i++;
      DS=1;
      i=8;while(i>0)i--;
    }
    else
    {
      DS=0;       //write 0
      i=8;while(i>0)i--;
      DS=1;
      i++;i++;
    }

  }
}

void tmpchange(void)  //DS18B20 begin change
{
  dsreset();
  delay_ds18b20(1);
  tmpwritebyte(0xcc);  // address all drivers on bus
  tmpwritebyte(0x44);  //  initiates a single temperature conversion发命令开始装换温度
}

uchar tmp()               //get the temperature
{
  float tt;
  dsreset();
  delay_ds18b20(1);
  tmpwritebyte(0xcc);
  tmpwritebyte(0xbe);
  tl=tmpread();
  th=tmpread();
  temp_ds18b20=th;
  temp_ds18b20<<=8;             //two byte  compose a int variable
  temp_ds18b20=temp_ds18b20|tl;
  tt=temp_ds18b20*0.0625;
  temp_ds18b20=tt*10+0.5;
  return temp_ds18b20;

}
/*******************************************************
函数名称:xuan_hang()
函数功能:选择第几行
*******************************************************/
void xuan_hang(unsigned char h)
{
    P2=hang[h]|0x00;
}

/*******************************************************
函数名称:display(uchar n)
函数功能: 显示函数 n为第几行字 0:华东交大 1:信息学院 2:通信工程 3:欢迎您!
入口参数:n
出口参数:
*******************************************************/
void display(unsigned char n)    //显示数组的第n个汉字开始的后4个字
{
    uchar i;
    for(i=0;i<16;i++)
    {

        write_data_595(xianshi[n][2*i],xianshi[n][2*i+1],xianshi[n+1][2*i],xianshi[n+1][2*i+1],xianshi[n+2][2*i],xianshi[n+2][2*i+1],xianshi[n+3][2*i],xianshi[n+3][2*i+1]);
        xuan_hang(i);//先选行后选列
    }
}
void display_ds18b20()
{ uchar shi,ge,xiaoshu;
 uchar a;
 uchar i,wendu;
 tmpchange();//开始转换
 tmp();
 wendu=temp_ds18b20;

 shi=wendu/100; //百位
 a=wendu%100;  //
 ge=a/10; //十位
 xiaoshu=a%10; //个位
 //返回参数a1,a2,a3
    for(i=0;i<16;i++)
    {
        write_data_595(xianshi[12][2*i],xianshi[12][2*i+1],  xianshi[12+1][2*i],xianshi[12+1][2*i+1],     //温度
  shuzi[shi][i],shuzi[ge][i],   //十位和个位
  shuzi[10][i],    // . 小数点
  shuzi[xiaoshu][i]);  // 小数点后的一位
  xuan_hang(i);//先选行后选列
    } 
}
void display_ds1302() //显示时分秒
{
 uchar i;
      unsigned char loop=0;
     hour_shi=get_clk[2]>>4;
     hour_ge=get_clk[2]&0X0F;

     num_ds1302[2]=16;

     minite_shi=get_clk[1]>>4;           //得到要显示数据的万位
     minite_ge=get_clk[1]&0X0F;

     num_ds1302[5]=16;

     sec_shi=get_clk[0]>>4;         //得到要显示数据的十位
     sec_ge=get_clk[0]&0X0F;             //得到要显示数据的个位
/* hour_shi=hour/10;
 hour_ge=hour%10;
 minite_shi=minite/10;
 minite_ge=minite%10;
 sec_shi=sec/10;
 sec_ge=sec%10;   */
    for(i=0;i<16;i++)
    {
  write_data_595(shuzi[hour_shi][i],shuzi[hour_ge][i],
  shuzi[11][i],
  shuzi[minite_shi][i],    shuzi[minite_ge][i],
  shuzi[11][i],  
  shuzi[sec_shi][i],      shuzi[sec_ge][i]); 
  xuan_hang(i);//先选行后选列
    }
}

/*******************************************************
函数名称:main()
函数功能:主函数
*******************************************************/
void main()

 uint i; 
 uchar j,num;
 num=160;
 //BurstW1302T(set_clk);//设定初始时间
    while(1)
    {

   for(j=0;j<num;j++)
   {
    display(0);
   }
      for(j=0;j<num;j++)
   {
    display(4);
   }
      for(j=0;j<num;j++)
   {
    display(8);
   }

     for(i=0;i<1000;i++)
     {
     BurstR1302T(get_clk);
     display_ds1302();
  }
  for(i=0;i<1000;i++)
  {
      display_ds18b20();
  }
 }
}

博主
578645627@qq.com
惊涛骇浪's Blog
QQ群:电子爱好者194554761欢迎您的加入!
点击跳转