微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 为什么我弄这个点阵屏的温度变化不了,能够显示汉字和...

为什么我弄这个点阵屏的温度变化不了,能够显示汉字和...

时间:10-02 整理:3721RD 点击:
个人感觉是是“uchar wendu[]={10,1,4,11};  //温度显示缓存”和uchar disp_buf[]={0x00,0x00,0x00};   //温度显示数据缓冲区没有联系起来,又不会弄,谁帮忙改下
程序如下:
#include <reg51.h>           // 引用标准库的头文件
/***********************************************************************/
#define uchar unsigned char//常用符号定义
#define uint  unsigned int
//寄存器宏定义
#define DECODE_MODE  0x09  //译码控制寄存器
#define INTENSITY    0x0A  //亮度控制寄存器
#define SCAN_LIMIT   0x0B  //扫描界限寄存器
#define SHUT_DOWN    0x0C  //关断模式寄存器
#define DISPLAY_TEST 0x0F  //测试控制寄存器   
sbit shi_zhong=P2^5;  //595时钟端
sbit shu_ju=P2^6;     //595数据端
sbit suo_cun=P2^7;    //595锁存端
sbit DQ=P3^7;   //DS18B20数据I/O口
uchar code tab[]={    //不带分隔符阿拉伯数字
0x3C,0x7E,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x7E,0x3C,/*"未命名文件",0*/
0x10,0x18,0x1C,0x1C,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x3C,/*"未命名文件",0*/
0x3C,0x7E,0x66,0x66,0x60,0x60,0x30,0x30,0x18,0x18,0x0C,0x0C,0x06,0x06,0x7E,0x7E,/*"未命名文件",0*/
0x3C,0x7E,0x66,0x60,0x60,0x60,0x60,0x7C,0x7C,0x60,0x60,0x60,0x60,0x66,0x7E,0x3C,/*"未命名文件",0*/
0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0xFE,0xFE,0x60,0x60,0x60,0x60,0x60,/*"未命名文件",0*/
0x3C,0x7E,0x06,0x06,0x06,0x06,0x06,0x3E,0x7C,0x60,0x60,0x60,0x60,0x66,0x7E,0x3C,/*"未命名文件",0*/
0x3C,0x7E,0x66,0x06,0x06,0x06,0x06,0x3E,0x7E,0x66,0x66,0x66,0x66,0x66,0x7E,0x3C,/*"未命名文件",0*/
0x3C,0x7E,0x66,0x66,0x66,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,/*"未命名文件",0*/
0x3C,0x7E,0x66,0x66,0x66,0x66,0x66,0x3C,0x3C,0x66,0x66,0x66,0x66,0x66,0x7E,0x3C,/*"未命名文件",0*/
0x3C,0x7E,0x66,0x66,0x66,0x66,0x66,0x7E,0x7C,0x60,0x60,0x60,0x60,0x66,0x7E,0x3C,/*"未命名文件",0*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //不显示
0x00,0x06,0x09,0x09,0x06,0x70,0x88,0x04,0x04,0x04,0x04,0x04,0x04,0x88,0x70,0x00//温度符号
};
uchar code tab7[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//清屏
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//清屏
0xC0,0x00,0x88,0x21,0xFC,0x7F,0x0E,0x30,0xF4,0x1F,0xC0,0x02,0x60,0x04,0x30,0x0C,
0xF8,0x1F,0x90,0x09,0x80,0x01,0xF0,0x0F,0x80,0x01,0x80,0x01,0x80,0x21,0xFC,0x7F,//室
0x80,0x00,0x80,0x01,0x80,0x01,0x84,0x41,0xFC,0xFF,0x8C,0x61,0x8C,0x61,0xCC,0x63,
0xCC,0x66,0x6C,0x6C,0x2C,0x7C,0x1C,0x68,0x0C,0x60,0x0C,0x60,0x0C,0x78,0x04,0x20,//内
0x84,0x20,0x88,0x7F,0x98,0x31,0x88,0x3F,0x82,0x31,0xA4,0x31,0xAC,0x3F,0x94,0x10,
0x50,0x40,0xD8,0xFF,0xCA,0x6A,0xCC,0x6A,0xCC,0x6A,0xDC,0x6A,0xFC,0xFF,0x08,0x00,//温
0x00,0x02,0x08,0x46,0xF8,0xFF,0x98,0x08,0x98,0x59,0xF8,0xFF,0x98,0x19,0x98,0x1F,
0x98,0x28,0xD8,0x7F,0x98,0x31,0x0C,0x1B,0x0C,0x0E,0x04,0x3B,0x82,0xF1,0x60,0x40,//度
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//清屏
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00//清屏
};

uchar wendu[]={10,1,4,11};  //温度显示缓存
uchar disp_buf[]={0x00,0x00,0x00};   //温度显示数据缓冲区
uchar Tem_H,Tem_L;     //用于存储温度转换值高8位和低8位
bit Flag=0;       //正、负温度值符号标志位,0为正,1为负

/***********函数声明***************************/
void fasong_shuju(uchar dat595,c);        
void delay(uint n);               
void disp(uchar DM);
void zuo_yi(uchar tab[],uchar n);
void dispmove(void);         
void shujuf_enjie(void); //数据分解
void delay_DS18B20(int us);     //延时函数
bit Init_DS18B20(void);      //DS18b20初始化函数
uchar Read_bit(void);       //DS18b20读一个字节
void Write_bit(uchar val_bit);     //DS18b20写一个字节
uchar Read_byte(void);       //DS18B20读字节函数
void Write_byte(uchar com);      //DS18B20写字节函数
int ReadTemperature(void);      //DS18b20读取温度
void adj_dat(void);       //显示字节调整函数
void DelayMs(uint msec);
uchar GeKey(void);
void key (void);
void shujutiaozheng(void);
/***********主函数***************************/
main()                         //主程序
{

while(1)
{
  
  {
   dispmove();             //显示
  
   adj_dat();
  }
}
}
/***************595发送8位扫描段码子程*********/
void fasong_shuju(uchar dat595,c)        
{
uchar dat=dat595;           
uchar i;
for(i=0;i<c;i++)            
{
  dat<<=1;               
  shu_ju=CY;                  
  shi_zhong=0;               
  shi_zhong=1;            
}
}
/*****************延时子程序*******/
void delay(uint n)               
{
uint i,j;
for(i=0;i<n;i++)
  for(j=0;j<100;j++);
}
/*********************分屏显示数字************************/
void disp(uchar DM)
{   uchar i,row,j,m;
uint g;
for(j=0;j<100;j++)              //动态显示5次后,再移动
{
  row=0x08;                 //74138的编码初值08 第一行有效
  for(i=0;i<16;i++)         //16行循环有效
  {
   suo_cun=0;              //595锁存端无效   
   switch(DM)
   {
   
    case 4:{
       for(m=4;m>0;m--)
       {
        g=i+wendu[m-1]*16;
        fasong_shuju(~tab[g],8);   
       }
      }break;
   
   }
   P2=row;               //对应行输出
   row++;                //行号加1  
   suo_cun=1;              //595锁存数据
   delay(0);             //延时后刷屏
  }
}
}

void dispmove(void)           
{
  
   disp(0);
  
   zuo_yi(tab7,8);
   disp(4);
}
void zuo_yi(uchar tab[],uchar n)
{   uchar i,row,j,m,k,n1;
uint g;
for(n1=0;n1<(n-2);n1++)  //左移字数
{
  for(k=16;k>0;k--)  //左移16位
  {
   for(j=0;j<1;j++)              //动态显示1后,再移动
   {
    row=0x08;                 //74138的编码初值08 第一行有效
    for(i=0;i<16;i++)         //16行循环有效
    {
     suo_cun=0;              //595锁存端无效   
     if(k>8)
     {
      for(m=3;m>0;m--)      //4组16×16数据发送循环
      {
       if(m>1)
       {
        g=2*i+m*32-32+n1*32;
        fasong_shuju(~tab[g+1],8);  
        fasong_shuju(~tab[g],8);  
       }
       else
       {
        g=2*i+m*32-32+n1*32;
        fasong_shuju(~tab[g+1],8);   
        fasong_shuju(~tab[g],k-8);   
       }
      }
     }
     else
     {
      for(m=3;m>0;m--)      
      {
       if(m>1)
       {
        g=2*i+m*32-32+n1*32;//取字模
        fasong_shuju(~tab[g+1],8);   //上半屏
        fasong_shuju(~tab[g],8);   //下半屏   
       }
       else
       {
        g=2*i+m*32-32+n1*32;//取字模
        fasong_shuju(~tab[g+1],k);   //上半屏
        fasong_shuju(~tab[g],0);   //下半屏  
       }
      }
     }
     P2=row;               //对应行输出
     row++;                //行号加1  
     suo_cun=1;              //595锁存数据
    }
   }
  }
}
}
/**********************延时函数**************************/
void delay_DS18B20(int us)
{
int i;
for(i=0;i<us;i++);       //11.0592MHz下,延时时间为(24+16*us)
}
/*******************DS18B20复位函数***********************/
bit Init_DS18B20(void)
{
bit res;
DQ=0;          //拉低DQ线
delay_DS18B20(29);         //延时480us
DQ=1;          //DQ线置高
delay_DS18B20(10);         //延时
res=DQ;          //读取复位响应信号
delay_DS18B20(10);
return(res);        //返回响应值
}
/*******************DS18B20读位函数***********************/
uchar Read_bit(void)
{
uchar i;
DQ=0;          //拉低DQ线
DQ=1;          //DQ线置高
for(i=0;i<3;i++);       //延时15us
return(DQ);         //返回当前读取值
}
/*******************DS18B20写位函数***********************/
void Write_bit(uchar val_bit)
{
DQ=0;          //拉低DQ
if(val_bit==1)DQ=1;       //从DQ线发送1
delay_DS18B20(5);         //延时
DQ=1;
}
/********************DS18B20读字节函数*********************/
uchar Read_byte(void)
{
uchar i;
uchar temp=0;
for(i=0;i<8;i++)
{
  if(Read_bit())temp|=0x01<<i;   //向temp写入读取位
  delay_DS18B20(6);
}
return(temp);        //返回读取字节
}
/*********************DS18B20写字节函数*******************/
void Write_byte(uchar com)
{
uchar i,temp;
for(i=0;i<8;i++)
{
  temp=com>>i;       //右移i次取低位发送
  temp&=0x01;
  Write_bit(temp);
}
delay_DS18B20(5);
}
/*****************温度值正负判断程序******************/
uint Get_Tem(uchar dath,uchar datl)
{
uint temp=0,temp_h=0,temp_l;
temp_h=(uint)dath;
temp=temp_h&0x00ff;
temp_l=(uint)datl;
temp_l&=0x00ff;
temp=(temp<<8)|temp_l;      //去掉符号值后合并成16位数据
if((dath&0x80)==0x80)
{
  Flag=1;
  temp=~temp+1;       //负数时求补
}
else
{
  Flag=0;
}
return(temp);
}
int ReadTemperature(void)
{
uint temp=0;
float temp1=0;
while(!(Init_DS18B20()));
Write_byte(0xCC);        //跳过读序号列号的操作
Write_byte(0x44);        //启动温度转换
while(!(Init_DS18B20()));
Write_byte(0xCC);        //跳过读序号列号的操作
Write_byte(0xBE);        //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
Tem_L=Read_byte();       //低位
Tem_H=Read_byte();       //高位
temp=Get_Tem(Tem_H,Tem_L);
temp1=temp*0.0625;
temp=temp1*10+0.5;
return(temp);
}
void adj_dat(void)
{
uint temp;
EA=0;
temp=ReadTemperature();     //读温度
if(Flag)
  disp_buf[0]=10;
else
  disp_buf[0]=11;
disp_buf[1]=temp%1000/100;     //显示十位
if(disp_buf[1]==0)
{
  disp_buf[1]=disp_buf[0];
}
disp_buf[2]=temp%100/10;     //显示个位
EA=1;
}
/***************************************************************************************************************************/

我都系初哥,帮不了,你用仿真的还是直接在PCB板上跑的?

坐等大神,哇  咔 咔

直接实物上用万能板

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top