找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 174|回复: 0
打印 上一主题 下一主题
收起左侧

日期+时间+星期+图形温度显示+仿真+源程序 注释很详细

[复制链接]
跳转到指定楼层
楼主
附件中包括一个C文件,一个h文件加仿真文件等!
#include <reg51.h>                          // 包含51单片机寄存器/*定义
#include <intrins.h>                        // 包含_nop_()等内置函数
#include "DS18B20.h"                        // 导入DS18B20驱动头文件
//uchar show_flag = 0;                      // 时钟刷新标志位(注释未启用)
sbit DS1302_CLK = P1^0;                     // 定义DS1302时钟线引脚(P1.0)
sbit DS1302_DAT = P1^1;                     // 定义DS1302数据线引脚(P1.1)
sbit DS1302_RST = P1^2;                     // 定义DS1302复位线引脚(P1.2)
sbit LCD_RS = P2^0;                         // 定义LCD命令/数据选褚?P2.0)
sbit LCD_RW = P2^1;                         // 定义LCD读写控制引脚(P2.1)
sbit LCD_EN = P2^2;                         // 定义LCD使能引脚(P2.2)
#define LCD_DATA P0                         // 宏定义LCD数据口为P0口
sbit KEY_FUNC = P2^7;                       // 定义功能按键引脚(P2.7)
sbit KEY_ADD = P3^5;                        // 定义加按键引脚(P3.5)
sbit KEY_SUB = P3^6;                        // 定义减按键引脚(P3.6)
sbit KEY_CONFIRM = P3^7;                    // 定义确认按键引脚(P3.7)
unsigned char week;                         // 存储星期数据(0=日~6=六)
unsigned char key_flag = 0;                 // 按键模式标志(0=正常,1=年...5=分)
unsigned int idle_cnt = 0;                  // 空闲计数器(超时退出调节)
// ************************* 16×16点阵数据(以数字8为例,替换成你的点阵)*************************
unsigned char code bmp1616  [14] [64] = {
//---0-数码字体--
{0x00,0x00,0x7F,0xFC,0xBF,0xFA,0xDF,0xF6,0xEF,0xEE,0xF0,0x1E,0xF0,0x1E,0xF0,0x1E,
0xF0,0x1E,0xF0,0x1E,0xF0,0x1E,0xF0,0x1E,0xF0,0x1E,0xE0,0x0E,0xC0,0x06,0x80,0x02,
0x00,0x00,0x80,0x02,0xC0,0x06,0xE0,0x0E,0xF0,0x1E,0xF0,0x1E,0xF0,0x1E,0xF0,0x1E,
0xF0,0x1E,0xF0,0x1E,0xF0,0x1E,0xEF,0xEE,0xDF,0xF6,0xBF,0xFA,0x7F,0xFC,0x00,0x00},
//---1---


// ---1(整行左移2格,对应原右移需求纠正方向后)---
{0x00,0x00,0x00,0x00,0x00,0x40,0x00,0xC0,0x01,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,
0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x01,0xC0,0x00,0xC0,0x00,0x40,
0x00,0x00,0x00,0x40,0x00,0xC0,0x01,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,
0x03,0xC0,0x03,0xC0,0x03,0xC0,0x01,0xC0,0x00,0xC0,0x00,0x40,0x00,0x00,0x00,0x00},


//---2---
{0x00,0x00,0x7F,0xFC,0x3F,0xFA,0x1F,0xF6,0x0F,0xEE,0x00,0x1E,0x00,0x1E,0x00,0x1E,
0x00,0x1E,0x00,0x1E,0x00,0x1E,0x00,0x1E,0x00,0x1E,0x00,0x0E,0x1F,0xF6,0x3F,0xFA,
0x7F,0xFC,0xBF,0xF8,0xDF,0xF0,0xE0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,
0xF0,0x00,0xF0,0x00,0xF0,0x00,0xEF,0xE0,0xDF,0xF0,0xBF,0xF8,0x7F,0xFC,0x00,0x00},
//---3---
{0x00,0x00,0x7F,0xFC,0x3F,0xFA,0x1F,0xF6,0x0F,0xEE,0x00,0x1E,0x00,0x1E,0x00,0x1E,
0x00,0x1E,0x00,0x1E,0x00,0x1E,0x00,0x1E,0x00,0x1E,0x00,0x0E,0x1F,0xF6,0x3F,0xFA,
0x7F,0xFC,0x3F,0xFA,0x1F,0xF6,0x00,0x0E,0x00,0x1E,0x00,0x1E,0x00,0x1E,0x00,0x1E,
0x00,0x1E,0x00,0x1E,0x00,0x1E,0x0F,0xEE,0x1F,0xF6,0x3F,0xFA,0x7F,0xFC,0x00,0x00},
//---4---
{0x00,0x00,0x00,0x00,0x80,0x02,0xC0,0x06,0xE0,0x0E,0xF0,0x1E,0xF0,0x1E,0xF0,0x1E,
0xF0,0x1E,0xF0,0x1E,0xF0,0x1E,0xF0,0x1E,0xF0,0x1E,0xE0,0x0E,0xDF,0xF6,0xBF,0xFA,
0x7F,0xFC,0x3F,0xFA,0x1F,0xF6,0x00,0x0E,0x00,0x1E,0x00,0x1E,0x00,0x1E,0x00,0x1E,
0x00,0x1E,0x00,0x1E,0x00,0x1E,0x00,0x0E,0x00,0x06,0x00,0x02,0x00,0x00,0x00,0x00},
//---5---
{0x00,0x00,0x7F,0xFC,0xBF,0xF8,0xDF,0xF0,0xEF,0xE0,0xF0,0x00,0xF0,0x00,0xF0,0x00,
0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xE0,0x00,0xDF,0xF0,0xBF,0xF8,
0x7F,0xFC,0x3F,0xFA,0x1F,0xF6,0x00,0x0E,0x00,0x1E,0x00,0x1E,0x00,0x1E,0x00,0x1E,
0x00,0x1E,0x00,0x1E,0x00,0x1E,0x0F,0xEE,0x1F,0xF6,0x3F,0xFA,0x7F,0xFC,0x00,0x00},
//---6---
{0x00,0x00,0x7F,0xFC,0xBF,0xF8,0xDF,0xF0,0xEF,0xE0,0xF0,0x00,0xF0,0x00,0xF0,0x00,
0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xE0,0x00,0xDF,0xF0,0xBF,0xF8,
0x7F,0xFC,0xBF,0xFA,0xDF,0xF6,0xE0,0x0E,0xF0,0x1E,0xF0,0x1E,0xF0,0x1E,0xF0,0x1E,
0xF0,0x1E,0xF0,0x1E,0xF0,0x1E,0xEF,0xEE,0xDF,0xF6,0xBF,0xFA,0x7F,0xFC,0x00,0x00},
//---7---
{0x00,0x00,0x7F,0xFC,0x3F,0xFA,0x1F,0xF6,0x0F,0xEE,0x00,0x1E,0x00,0x1E,0x00,0x1E,
0x00,0x1E,0x00,0x1E,0x00,0x1E,0x00,0x1E,0x00,0x1E,0x00,0x0E,0x00,0x06,0x00,0x02,
0x00,0x00,0x00,0x02,0x00,0x06,0x00,0x0E,0x00,0x1E,0x00,0x1E,0x00,0x1E,0x00,0x1E,
0x00,0x1E,0x00,0x1E,0x00,0x1E,0x00,0x0E,0x00,0x06,0x00,0x02,0x00,0x00,0x00,0x00},
//---8---
{0x00,0x00,0x7F,0xFC,0xBF,0xFA,0xDF,0xF6,0xEF,0xEE,0xF0,0x1E,0xF0,0x1E,0xF0,0x1E,
0xF0,0x1E,0xF0,0x1E,0xF0,0x1E,0xF0,0x1E,0xF0,0x1E,0xE0,0x0E,0xDF,0xF6,0xBF,0xFA,
0x7F,0xFC,0xBF,0xFA,0xDF,0xF6,0xE0,0x0E,0xF0,0x1E,0xF0,0x1E,0xF0,0x1E,0xF0,0x1E,
0xF0,0x1E,0xF0,0x1E,0xF0,0x1E,0xEF,0xEE,0xDF,0xF6,0xBF,0xFA,0x7F,0xFC,0x00,0x00},
//---9---
{0x00,0x00,0x7F,0xFC,0xBF,0xFA,0xDF,0xF6,0xEF,0xEE,0xF0,0x1E,0xF0,0x1E,0xF0,0x1E,
0xF0,0x1E,0xF0,0x1E,0xF0,0x1E,0xF0,0x1E,0xF0,0x1E,0xE0,0x0E,0xDF,0xF6,0xBF,0xFA,
0x7F,0xFC,0x3F,0xFA,0x1F,0xF6,0x00,0x0E,0x00,0x1E,0x00,0x1E,0x00,0x1E,0x00,0x1E,
0x00,0x1E,0x00,0x1E,0x00,0x1E,0x0F,0xEE,0x1F,0xF6,0x3F,0xFA,0x7F,0xFC,0x00,0x00},
     // 10: “℃”C:\Users\Administrator\Desktop\TFT文字与图片提取工具包\仿真与烧写板测试用带图形温度
{0x00,0x00,0x30,0x00,0x48,0x00,0x49,0xC0,0x33,0xE8,0x06,0x38,0x0C,0x18,0x0C,0x08,
0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x06,0x08,0x03,0x10,0x01,0xE0,0x00,0x00},
//6X6方点  11
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x03,0xC0,0x07,0xE0,0x0F,0xF0,0x0F,0xF0,
0x07,0xE0,0x03,0xC0,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},
//橫杠图标 12   
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFC,0x7F,0xFC,0x7F,0xFC,
0x7F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{// 无图片" "13   //16x16空白图标//无任何图片显示----------------------------
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
};
// 延时函数
/* void Delay1us() { _nop_(); _nop_(); }
void Delay10ms() {
     unsigned char i,j;
     for(i=20;i>0;i--) for(j=133;j>0;j--);
}   */
void delay_ms(unsigned int ms) {            // 毫秒级延时函数
    unsigned int i, j;                      // 定义循环计数器
    for(; ms>0; ms--) {                     // 外层循环控制总延时毫秒数
        for(i=0; i<110; i++) {              // 中层循环(12MHz晶振1ms基础计数)
            for(j=0; j<2; j++);             // 内层循环微调延时精度
        }
    }
}
void Delay(void) {                          // 短延时函数(DS1302时序用)
    _nop_();                                // 空操作(约1us)
    _nop_();                                // 空操作(约1us)
}
void Delay10ms(void) {                      // 10毫秒延时函数(LCD初始化用)
    unsigned int i, j;                      // 定义循环计数器
    for(i=0; i<100; i++)                    // 外层循环
        for(j=0; j<110; j++);               // 内层循环(总延时约10ms)
}
void LCD_WriteCmd(unsigned char cmd) {      // LCD写命令函数
    LCD_RS = 0;                             // RS=0(命令模式)
    LCD_RW = 0;                             // RW=0(写模式)
    LCD_EN = 0;                             // 拉低EN引脚准备
    LCD_DATA = cmd;                         // 命令码写入数据口
    lcd_delay(1);                           // 等待命令稳定
    LCD_EN = 1;                             // 拉高EN触发LCD读取
    lcd_delay(1);                           // 保持高电平确保读取
    LCD_EN = 0;                             // 拉低EN结束操作
//   Delay10ms();                          // 延时(注释未启用)
}
void LCD_WriteData(unsigned char dat) {     // LCD写数据函数
    LCD_RS = 1;                             // RS=1(数据模式)
    LCD_RW = 0;                             // RW=0(写模式)
    LCD_EN = 0;                             // 拉低EN引脚准备
    LCD_DATA = dat;                         // 显示数据写入数据口
    lcd_delay(1);                            // 等待数据稳定
    LCD_EN = 1;                             // 拉高EN触发LCD读取
    lcd_delay(1);                           // 保持高电平确保读取
    LCD_EN = 0;                             // 拉低EN结束操作
}
void LCD_Init_Unique(void) {                // LCD初始化函数(防重名)
//   LCD_WriteCmd(0x36);  // 进入图形模式
    Delay10ms();                            // 上电等待LCD稳定
// LCD_WriteCmd(0x30);                     // 基本指令集,8位接口
//  Delay10ms();                     
         // 等待指令执行
    LCD_WriteCmd(0x30);                     // 重复指令确保生效
    Delay10ms();                            // 等待指令执行
    LCD_WriteCmd(0x0C);                     // 显示开,无光标
    Delay10ms();                            // 等待指令执行
    LCD_WriteCmd(0x01);                     // 清屏操作
    Delay10ms();   
    Delay10ms();                           // 等待清屏完成
    LCD_WriteCmd(0x80);                     // 起始地址:第一行第0列
    Delay10ms();   
LCD_WriteCmd(0x30);                     // 基本指令集,8位接口
    Delay10ms();   
                     // 等待指令执行
}
void DS1302_Write(unsigned char addr, unsigned char dat) { // DS1302写函数
    unsigned char i;                        // 循环计数器(8位数据)
    DS1302_RST = 0;                         // 拉低RST进入待机
    Delay();                                // 短延时稳定
    DS1302_CLK = 0;                         // 拉低CLK准备发送
    Delay();                                // 短延时稳定
    DS1302_RST = 1;                         // 拉高RST启动通信
    Delay();                                // 短延时准备
    addr &= 0xFE;                           // 地址最低位清0(写操作)
    for(i=0; i<8; i++) {                    // 循环发送8位地址
        DS1302_DAT = (addr >> i) & 0x01;    // 提取地址第i位
        DS1302_CLK = 1;                     // 拉高CLK触发读取
        Delay();                            // 短延时稳定
        DS1302_CLK = 0;                     // 拉低CLK准备下一位
        Delay();                            // 短延时稳定
    }
    dat = ((dat/10)<<4) | (dat%10);         // 十进制转BCD码
    dat &= 0x7F;                            // 保留低7位(DS1302数据位)
    for(i=0; i<8; i++) {                    // 循环发送8位数据
        DS1302_DAT = (dat >> i) & 0x01;     // 提取数据第i位
        DS1302_CLK = 1;                     // 拉高CLK触发读取
        Delay();                            // 短延时稳定
        DS1302_CLK = 0;                     // 拉低CLK准备下一位
        Delay();                            // 短延时稳定
    }
    DS1302_RST = 0;                         // 拉低RST结束通信
    Delay();                                // 短延时稳定
}
unsigned char DS1302_Read(unsigned char addr) { // DS1302读函数
    unsigned char i, dat = 0;               // 计数器+接收数据变量
    DS1302_RST = 0;                         // 拉低RST进入待机
    Delay();                                // 短延时稳定
    DS1302_CLK = 0;                         // 拉低CLK准备发送
    Delay();                                // 短延时稳定
    DS1302_RST = 1;                         // 拉高RST启动通信
    Delay();                                // 短延时准备
    addr |= 0x01;                           // 地址最低位置1(读操作)
    for(i=0; i<8; i++) {                    // 循环发送8位地址
        DS1302_DAT = (addr >> i) & 0x01;    // 提取地址第i位
        DS1302_CLK = 1;                     // 拉高CLK触发读取
        Delay();                            // 短延时稳定
        DS1302_CLK = 0;                     // 拉低CLK准备下一位
        Delay();                            // 短延时稳定
    }
    for(i=0; i<8; i++) {                    // 循环接收8位数据
        dat |= ((unsigned char)DS1302_DAT) << i; // 接收第i位并拼接
        DS1302_CLK = 1;                     // 拉高CLK采样数据
        Delay();                            // 短延时稳定
        DS1302_CLK = 0;                     // 拉低CLK准备下一位
        Delay();                            // 短延时稳定
    }
    DS1302_RST = 0;                         // 拉低RST结束通信
    Delay();                                // 短延时稳定
    return ((dat>>4)*10) + (dat&0x0F);      // BCD码转十进制返回
}
未完!


仿真与实体日期时间星期带图形温度.png (111.74 KB, 下载次数: 0)

仿真与实体日期时间星期带图形温度.png

仿真与烧写板测试用带图形温度.rar

208.91 KB, 下载次数: 0, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表