找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3656|回复: 6
收起左侧

两路温度显示单片机程序,请问怎样才能把LCD改成数码管显示,可以不要上下限。

[复制链接]
ID:412814 发表于 2018-11-26 19:01 | 显示全部楼层 |阅读模式
  1. #include <REGX51.H>
  2. #define uchar unsigned char
  3. #define uint unsigned  int
  4. sbit AD0832_CS = P1^0 ; //片选信号
  5. sbit AD0832_CLK = P1^1; //时钟接口
  6. sbit AD0832_DI = P1^2; //数据接口
  7. uchar code table[8]={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};        // 摄氏温度符号
  8. sbit RS = P2^0;                                //LCD数据/命令选择端(H/L)位声明
  9. sbit RW = P2^1;                                //LCD读写控制,写为0,读为1
  10. sbit EN = P2^2;                                //LCD使能信号端位声明
  11. sbit k1=P2^3;                                                               //按键定义
  12. sbit k2=P2^4;
  13. sbit k3=P2^5;
  14. sbit k4=P2^6;
  15. int shang=40;                                 //上限温度定义
  16. int xia=20;
  17. uchar data disdata[7];
  18. uchar data  data1[7];
  19. /***********************************************************************
  20. 利用按键来控制上限下限温度
  21. *********************************************************/
  22. void delay1(unsigned short i)
  23. {
  24.         while(i--);        
  25. }

  26. void keypros()
  27. {
  28.         if(k1==0)                         //上加
  29.         {
  30.                 delay1(1000);
  31.                 shang=shang+1;
  32.         }
  33.         if(k2==0)                          //上减
  34.         {
  35.                 delay1(1000);
  36.                 shang=shang-1;
  37.         }
  38.         if(k3==0)                          //下加
  39.         {
  40.                 delay1(1000);
  41.                 xia=xia+1;
  42.     }
  43.         if(k4==0)                          //下减
  44.         {
  45.                 delay1(1000);
  46.                 xia=xia-1;
  47.         }
  48.         if((k3==0)&&(k1==0)        )          //归位

  49.         {
  50.                 delay1(1000);
  51.                 shang=40;
  52.                 xia=20;
  53.         }
  54. }
  55. /*************************lcd1602程序**************************/
  56. void delay1ms(uint ms)//延时1毫秒(不够精确的)
  57. {  uint i,j;
  58.    for(i=0;i<ms;i++)
  59.     for(j=0;j<100;j++);
  60. }
  61. void wr_com(uchar com)//写指令//
  62. {
  63.    delay1ms(1);
  64.    RS=0;
  65.    RW=0;
  66.    EN=0;
  67.    P0=com;
  68.    delay1ms(1);
  69.    EN=1;
  70.    delay1ms(1);
  71.    EN=0;
  72. }void wr_dat(uchar dat)//写数据//
  73. {  
  74.    delay1ms(1);
  75.    RS=1;
  76.    RW=0;
  77.    EN=0;
  78.    P0=dat;
  79.    delay1ms(1);
  80.    EN=1;
  81.    delay1ms(1);
  82.    EN=0;
  83. }
  84. void wr_new()                  //写新字符
  85. {
  86.         uchar i;
  87.         wr_com(0x40);
  88.         for(i=0;i<8;i++)
  89.         {
  90.                 wr_dat(table[i]);
  91.         }
  92. }
  93. void lcd_init()//初始化设置//
  94. {       delay1ms(15);
  95.         wr_com(0x38);delay1ms(5);
  96.         wr_com(0x08);delay1ms(5);
  97.         wr_com(0x01);delay1ms(5);
  98.         wr_com(0x06);delay1ms(5);
  99.         wr_com(0x0c);delay1ms(5);
  100. }uchar GetAD0832(uint Channel)
  101. {
  102.         uchar i=0 , Data1 =0 , Data2 = 0 ;
  103.         AD0832_CLK = 0 ; //时钟置低平
  104.         AD0832_DI = 1 ; //开始信号为高电平
  105.         AD0832_CS = 0 ; //片选信号置低,启动AD转换芯片
  106.         AD0832_CLK = 1 ; //输入开始信号(构成一个正脉冲),时钟上升沿,输入开始信号
  107.         AD0832_CLK = 0 ; //时钟下降沿
  108.         //模拟信号输入模式选择(1:单模信号,0:双模差分信号)
  109.         AD0832_DI = 1 ;
  110.         AD0832_CLK = 1 ; //时钟上升沿,输入开始信号
  111.         AD0832_CLK = 0 ; //时钟下降沿
  112.         //模拟信号输入通道选择(1:通道CH1,0:通道CH0)
  113.         AD0832_DI = Channel ; //选择通道0
  114.         AD0832_CLK = 1 ; //时钟上升沿,输入开始信号
  115.         AD0832_CLK = 0 ; //时钟下降沿
  116.         AD0832_DI = 1 ; //数据线置高,准备接收数据
  117.     for(i=0;i<8;i++) //从高位移入数据
  118.   {
  119.    AD0832_CLK = 1 ;
  120.    AD0832_CLK = 0 ; //时钟下降沿,AD0832输出数据,高位(MSB)先
  121.    Data1 = Data1<<1;
  122.     if(AD0832_DI == 1)
  123.         {Data1 = Data1 | 0x01;} //数据左移位,补0 ,如果数据为“1”,移入1, 如果数据为“0”,移入0,
  124.    }

  125. for(i=0;i<8;i++) //从低位移入数据
  126.    {
  127.                 Data2 = Data2>>1;
  128.                 if(AD0832_DI == 1)
  129.                         {  Data2 = Data2 | 0x80;} //数据右移位,补0,如果数据为“1”,移入1如果数据为“0”,移入0,
  130.                            AD0832_CLK = 1 ;
  131.                            AD0832_CLK = 0 ; //时钟下降沿,AD0832输出数据,高位(MSB)先
  132.                      }
  133. //数据线置高,释放总线,完成一次转换
  134.                 AD0832_CLK = 1 ;
  135.                 AD0832_DI = 1 ;
  136.                 AD0832_CS = 1 ;
  137.                 return (Data1==Data2)?Data1:0; //   如果相等输出data1  or  0
  138.    }

  139.     void delay(uint i) //延时程序,i是形式参数,i为1时 延时约1MS
  140.     {
  141.                         uint j;
  142.                         for(;i>0;i--) //变量i由实际参数传入一个值,因此i不能赋初值
  143.                         for(j=0;j<125;j++) //j由0自增到125 所用的时间大约是1MS
  144.                         {;}
  145.     }
  146.     void main() //主函数
  147. {
  148.     uchar AD_val1; //储存A/D转换后的值
  149.         uchar AD_val2;
  150.         delay1(1000);
  151.         lcd_init();//初始化显示
  152.         delay1(1000);         
  153.      while(1)
  154.       {
  155.                 keypros() ;
  156.             data1[0] = shang / 10;
  157.                     data1[1] = shang % 10;
  158.                         data1[2] = xia / 10;
  159.                     data1[3] = xia % 10;
  160.                     wr_com(0xc0);                 //写地址 第二行
  161.                     wr_dat('0'+data1[0]);
  162.                         wr_com(0xc1);                 //写地址 第二行
  163.                         wr_dat('0'+data1[1]);
  164.                         wr_com(0xc3);                 //写地址 第二行
  165.                         wr_dat('0'+data1[2]);
  166.                         wr_com(0xc4);                 //写地址 第二行
  167.                         wr_dat('0'+data1[3]);
  168.                         AD_val1= GetAD0832(0); //进行A/D转换
  169.             if(AD_val1!=0)
  170.                         {
  171.                         disdata[1]=AD_val1/100+0x30;//?位数
  172.                         disdata[2]=AD_val1%100/10+0x30;//?位数
  173.                         disdata[3]=AD_val1%10/1+0x30;//?数位
  174.             delay(5);
  175.                         wr_com(0x81);
  176.             wr_dat(disdata[1]);//显示小数点
  177.                         delay(5);
  178.                         wr_com(0x82);                 //写地址 第一行
  179.                         wr_dat(disdata[2])         ;
  180.                         delay(5); //延时1ms
  181.                         wr_com(0x83);                 //写地址 第一行
  182.                         wr_dat(disdata[3])         ;
  183.                          }
  184.            AD_val2= GetAD0832(1); //进行A/D转换
  185.            if(AD_val2!=0)
  186.                         {
  187.                         disdata[4]=AD_val2/100+0x30;//?位数
  188.                         disdata[5]=AD_val2%100/10+0x30;//?位数
  189.                         disdata[6]=AD_val2%10/1+0x30;//?数位
  190.             delay(5);
  191.                         wr_com(0x85);
  192.             wr_dat(disdata[4]);//显示小数点
  193.                         delay(5);
  194.                         wr_com(0x86);                 //写地址 第一行
  195.                         wr_dat(disdata[5])         ;
  196.                         delay(5); //延时1ms
  197.                         wr_com(0x87);                 //写地址 第一行
  198.                         wr_dat(disdata[6])         ;

  199.                           }
  200.        }
  201. }
复制代码
回复

使用道具 举报

ID:303383 发表于 2018-11-26 23:28 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

ID:279632 发表于 2018-11-27 16:28 | 显示全部楼层
兄弟  不管是LCD屏还是数码管都只是显示工具  你让他显示什么他就显示什么   只要把lcd要打印的参数,赋给数码管就OK了
回复

使用道具 举报

ID:358930 发表于 2018-11-27 18:29 来自手机 | 显示全部楼层
wangwenhao 发表于 2018-11-27 16:28
兄弟  不管是LCD屏还是数码管都只是显示工具  你让他显示什么他就显示什么   只要把lcd要打印的参数,赋给 ...

我之前总是把数码管改成液晶屏,你的要求是反的。但原理一下,我开始学的时候总是喜欢一个程序弄个几种显示。回到你的问题:1删除你的全部LCD定意和驱动程序为的是给数码管让出IO口,移植数码管显示程序和段位选定意,把数据从新赋给数码管的显示。我的多样显示文件图片。每次找起方便。见图
15433144874840.587751767891784.jpg
回复

使用道具 举报

ID:412814 发表于 2018-11-29 06:55 | 显示全部楼层
冰冰洁洁 发表于 2018-11-27 18:29
我之前总是把数码管改成液晶屏,你的要求是反的。但原理一下,我开始学的时候总是喜欢一个程序弄个几种显 ...

谢谢,受教了。以后多请教。
回复

使用道具 举报

ID:412814 发表于 2018-11-29 06:55 | 显示全部楼层
小猫猫爱吃鱼 发表于 2018-11-26 23:28
你这个呀,液晶改成数码管显示,等同于重新写;
只有 GetAD0832(uint Channel) 函数可以用。。。

谢谢,受教了。以后多请教。
回复

使用道具 举报

ID:412814 发表于 2018-11-29 06:56 | 显示全部楼层
wangwenhao 发表于 2018-11-27 16:28
兄弟  不管是LCD屏还是数码管都只是显示工具  你让他显示什么他就显示什么   只要把lcd要打印的参数,赋给 ...

谢谢,受教了。以后多请教。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表