单片机c语言实现光标闪烁,求解决单片机LCD1602光标闪烁问题
/*******************************************************************************
* 实验名 :温度+时钟显示
* 使用的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光标闪烁问题相关推荐
- c语言控制led闪烁次数,单片机C语言程序设计之定时器控制4个LED滚动闪烁
描述 通过单片机课程设计,熟练掌握C语言的编程方法,将理论联系到实践中去,提高我们的动脑和动手的能力.通过定时器控制4只LED滚动闪烁系统的设计,掌握定时/计数器的使用方法,和简单程序的编写,最终提高 ...
- stc15系列c语言pwm编程,STC单片机C语言程序设计 第25章 STC单片机增强型PWM原理及实现.docx...
STC单片机C语言程序设计 第25章 STC单片机增强型PWM原理及实现 STC单片机增强型PWM发生器原理及应用主 讲:何宾Email:hebin@mail.buct.edu.cn2016.03增强 ...
- 8051单片机c语言编程模板,完美的8051单片机C语言编程模板.doc
完美的8051单片机C语言编程模板.doc <8051单片机C语言编程模板> [程序开始处的程序说明] /***************************************** ...
- 单片机c语言字符发送函数,求1602显示自定义字符 ℃ 的C语言程序,在写入和读函数多点说明,因为是初学者,...
#include __CONFIG(0X1832); //芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡 #define rs RA1 #define rw RA2 ...
- 单片机c语言彩灯依次点亮不灭,单片机说课(点亮彩灯).ppt
<单片机应用技术>(中国劳动社会保障出版社),课题二点亮彩灯,,教材贯彻以任务驱动促进以学生为中心的教学方针,把激发学生的学习兴趣,培养学生思考问题.解决问题能力作为教学的根本目标.从实际 ...
- 单片机c语言编译软件6,eUIDE下载-单片机c语言编译器 v1.07.32.23 官方版 - 安下载...
eUIDE是一款专业的单片机c语言编译器,EM78系列集成开发环境是面向项目的ELAN EM78系列微控制器的开发工具,它包括UICE开发在线仿真器和eUIDE软件工具:eUIDE是基于PC端的UIC ...
- 单片机c语言程序设计实训报告,(整理)单片机C语言程序设计实训100例.doc
(整理)单片机C语言程序设计实训100例.doc .单片机C语言程序设计实训100例基于8051Proteus仿真案例第 01 篇 基础程序设计01闪烁的LED/* 名称闪烁的LED说明LED按设定的 ...
- 单片机c语言三种经典程序结构,单片机C语言程序的结构和设计精选.docx
单片机C语言程序的结构和设计精选 实验五 单片机C语言程序的结构和设计一.实验目的1. 掌握单片机C语言的程序结构:2. 掌握单片机C语言程序的编写和调试方法:3. 掌握MSP430FG2553基本I ...
- 单片机c语言100例 的案例,51单片机C语言100个实例 [推荐下载】
51单片机c语言100例 ,墙裂推荐下载 附上目录 ************************************************************函数的使用和熟悉****** ...
最新文章
- 数据结构----内存分配问题
- linux命令crontab
- SharePoint 2016文档库所在数据库表的说明(文档库数据库)
- mysql 内联函数_C++之内联函数
- css 圆点样式 优惠券样子
- Docker 镜像-管理-导入-导出
- 锁相环环路滤波器计算公式_锁相环和射频振荡器简介
- arma模型 java_ARMA模型与ARIMA模型java实现例程
- (基础)单个字符的大小写转换
- java的pdf转永中_永中pdf转word下载|
- 什么样的条件能够满足游戏音效制作
- 关于未知的USB设备(设备描述符请求失败)的解决方法
- 大学计算机课能旷课吗,计算机课旷课检讨书
- 群星闪耀 视觉科技史上引领我们前进的不朽瞬间
- matlab二次函数拟合,【长见识】matlab的二次函数拟合
- 建设一个网站需要多少钱?
- 如何给边框添加阴影效果
- Ubuntu 访问移动硬盘/U盘时弹出“An operation is pending“
- 手把手带你领略graphql的魅力
- Diskman 重建分区表 (小莫)
热门文章
- 实战 MDT 2012(二)---制作模板机
- 初级开发:我还在Android路上披荆斩棘,转眼就被大厂的程序员凡尔赛了
- VS2010之vb.net:细节决定成败
- bzoj 4872 [Shoi2017]分手是祝愿
- springboot+vue图书馆座位管理系统java_x3qjv
- 非常实用的QQ离线留言(搞笑)
- 都在强力进阶学习 springboot 实战派文档
- 什么是网络电话?网络电话软件哪家强?
- 封装函数insertBefore
- 标准成本估算时当遇到无BOM、或无Routing、或者下级物料为外购键但是价格为0但无明显报错或警告的问题