/*******************************************************************************

* 实验名                  :温度+时钟显示

* 使用的IO             :

* 实验效果       :1602显示温度

*        注意                                         :

*******************************************************************************/

#include

#include"lcd.h"

#include"ds1302.h"

#include"temp.h"

sbit K1=P3^1;

sbit K2=P3^0;

sbit K3=P3^2;

sbit K4=P3^3;

uchar CNCHAR[6] = "摄氏度";

void Int0Configuration();

void LcdDisplay(int);

void UsartConfiguration();

unsigned char SetState,SetPlace;

void Delay10ms(void);   //误差 0us

void LcdDisplay1();

/*******************************************************************************

* 函数名         : main

* 函数功能                   : 主函数

* 输入           : 无

* 输出                  : 无

*******************************************************************************/

void main()

{

unsigned char i;

Int0Configuration();

UsartConfiguration();

LcdInit();                         //初始化LCD1602

LcdWriteCom(0x80+0x4f);        //写地址 80表示初始地址

LcdWriteData('C');

Ds1302Init();

while(1)

{

if(SetState==0)

{

Ds1302ReadTime();

}

else

{

if(K1==0)                //检测按键K1是否按下

{

Delay10ms();        //消除抖动

if(K1==0)

{

SetPlace++;

if(SetPlace>=7)

SetPlace=0;

}

while((i<50)&&(K1==0))         //检测按键是否松开

{

Delay10ms();

i++;

}

i=0;

}

if(K2==0)                //检测按键K2是否按下

{

Delay10ms();        //消除抖动

if(K2==0)

{

TIME[SetPlace]++;

if((TIME[SetPlace]&0x0f)>9)                                         //换成BCD码。

{

TIME[SetPlace]=TIME[SetPlace]+6;

}

if((TIME[SetPlace]>=0x60)&&(SetPlace<2))                //分秒只能到59

{

TIME[SetPlace]=0;

}

if((TIME[SetPlace]>=0x24)&&(SetPlace==2))                //小时只能到23

{

TIME[SetPlace]=0;

}

if((TIME[SetPlace]>=0x32)&&(SetPlace==3))                //日只能到31

{

TIME[SetPlace]=0;

}

if((TIME[SetPlace]>=0x13)&&(SetPlace==4))                //月只能到12

{

TIME[SetPlace]=0;

}

if((TIME[SetPlace]>=0x8)&&(SetPlace==5))                //周只能到7

{

TIME[SetPlace]=1;

}

//                                        if(SetPlace==5)                //月只能到12

//                                        {

//                                                TIME[SetPlace]=;

//                                        }

}

while((i<50)&&(K2==0))         //检测按键是否松开

{

Delay10ms();

i++;

}

i=0;

}

}

LcdDisplay1();

LcdDisplay(Ds18b20ReadTemp());        //                Delay1ms(1000);//1s钟刷一次

}

}

/*******************************************************************************

* 函数名         : LcdDisplay()

* 函数功能                   : LCD显示读取到的温度

* 输入           : v

* 输出                  : 无

*******************************************************************************/

void LcdDisplay(int temp)          //lcd显示

{

unsigned char i, datas[] = {0, 0, 0, 0, 0}; //定义数组

float tp;

if(temp< 0)                                //当温度值为负数

{

LcdWriteCom(0x80+0x49);                //写地址 80表示初始地址

SBUF='-';//将接收到的数据放入到发送寄存器

while(!TI);                                 //等待发送数据完成

TI=0;                                                 //清除发送完成标志位

LcdWriteData('-');                  //显示负

//因为读取的温度是实际温度的补码,所以减1,再取反求出原码

temp=temp-1;

temp=~temp;

tp=temp;

temp=tp*0.0625*100+0.5;

//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点

//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就

//算由?.5,还是在小数点后面。

}

else

{

LcdWriteCom(0x80+0x49);                //写地址 80表示初始地址

LcdWriteData('+');                 //显示正

SBUF='+';//将接收到的数据放入到发送寄存器

while(!TI);                                 //等待发送数据完成

TI=0;                                                 //清除发送完成标志位

tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量

//如果温度是正的那么,那么正数的原码就是补码它本身

temp=tp*0.0625*100+0.5;

//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点

//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就

//算加上0.5,还是在小数点后面。

}

datas[0] = temp / 10000;

datas[1] = temp % 10000 / 1000;

datas[2] = temp % 1000 / 100;

datas[3] = temp % 100 / 10;

datas[4] = temp % 10;

LcdWriteCom(0x80+0x4a);                 //写地址 80表示初始地址

LcdWriteData('0'+datas[1]); //十位

SBUF = '0'+datas[1];//将接收到的数据放入到发送寄存器

while (!TI);                                 //等待发送数据完成

TI = 0;

LcdWriteCom(0x80+0x4b);                //写地址 80表示初始地址

LcdWriteData('0'+datas[2]); //个位

SBUF = '0'+datas[2];//将接收到的数据放入到发送寄存器

while (!TI);                                 //等待发送数据完成

TI = 0;

LcdWriteCom(0x80+0x4c);                //写地址 80表示初始地址

LcdWriteData('.');                 //显示 ‘.’

SBUF = '.';//将接收到的数据放入到发送寄存器

while (!TI);                                 //等待发送数据完成

TI = 0;

LcdWriteCom(0x80+0x4d);                 //写地址 80表示初始地址

LcdWriteData('0'+datas[3]); //显示小数点

SBUF = '0'+datas[3];//将接收到的数据放入到发送寄存器

while (!TI);                                 //等待发送数据完成

TI = 0;

LcdWriteCom(0x80+0x4e);                 //写地址 80表示初始地址

LcdWriteData('0'+datas[4]); //显示小数点

SBUF = '0'+datas[4];//将接收到的数据放入到发送寄存器

while (!TI);                                 //等待发送数据完成

TI = 0;

for(i=0; i<6; i++)

{

SBUF = CNCHAR[i];//将接收到的数据放入到发送寄存器

while (!TI);                                 //等待发送数据完成

TI = 0;

}

}

void LcdDisplay1()

{

LcdWriteCom(0x80+0X40);

LcdWriteData('0'+TIME[2]/16);                                //时

LcdWriteData('0'+(TIME[2]&0x0f));Delay10ms();

LcdWriteData('-');

LcdWriteData('0'+TIME[1]/16);                                //分

LcdWriteData('0'+(TIME[1]&0x0f));Delay10ms();

LcdWriteData('-');

LcdWriteData('0'+TIME[0]/16);                                //秒

LcdWriteData('0'+(TIME[0]&0x0f));Delay10ms();

LcdWriteCom(0x80);

LcdWriteData('2');

LcdWriteData('0');

LcdWriteData('0'+TIME[6]/16);                        //年

LcdWriteData('0'+(TIME[6]&0x0f));

LcdWriteData('-');

LcdWriteData('0'+TIME[4]/16);                        //月

LcdWriteData('0'+(TIME[4]&0x0f));

LcdWriteData('-');

LcdWriteData('0'+TIME[3]/16);                        //日

LcdWriteData('0'+(TIME[3]&0x0f));

LcdWriteCom(0x8D);

LcdWriteData('0'+(TIME[5]&0x07));        //星期

}

/*******************************************************************************

* 函数名         : Int0Configuration()

* 函数功能                   : 配置外部中断0

* 输入           : 无

* 输出                  : 无

*******************************************************************************/

void Int0Configuration()

{

//设置INT0

IT0=1;//跳变沿出发方式(下降沿)

EX0=1;//打开INT0的中断允许。

EA=1;//打开总中断

}

/*******************************************************************************

* 函数名         : Int0()

* 函数功能                   : 外部中断0 中断函数

* 输入           : 无

* 输出                  : 无

*******************************************************************************/

void Int0() interrupt 0

{

Delay10ms();

if(K3==0)

{

SetState=~SetState;

SetPlace=0;

Ds1302Init();

}

}

/*******************************************************************************

* 函数名         : Delay10ms

* 函数功能                   : 延时函数,延时10ms

* 输入           : 无

* 输出                  : 无

*******************************************************************************/

void Delay10ms(void)   //误差 0us

{

unsigned char a,b,c;

for(c=1;c>0;c--)

for(b=38;b>0;b--)

for(a=130;a>0;a--);

}

/*******************************************************************************

* 函 数 名         :UsartConfiguration()

* 函数功能                   :设置串口

* 输    入         : 无

* 输    出         : 无

*******************************************************************************/

void UsartConfiguration()

{

SCON=0X50;                        //设置为工作方式1

TMOD=0X20;                        //设置计数器工作方式2

PCON=0X80;                        //波特率加倍

TH1=0XF3;                                //计数器初始值设置,注意波特率是4800的

TL1=0XF3;

//        ES=1;                                                //打开接收中断

//        EA=1;                                                //打开总中断

TR1=1;                                        //打开计数器

}

单片机c语言实现光标闪烁,求解决单片机LCD1602光标闪烁问题相关推荐

  1. c语言控制led闪烁次数,单片机C语言程序设计之定时器控制4个LED滚动闪烁

    描述 通过单片机课程设计,熟练掌握C语言的编程方法,将理论联系到实践中去,提高我们的动脑和动手的能力.通过定时器控制4只LED滚动闪烁系统的设计,掌握定时/计数器的使用方法,和简单程序的编写,最终提高 ...

  2. stc15系列c语言pwm编程,STC单片机C语言程序设计 第25章 STC单片机增强型PWM原理及实现.docx...

    STC单片机C语言程序设计 第25章 STC单片机增强型PWM原理及实现 STC单片机增强型PWM发生器原理及应用主 讲:何宾Email:hebin@mail.buct.edu.cn2016.03增强 ...

  3. 8051单片机c语言编程模板,完美的8051单片机C语言编程模板.doc

    完美的8051单片机C语言编程模板.doc <8051单片机C语言编程模板> [程序开始处的程序说明] /***************************************** ...

  4. 单片机c语言字符发送函数,求1602显示自定义字符 ℃ 的C语言程序,在写入和读函数多点说明,因为是初学者,...

    #include __CONFIG(0X1832); //芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡 #define rs RA1 #define rw RA2 ...

  5. 单片机c语言彩灯依次点亮不灭,单片机说课(点亮彩灯).ppt

    <单片机应用技术>(中国劳动社会保障出版社),课题二点亮彩灯,,教材贯彻以任务驱动促进以学生为中心的教学方针,把激发学生的学习兴趣,培养学生思考问题.解决问题能力作为教学的根本目标.从实际 ...

  6. 单片机c语言编译软件6,eUIDE下载-单片机c语言编译器 v1.07.32.23 官方版 - 安下载...

    eUIDE是一款专业的单片机c语言编译器,EM78系列集成开发环境是面向项目的ELAN EM78系列微控制器的开发工具,它包括UICE开发在线仿真器和eUIDE软件工具:eUIDE是基于PC端的UIC ...

  7. 单片机c语言程序设计实训报告,(整理)单片机C语言程序设计实训100例.doc

    (整理)单片机C语言程序设计实训100例.doc .单片机C语言程序设计实训100例基于8051Proteus仿真案例第 01 篇 基础程序设计01闪烁的LED/* 名称闪烁的LED说明LED按设定的 ...

  8. 单片机c语言三种经典程序结构,单片机C语言程序的结构和设计精选.docx

    单片机C语言程序的结构和设计精选 实验五 单片机C语言程序的结构和设计一.实验目的1. 掌握单片机C语言的程序结构:2. 掌握单片机C语言程序的编写和调试方法:3. 掌握MSP430FG2553基本I ...

  9. 单片机c语言100例 的案例,51单片机C语言100个实例 [推荐下载】

    51单片机c语言100例 ,墙裂推荐下载 附上目录 ************************************************************函数的使用和熟悉****** ...

最新文章

  1. 数学建模python和java_参加数学建模用 MATLAB,还是 Python?
  2. Asp.Net MVC 4 Web API 中的安全认证-使用OAuth
  3. Redis-15Redis基础配置文件
  4. kylin调优,项目中错误总结,知识点总结,kylin jdbc driver + 数据库连接池druid + Mybatis项目中的整合,shell脚本执行kylin restapi 案例
  5. RocketMQ专栏
  6. CentOS7.2 忘记root密码解决
  7. mysql sqlexception_c-很奇怪-mysql的sql :: SQLException未被其类型捕...
  8. TCP选项:TCP_NODELAY和TCP_CORK
  9. 软件开源是如何赚钱?
  10. delphi接口带上请求头是什么意思_python接口自动化(二十)--token登录(详解)...
  11. work summary(4)
  12. jQuery弹出窗口完整代码
  13. BZOJ4898/5367 Apio2017商旅(分数规划+floyd)
  14. ubuntu 14.04中安装Jenkins
  15. DCMTK各模块说明
  16. macsv服务器状态,macsv操作员站下装过程及服务器下装过程备课讲稿.pdf
  17. 阿里云建站的基本流程
  18. 大一作业HTML网页作业 HTML CSS制作二十四节气网页
  19. ecu故障现象_汽车电脑ECU的故障诊断检修方法9种
  20. Nvidia Summer Camp Day34 个人心得

热门文章

  1. 淘宝低价,品牌方如何平台投诉
  2. 爬虫日记(10):爬取国外名人名言
  3. 关于彩虹字体和渐变字体
  4. 与面试官的终局之战:精选Android面试题,再也不怕面试官血虐我了
  5. 翻译小窍门-QQ农场 偷菜歌
  6. 【ACWing】665. 倍数
  7. 【颜纠日记】教你如何保存AE项目制作后一键保存所有文件到独立文件夹。
  8. 微信支付与支付宝钱包的关键性差异
  9. YY博客园UML用例图-活动图-状态图之博客模块
  10. HTTPS与P=NP问题卍解(演讲)