基于AT89C52单片机的1602液晶显示程序
基于AT89C52单片机的1602液晶显示程序
1602液晶显示
1.keyscan.c
2.boardinit.c
3.delay.c
4.clock.c
5.74hc595.c
6.1602led.c
#include<reg52.h>
#include "boardinit.h"
#include "keyscan.h"
#include "1602led.h"
#include "delay.h"
#include "74hc595.h"
#include "clock.h"#define uchar unsigned char
#define uint unsigned intuchar time=0;
uchar shi,fen,miao;
void write_data_160238(uchar data_1602);
void main()
{TMOD=0x10;TH1=(65536-5000)/256;TL1=(65536-5000)%256;ET1=1;TR1=1;EA=1; boardinit(); //板卡初始化 lcdinit_1602(); //1602初始化Disp_1602(1,1," 2019-05-20 ",16);Disp_1602(1,2," 00:00:00 ",16);while(1){ keyscan(); clock();}}
void zd() interrupt 3
{TH1=(65536-50000)/256;TL1=(65536-50000)%256;time++;}
##### keyscan.c#include <reg52.h>
#include "keyscan.h"
#include "74hc595.h"
#include "1602led.h"
#include "delay.h"sbit s1 = P3^7; //设置按键
sbit s2 = P3^4; //时间- 按键
sbit s3 = P3^5; //时间+ 按键
sbit s4 = P3^0;uchar num,moshi;void keyscan()
{ s4=0;if(s1==0){delay(1);if(s1==0){while(!s1);moshi++;if(moshi==1){write_order_1602(0x80+0x40+0x0b);write_order_1602(0x0f);TR1=0;}if(moshi==2){write_order_1602(0x0f);write_order_1602(0x80+0x40+0x08); TR1=0;}if(moshi==3){write_order_1602(0x0f);write_order_1602(0x80+0x40+0x05); TR1=0;} if(moshi==4){write_order_1602(0x0c);TR1=1;if(moshi==4){moshi=0;}} }} if (moshi==1){ if(s2==0){delay(1);if(s2==0){while(!s2);miao++;if(miao==60){miao=0;}write_twoline_1602(11,miao);write_order_1602(0x80+0x40+0x0b);} }if(s3==0){delay(1);if(s3==0){while(!s3);miao--;if(miao==(-1)){miao=59;}write_twoline_1602(11,miao);write_order_1602(0x80+0x40+0x0b); } }} if (moshi==2){ if(s2==0){delay(1);if(s2==0){while(!s2);fen++;if(fen==60){fen=0;}write_twoline_1602(8,fen);write_order_1602(0x80+0x40+0x08); } }if(s3==0){delay(1);if(s3==0){while(!s3);fen--;if(fen==(-1)){fen=59;}write_twoline_1602(8,fen);write_order_1602(0x80+0x40+0x08); } }} if (moshi==3){ if(s2==0){delay(5);if(s2==0){while(!s2);shi++;if(shi==24){shi=0;}write_twoline_1602(5,shi);write_order_1602(0x80+0x40+0x05); } }if(s3==0){delay(1);if(s3==0){while(!s3);shi--;if(shi==(-1)){shi=24;}write_twoline_1602(5,shi);write_order_1602(0x80+0x40+0x05); } }}
}##### boardinit.c
/*晶振11.0592MHz
*/#include <reg52.h>
#include "74hc595.h"
#include "boardinit.h"sbit duanxuan=P2^5; // 数码管,的段选使能,1 通 0关
sbit weixuan=P2^6; // 数码管,的位选使能,1 通 0关void boardinit()
{duanxuan=1; // 数码管,的段选使能,1 通 0关weixuan=1; //数码管,的位选使能,1 通 0关P0=0x00; //P0口送清零,关LED数码管的必要数据准备。duanxuan=0; // 数码管,的段选使能,1 通 0关weixuan=0; //数码管,的位选使能,1 通 0关write_byte_74hc595(0x40); //选通8位发光二极管控制芯片u6(74HC573)锁存器的使能端 P1=0xff; //P1口送全1,关8位发光二极管的必要数据准备。//写完此句理论上8个发光二级管都会熄灭,因74HC595数据口复用了P1.0故P1.0的二极管可能不能被熄灭。write_byte_74hc595(0x00); //关闭8位发光二极管控制芯片u6(74HC573)锁存器的使能端,把P1口数据保存(既关发光二极管)。
}##### delay.c
#include "delay.h"void delay(uint z)
{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);
}
/*
void delay_ds18b20(uint time)
{uint i,j;for(i=0;i<time;i++)for(j=0;j<1;j++);
}*/##### clock.c#include "1602led.h"
#include "clock.h"
void clock()
{
if(time==19){time=0; miao++;if(miao==60){miao=0;fen++;if(fen==60){fen=0;shi++;if(shi==24){shi=0;}write_twoline_1602(5,shi);}write_twoline_1602(8,fen);}write_twoline_1602(11,miao);}}##### 74hc595.c
#include <reg52.h>
#include "74hc595.h"
#include "delay.h"sbit data_595si =P1^0; //595数据输入口
sbit clk_595srck =P1^4; //595数据写进移位寄存器时钟输入口
sbit e_595rck =P2^3; //595移位寄存器,数据送输出的时钟void write_byte_74hc595(uchar dat) //74hc164芯片写一字节数据函数
{uchar i;e_595rck=0; //给595RCK低电平 for(i=0;i<8;i++){clk_595srck=0; //给595SRCK低电平 data_595si=(dat<<i)&0x80; //把我们要使用的数据进行左移处理,保证最终输出的数据与 我们 uchar dat 对应clk_595srck=1; //给595SRCK高电平 }e_595rck=1; //给595SRCK高电平,既把 DAT数据数据送到输出data_595si=1;//因该数据口和别的电路共用,因此当74hc595使用完后,置“1”解除冲突
} ##### 1602led.c
#include <reg52.h>
#include "1602led.h"
#include "delay.h"
#include "74hc595.h"sbit rs_1602=P2^5; //1602rs信号
sbit rw_1602=P2^6; //1602rw信号
sbit e=P2^4; /*
void write_zl(uchar zl)
{rs=0;P0=zl;delay(5);e=1;delay(5);e=0;
}void write_sj(uchar sj)
{rs=1;P0=sj;delay(5); e=1;delay(5);e=0;
} */
void write_order_1602(uchar order_data)
{e=0;rs_1602=0;P0=order_data;e=1;delay(1);e=0;
}void write_data_1602(uchar data_1602)
{ e=0;rs_1602=1;P0=data_1602;e=1;delay(1);e=0;
}//功能:按指定位置显示一串字符
//输入:列显示地址x_1602(取值范围1-16) 行显示地址y_1602(取值范围1-2), 指定字符串指针*p_1602,要显示的字符个数count_1602 (取值范围1-16)
// 子函数使用例子: Disp_1602(1,1," TEMP: . ",16); //在1602第一行第一列写16个字符,既字符串数据
void Disp_1602(unsigned char x_1602,unsigned char y_1602,unsigned char *p_1602,unsigned char count_1602)
{
unsigned char i; for(i=0;i<count_1602;i++){if (1 == y_1602) x_1602 |= 0x80; //当要显示第一行时地址码+0x80;else x_1602 |= 0xC0; //在第二行显示是地址码+0xC0;write_order_1602(x_1602-1);write_data_1602(*p_1602);x_1602++; p_1602++;}
} void write_oneline_1602(uchar add_1602,uint date_1602)
{uchar ge,shi;shi=date_1602/10;ge=date_1602%10;write_order_1602(0x80+add_1602-1);write_data_1602(0x30+shi);write_order_1602(0x80+add_1602);write_data_1602(0x30+ge); //在1602上写时间函数 即在1602第二行指定位置上写显示}void write_twoline_1602(uchar add_1602,uint date_1602)
{uchar shi,ge;shi=date_1602/10;ge=date_1602%10;write_order_1602(0x80+0x40+add_1602-1);write_data_1602(0x30+shi);write_order_1602(0x80+0x40+add_1602);write_data_1602(0x30+ge); //在1602上写时间函数 即在1602第二行指定位}void lcdinit_1602()
{rw_1602=0;e=0;write_byte_74hc595(0X02);//关流水灯使能 关蜂鸣器 光继电器 打开1602背光打开 write_order_1602(0x38); //液晶设置不判忙模式write_order_1602(0x0c); //开显示 不显示光标write_order_1602(0x06); //当写一个字符是,地址指针加 1write_order_1602(0x01); //显示清屏
}
这些项目的实现都通过本人亲自测试运行,也是自己学习中知识的一点一点积累,整理不易,希望能帮到大家,不足之处大家多多交流。
QQ:1678957377
邮箱:1678957377@qq.com
基于AT89C52单片机的1602液晶显示程序相关推荐
- c语言数字植物管理系统,基于AT89C52单片机的智能浇花系统(包含程序代码)
内容简介: 基于AT89C52单片机的智能浇花系统,毕业论文,共50页,18022字,附程序代码.实物图等. 摘要 伴随着经济的快速发展,人们的物质生活水平得到了极大的提高,生活质量越来越为人们关注. ...
- 基于AT89C52单片机的温湿度检测设计
点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87704704 源码获取 主要内容: ...
- 基于AT89C52单片机的数字电压表设计
一.系统组成及工作原理 1.1 系统组成 该基于AT89C52单片机的数字电压表设计由AT89C51单片机,ADC0809芯片(A/D转换器),LED数码管显示电路以及蜂鸣器电路等几部分组成.(用到得 ...
- 51单片机八人抢答器c语言,抢答器 - 基于51单片机 - 8人有程序较完整.doc
抢答器 - 基于51单片机 - 8人有程序较完整 课程题目: 基于单片机---8路抢答器 学 院: 职业技术学院 专 业: 电子信息科学与技术 年 级: 091 学 号: 0920020088 学生姓 ...
- 基于AT89C52单片机的温度检测报警设计
点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87708680?spm=1001.20 ...
- 基于AT89C52单片机的万年历设计与仿真
点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87777668?spm=1001.20 ...
- 基于AT89C52单片机的多功能万年历设计
点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87853675 源码获取 目 录 摘 ...
- 基于at89c52单片机温湿度c语言,基于AT89C52单片机的温度监控报警系统的设计
本系统由无线发射与接收模块.语音播报.温度采集.自动报警以及显示模块组成.实现功能:温度实时显示:可设定温度的上限和下限,当温度超过设定域值时发出声光报警信号:测量温度值可通过语音播报:通过射频模块完 ...
- 基于AT89C52单片机红绿灯设计程序
前言 本设计主要介绍十字路口红绿灯路口的单片机程序设计思路与电路设计 电路设计 交通灯的电路设计总体来说还是比较简单的,主要看设计者本人是否想要实现功能性比较多的智能交通灯,如果是简易的那只需要一个A ...
最新文章
- 无法上外网又需要同步Gradle
- 设计模式——建造者模式
- linux中没有semanagea安装包,如何使用semanage管理SELinux安全策略
- (归并排序 快排 堆)
- OpenCV-CL: OpenCL加速计算机视觉技术
- python3-字典中存储列表
- ActiveMQ官方文档翻译-内嵌消息中间件
- 【预测模型】基于布谷鸟算法优化最小二乘支持向量机lssvm实现预测matlab代码
- 使用Easy CHM制作java API chm文件
- Unity零基础到入门 ☀️| Unity下载安装---使用UnityHub下载各个版本的Unity(收藏)
- 数学建模优化模型简单例题_数学建模例题.doc
- 微信商城制作的步骤是什么?微信商城模板大全
- [刀塔自走棋] 一些数据
- matlab需要什么运行库,运行库是什么?常用软件运行库都有哪些?
- D. Captain Flint and Treasure
- macOS 10.14配置APUE环境
- 2022树莓派安装甜糖 步骤分享
- c语言中断函数作用,进一步理解中断函数
- 我打算去广东第一“鬼城”,买房安家
- 全站最详细的Python numpy 搭建全连接神经网络模型教程(理论计算+代码实现)(不止能预测手写数字数据,准确率93.21%)
热门文章
- 最右技术问答的一点个人见解
- java f5 f6 f7_ACCA考试F5+F6+F7科目技巧分析
- java vue 服务端渲染_vue ssr服务端渲染小白解惑
- web前端学习分享:JavaScript框架
- AB罗克韦尔的PLC标签MQTT协议JSON格式发布与订阅-智能网关设置
- Halcon学习——detect_mura_defects_blur.hdev
- HBase region 定位原理
- 51单片机——定时器/计数器
- 软件设计师---软件工程基础
- qt中文转字节_QT字符编码转换,可用于中文内码传输