原创 32*64点阵屏

2011-4-24 00:36 3483 12 14 分类: MCU/ 嵌入式

首先附上电路图: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],shuzi[ge],   //十位和个位
  shuzi[10],    // . 小数点
  shuzi[xiaoshu]);  // 小数点后的一位
  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],shuzi[hour_ge],
  shuzi[11],
  shuzi[minite_shi],    shuzi[minite_ge],
  shuzi[11],  
  shuzi[sec_shi],      shuzi[sec_ge]); 
  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();
  }
 }
}

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户1707053 2014-4-15 21:24

谢谢楼主

用户1622284 2012-4-10 02:26

3Q
相关推荐阅读
578645627_583309889 2013-05-24 23:06
64位WIN7系统可以使用的PL2303驱动程序
64位WIN7系统可以使用的PL2303驱动程序,折腾了好久,终于在网上找到了这个,嘿嘿,发出来一起共享一下,哈哈...
578645627_583309889 2013-05-22 13:44
http://www.cnblogs.com/tao560532/ 我博客园的地址
http://www.cnblogs.com/tao560532/     我博客园的地址 嘿嘿,博客园发帖子要快些。哈哈...
578645627_583309889 2013-03-10 22:43
嵌入式系统软件笔试题
1、130 150 186 移动段号写段代码。 2、inline机制。 3、函数参数机制。 4、中序遍历,前序遍历。 5、改错题 6、...
578645627_583309889 2012-12-18 23:03
常见协议
简单的SPI,IIC,UART,复杂些的pci,pcie,sgmii,smi...
578645627_583309889 2012-01-12 18:42
变量的命名规则
变量的命名规则 (1)    一般规则 1.1:命名应当直观且可以拼读,可望文知意,便于记忆和阅读。   1.2:命名的长度应当符合“min-length&a...
578645627_583309889 2011-10-16 13:49
C语言--位域
位域     位域是指信息存储时,并不需要占用一个完整的字节,而只需要占几个或是一个二进制位。     所谓“位域”或是“位段”是指把一个字节中的二进制位划分为几个不同的区域,并说明每个区域的位数...
我要评论
2
12
关闭 站长推荐上一条 /3 下一条