温度计(LCD显示)

/*

 * 123.c
 *
 *  Created on: 2013-6-3
 *      Author: Administrator
 */
#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
typedef bit BOOL;

sbit DQ = P3 ^ 7;

uchar Temp_Value[] = { 0x00, 0x00 };
uchar Display_Digit[] = { 0, 0, 0, 0 };

sbit LCD_RW = P2 ^ 5; //写数据?
sbit LCD_RS = P2 ^ 6;
sbit LCD_EP = P2 ^ 7; //使能?
uchar num;
int temper = 0;
int CurrentT = 0;
bit flag;

void delay(uchar t) {
    while (t--)
        ;
}
/*
 void delay2(uint z)
 {
 uint x,y;
 for(x=z;x>0;x--)
 for(y=110;y>0;y--){;}
 }
 */
void init_ds18b20() {
    //    uchar n;
DQ = 1;
    _nop_();
    DQ = 0;
    delay(80);
    _nop_();
    DQ = 1;
    delay(14);
    _nop_();
    _nop_();
    _nop_();

    if (DQ == 0)
        flag = 1; //detect 1820 success!
    else
        flag = 0; //detect 1820 fail!
    delay(20); //20
    _nop_();
    _nop_();
    DQ = 1;
}

void write_byte(uchar dat) {
    uchar i;
    for (i = 0; i < 8; i++) {
        DQ = 0;
        _nop_();
        DQ = dat & 0x01; //从最低位开始写
        delay(3);
        _nop_();
        _nop_();
        DQ = 1;
        dat >>= 1;
    }
    //    delay(4);
}

uchar read_byte() {
    uchar i, value = 0;
    for (i = 0; i < 8; i++) {
        DQ = 0;
        value >>= 1;
        DQ = 1;
        if (DQ)
            value |= 0x80;
        delay(2);
        _nop_();
    }
    return value;
}

int readtemperature() {
    uchar templ, temph;
    //    int temp;
    init_ds18b20();
    write_byte(0xcc); //跳过ROM
    write_byte(0x44); //启动温度测量
    delay(300);

    init_ds18b20();
    write_byte(0xcc);
    write_byte(0xbe);
    //    Temp_Value[0] = ReadOneByte();
    //    Temp_Value[1] = ReadOneByte();
    templ = read_byte();
    temph = read_byte();
    //CurrentT = ((templ&0xf0)>>4) | ((temph&0x07)<<4);
    CurrentT = temph*256 +templ;
    CurrentT = CurrentT * 62.5;
    return CurrentT;
}

/****************侧忙函数************************/
BOOL lcd_bz() {
    BOOL result;
    LCD_RS = 0;
    LCD_RW = 1;
    LCD_EP = 1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    result = (BOOL) (P0 & 0x80); //检测P0最高位是否为1
    LCD_EP = 0;
    return result;
}
/****************写命令函数************************/
void write_com(uchar cmd) {
    while (lcd_bz())
        ;
    LCD_RS = 0;
    LCD_RW = 0;
    //    LCD_EP = 0;
    _nop_();
    _nop_();
    P0 = cmd;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    LCD_EP = 1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    LCD_EP = 0;
}

void lcd_pos(uchar pos) {
    write_com(pos | 0x80);
}

/****************写数据函数************************/
void write_data(uchar dat) { //写入字符显示数据到LCD
    while (lcd_bz())
        ;
    LCD_RS = 1;
    LCD_RW = 0;
    //    LCD_EP = 0;
    _nop_();
    _nop_();
    P0 = dat;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    LCD_EP = 1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    LCD_EP = 0;
}

void init() {
    //    dula=0;
    //    wela=0;
    LCD_EP = 0;
    write_com(0x38); //16*2显示
    write_com(0x0e); //开显示;显示光标,光标不闪烁
    write_com(0x06); //光标自动增加111
    write_com(0x01); //显示清屏
    //    write_com(0x80+0x10);
}

void main() {
    init();
    while (1) {
        temper = readtemperature();
        lcd_pos(0);
        if (temper < 0) {
            write_data('-');
            temper = 0 - temper;
        } else
            write_data('+');

        lcd_pos(1);
        write_data((temper) / 10000 + 0x30);

        lcd_pos(2);
        write_data(((temper) % 10000 )/ 1000 + 0x30);

        lcd_pos(3);
        write_data('.');

        lcd_pos(4);
        write_data(((temper) % 10000 % 1000 )/ 100 + 0x30);

        lcd_pos(5);
        write_data(((temper) %10000 %1000 % 100 )/10 + 0x30);
        lcd_pos(6);
        write_data((temper) %10000 %1000 % 100 % 10 + 0x30);
        lcd_pos(7);
        write_data(0xdf);
        lcd_pos(8);
        write_data('C');

    }

}

时间: 2024-10-02 16:53:14

温度计(LCD显示)的相关文章

logo-调试 LCD 的时候,发现 LCD 显示出现两个画面,完全一样

问题描述 调试 LCD 的时候,发现 LCD 显示出现两个画面,完全一样 调试 LCD 的时候,发现 LCD 显示出现两个画面,完全一样,看起来是把 logo 压缩一半后同时刷出两个来,请问这是什么问题?搞死我了,求各位大牛支招的,感 解决方案 着急 !!!请大神帮忙!! 解决方案二: 或者直接联系我,13692121902 解决方案三: 出现这种情况肯定是你程序的问题了.首先,你比较一下你的图片大小和LCD屏的大小.第二检查程序中图片显示这个函数,看是否当图片无法填充满LCD时,会不会在原图后

lcd显示-STM32下lcd12864一个字节显示程序

问题描述 STM32下lcd12864一个字节显示程序 lcd地址每行是8个字,16个字节,显示数据时首地址只能是字的整数倍,比如我只想在第二个字节处写下一个字母,但地址就定位不到第二个字节处,只能是1,3,5--字节处,也就是每个字的首地址,求大神指点怎么定位到每一个字节的首地址处 解决方案 http://wenku.baidu.com/link?url=wviwTAPWlFSel0d7WZcfvVdRhg3GHpUI1VS2a7f618l-NqjKx9kTBrMJoaZA7dcKvJKR-S

嵌入式 lcd显示-s3c6410 LCD液晶屏显示 上下左右颠倒

问题描述 s3c6410 LCD液晶屏显示 上下左右颠倒 两个除了尺寸以外 参数一样的屏 一块正常显示一块上下左右颠倒 问题出在哪? 解决方案 那个...是上右下左好不好

嵌入式Linux基于framebuffer的jpeg格式本地LCD屏显示

在基于Linux的视频监控采集系统中,摄像头采集到的一帧视频图像数据一般都是经过硬件自动压缩成jpeg格式的,然后再保存到摄像头设备的缓冲区.如果要把采集到的jpeg格式显示在本地LCD屏上,由于我们的Linux系统没有移植任何GUI系统,就要考虑以下方面:1. 将jpeg格式解压缩为位图格式,也就是jpeg解码. 2. 将解码出来的位图格式输出到本地的LCD屏上. 在Linux系统下是通过写入帧缓冲(framebuffer)来实现的. 3. framebuffer相当于为LCD设备提供一个统一

移植-全志A33平台如何让LCD竖屏显示?

问题描述 全志A33平台如何让LCD竖屏显示? 最近在做安卓的设备驱动移植,发现LCD显示怎么都不能让其变成竖向UI,根据文档中在 astar_dvk.mk文件中添加ro.sf.rotation = 270仍然不成功,尝试了很多办法都不能让其变成 竖屏显示,在此求助各位万能的网友,感谢回答

嵌入式Linux中基于framebuffer设备的jpeg格式在本地LCD屏显示

在基于Linux的视频监控采集系统中,摄像头采集到的一帧视频图像数据一般都是经过硬件自动压缩成jpeg格式的,然后再保存到摄像头设备的缓冲区.如果要把采集到的jpeg格式显示在本地LCD屏上,由于我们的Linux系统没有移植任何GUI系统,就要考虑以下方面: 1. 将jpeg格式解压缩为位图格式,也就是jpeg解码. 2. 将解码出来的位图格式输出到本地的LCD屏上. 在Linux系统下是通过写入帧缓冲(framebuffer)来实现的. 3. framebuffer相当于为LCD设备提供一个统

Linux下LCD 10分钟自动关屏的问题总结

Linux下的LCD驱动默认10分钟后会自动关闭屏幕,我们可以修改一下代码让其不自动关屏 在有一个 drivers/char/vt.c 文件其中有一个变量(blankinterval)可以设置它来修改自动关屏的时间,也可以在函数(blank_screen_t)开头直接返回,这样就永远不会关屏了   在用LCD显示的时候,发现10分钟LCD就不再工作了.确实,Linux下有一个参数blankinterval的值就是10*60*Hz. 它决定了LCD只显示10分钟,然后LCD控制器就被关掉了. 具体

液晶显示器背光类型及优缺点(LCD、CCFL、LED)

液晶背光显示原理 液晶不同于等离子的最大区别就是液晶必须依靠被动光源,而等离子电视属于主动发光显示设备.目前市场上主流的液晶背光技术包括LED(发光二极管)和CCFL(冷阴极荧光 灯)两类. 冷阴极荧光灯管(Cold Cathode Fluorescent Lamp;CCFL) 传统的液晶显示器都是采用CCFL(冷阴极荧光灯管)背光.CCFL的背光设计主要有两种:"侧入式"与"直落式",不过侧入式因光导设计使得光折损率较高,进而让背光亮度受限,面板尺寸越大时亮度就越

如何保养和维护LCD显示器?

  1.避免不必要的振动 LCD可以算是最敏感的电气设备了,LCD中含有很多玻璃的和灵敏的电气元件,以至于屏幕十分的脆弱,要尽量避免强烈的冲击和振动,强烈的冲击极易导致LCD屏幕以及CFL单元的损坏.注意不要对LCD显示表面施加压力,在屏幕前指指点点的坏习惯一定要纠正. 2.不要尝试拆卸LCD 有一个规则就是,永远也不要拆卸LCD.即使在关闭了很长时间以后,背景照明组件中的CFL换流器依旧可能带有大约1000V的高压,这种高压能够导致严重的人身伤害.所以永远也不要企图拆卸或者更改LCD显示屏,以