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

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

* 使用的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. 数据结构----内存分配问题
  2. linux命令crontab
  3. SharePoint 2016文档库所在数据库表的说明(文档库数据库)
  4. mysql 内联函数_C++之内联函数
  5. css 圆点样式 优惠券样子
  6. Docker 镜像-管理-导入-导出
  7. 锁相环环路滤波器计算公式_锁相环和射频振荡器简介
  8. arma模型 java_ARMA模型与ARIMA模型java实现例程
  9. (基础)单个字符的大小写转换
  10. java的pdf转永中_永中pdf转word下载|
  11. 什么样的条件能够满足游戏音效制作
  12. 关于未知的USB设备(设备描述符请求失败)的解决方法
  13. 大学计算机课能旷课吗,计算机课旷课检讨书
  14. 群星闪耀 视觉科技史上引领我们前进的不朽瞬间
  15. matlab二次函数拟合,【长见识】matlab的二次函数拟合
  16. 建设一个网站需要多少钱?
  17. 如何给边框添加阴影效果
  18. Ubuntu 访问移动硬盘/U盘时弹出“An operation is pending“
  19. 手把手带你领略graphql的魅力
  20. Diskman 重建分区表 (小莫)

热门文章

  1. 实战 MDT 2012(二)---制作模板机
  2. 初级开发:我还在Android路上披荆斩棘,转眼就被大厂的程序员凡尔赛了
  3. VS2010之vb.net:细节决定成败
  4. bzoj 4872 [Shoi2017]分手是祝愿
  5. springboot+vue图书馆座位管理系统java_x3qjv
  6. 非常实用的QQ离线留言(搞笑)
  7. 都在强力进阶学习 springboot 实战派文档
  8. 什么是网络电话?网络电话软件哪家强?
  9. 封装函数insertBefore
  10. 标准成本估算时当遇到无BOM、或无Routing、或者下级物料为外购键但是价格为0但无明显报错或警告的问题