附件中包括一个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码转十进制返回
}
未完!
|