📄 18bb20.c
字号:
#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define NOP() _nop_();
//液晶显示功能引脚定义
sbit A0 = P3^0;//数据1/命令0选择
sbit _WR = P3^7;//读写
sbit E1 = P3^4; //片选1(Master)
sbit E2 = P3^3;//片选2(slave)
#define lcd_data P2//数据
//液晶显示常用操作宏定义
#define set_E1() (E1=1) //1片选M
#define set_E2() (E2=1) //1片选S
#define set_A0() (A0=1) //1数据
#define set_WR() (_WR=1) //1读
#define clr_E1() (E1=0) //0
#define clr_E2() (E2=0) //0
#define clr_A0() (A0=0) //0命令
#define clr_WR() (_WR=0) //0写
//液晶显示控制命令表
#define disp_off 0xAE //显示关闭
#define disp_on 0xAF //显示打开
#define disp_start_line 0xC0 //显示起始地址(后5位-表示0-31行)
#define page_addr_set 0xB8 //页地址设置(0~3)
#define col_addr_set 0x00 //列地址设置(0~61)
#define status_busy 0x80 //0=ready
#define mode_write 0xEE //写模式
#define dynamic_driver 0xA4 //动态驱动
#define adc_select 0xA0 //clockwise
#define clk32 0xA9 //刷新时钟设置1/32
#define clk16 0xA8 //刷新时钟设置1/16
#define reset 0xE2 //软件复位
//温度显示功能引脚定义
bit flag;//温度标记;1为负温度;0为正温度
sbit DQ = P1^1;
//液晶显示缓存区定义
uchar dot_buffer[32]; //点阵缓存区
uchar disp_buffer[8]; //ram数据显示缓存区
///////////////////////////////////////////////
//液晶显示的函数
//////////////////////////////////////////////
void lcd_init(void); //LCD初始化
void lcd_clr(void); //LCD清屏
void wait_ready(void); //等待ready
//点阵码显示输出(用于图片输出);参数为:起始行,起始列,宽度,表格table名称;
void draw_bmp(uchar col,uchar layer,uchar width,uchar *bmp);
//单个ascci码输出(ascii_code为ascii编码)
////参数为:起始行;起始层:0为下面1为上面;直接给ASCII码如"A";显示模式0正常1反白;
void disp_one_ascii(uchar col,uchar layer,uchar ascii_code,uchar mode);
//ram数据(数字)显示输出输出disp_buffer里面的数组;
//参数为:起始行;起始层:0为下面1为上面;显示个数;显示模式0正常1反白;
void disp_ram_data(uchar col,uchar layer,uchar n,uchar mode);
//通用混合字串显示
//参数为:起始行;起始层:0为下面1为上面;要显示的内容如"太川";显示模式0正常1反白;
void dprintf(uchar col,uchar layer,uchar *buf,uchar mode);
//////////////////////////////////////////////////////////
//温度测量的函数
/////////////////////////////////////////////////////////
void write_byte(uchar val); //向DS18B20写入1个字节
uchar read_byte(void); //从18b20读一个字节.返回读到的内容
dreset(); //初始化18B20
get_temperature(void);//读取温度子程序并对值保存
///////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
void delay(uint x) ////when crystal is 12M ,a*2+5 us ,子程序调用要5us,while 就等于DJNZ指令
{
while (x--);
}
//////////////////////
void write_byte(uchar val) //向DS18B20写入1个字节
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
_nop_(); //要求>1us,但又不能超过15us
_nop_();
if(0x01&val)
DQ=1;
delay(20); //要求总时间在60-120us
DQ=1; //释放总线
_nop_();_nop_(); //要求>1us
val=val>>1;
}
}
////////////////////
uchar read_byte(void) //从18b20读一个字节.返回读到的内容
{
uchar i,j;
j=0;
for(i=0;i<8;i++)
{DQ=1;
DQ=0;
j=j>>1;
//要求>1us,但又不能超过15us
DQ=1; //释放总线
_nop_();
_nop_();
if(DQ)
j|=0x80;
delay(30);
}
return (j);
}
///////////////////
dreset() //初始化18B20
{
bit presence=0; //定义一个应答信号
DQ=1;
DQ=0;
delay(80); //置总线为低电平并保持至少480us
DQ=1; //等电阻拉高总线并保持15-60us
delay(5);
presence=DQ; //接受应答信号
delay(13); //延时60-240us
DQ=1;
//if (presence) dprintf(0,1,"NO",0);
// else dprintf(0,1,"OK!",0);//返回应答信号
}
//////////////////
/* 读取温度子程序 */
get_temperature(void)
{
uchar msb=0;//高8位
uchar lsb=0;//低8位
dreset(); /* 发送复位信号 */
delay(30);
write_byte(0xcc); /* 跳过ROM */
write_byte(0x44); /* 发送转换温度命令 */
dreset();
delay(30);
write_byte(0xcc);
write_byte(0xBE); /* 发送读memory命令 */
lsb =read_byte();
msb =read_byte();
dreset();
delay(10000);
if(msb&0xf8) { flag=1;msb=~msb; lsb=~lsb+1; } //如果为负温度取反加1
else flag=0;
msb=(msb<<4)|(lsb>>4);
if (flag) disp_buffer[0]=253; //负温度指示标号根据自己表格位置修改
if (msb/100) disp_buffer[0]=msb/100; //百位数
else disp_buffer[0]=251; //正温度指示标号根据自己表格位置修改
disp_buffer[1]=msb%100/10; //十位数
disp_buffer[2]=msb%10; //个位数
disp_buffer[3]=254; //小数点指示标号根据自己表格位置修改
disp_buffer[4]=(lsb&0x0f)*625/1000; //小数点第一位
//disp_buffer[5]=(lsb&0x0f)*625%1000/100; //小数点第二位
//disp_buffer[6]=(lsb&0x0f)*625%100/10; //小数点第三位
//disp_buffer[7]=(lsb&0x0f)*625%10; //小数点第四位
}
///////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
unsigned char code top[] = // 数据表图片上半部分
{
0x00,0x00,0x00,0x60,0x70,0xF0,0xF8,0xF8,
0xF8,0x40,0xFC,0x44,0x44,0x44,0x4C,0x78,
0x60,0x60,0x70,0x58,0x44,0xFC,0xC7,0xFD,
0x41,0x01,0x01,0x03,0x02,0x06,0x0C,0x18,
0x04,0x02,0x02,0x02,0xFE,0x40,0x40,0x40,
0x40,0x40,0x40,0x40,0x40,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,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
0x01,0x00,0x00,0x01,0x06,0x04,0x08,0x18,
0x10,0x10,0x10,0x10,0x08,0x0C,0x07,0x03,
0x02,0x02,0x04,0x04,0x04,0x04,0x04,0x04,
0x04,0x04,0x06,0x02,0x01,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,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
unsigned char code bot[] = // 数据表图片下半部分
{
0x00,0x00,0x20,0x20,0x20,0xE0,0x60,0x38,
0xAC,0xE0,0x20,0x00,0x80,0x80,0x88,0x88,
0xC8,0xC8,0xF8,0xB0,0x80,0x80,0x80,0x80,
0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
0xC0,0x30,0x08,0x80,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,
0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x20,
0x3C,0x20,0x20,0x20,0xFF,0x20,0x20,0x20,
0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x34,0x64,0xC4,0x84,0x04,0x04,
0xFC,0x04,0x04,0x04,0x84,0xC4,0x74,0x04,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x60,0x30,0x10,0xD0,0x90,0x10,0x10,0x12,
0x1E,0x10,0x10,0x10,0x90,0x30,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x05,
0x06,0x0F,0x19,0x10,0x00,0x00,0x00,0x00,
0x00,0x08,0x18,0x18,0x0F,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x18,
0x06,0x03,0x00,0x00,0x00,0x01,0x03,0x06,
0x0C,0x18,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
0x21,0x20,0x30,0x28,0x29,0x25,0x3F,0x25,
0x25,0x27,0x20,0x20,0x20,0x20,0x20,0x00,
0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,
0x02,0x02,0xFF,0x02,0x03,0x03,0x02,0x02,
0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x00,
0x01,0x01,0x01,0x41,0x61,0x21,0x21,0x21,
0x33,0x17,0x0D,0x15,0x25,0x23,0x41,0x41,
0x01,0x01,0x00,0x00
};
typedef struct typFNT_GB16 // 汉字字模数据结构
{
signed char Index[2];
char Msk[32];
};
struct typFNT_GB16 code GB_16[] =
{
"欢", 0x04,0x34,0xC4,0x04,0xC4,0x3C,0x20,0x10,
0x0F,0xE8,0x08,0x08,0x28,0x18,0x00,0x00,
0x10,0x08,0x06,0x01,0x82,0x8C,0x40,0x30,
0x0C,0x03,0x0C,0x10,0x60,0xC0,0x40,0x00,
"迎", 0x40,0x42,0x44,0xC8,0x00,0xFC,0x04,0x02,
0x82,0xFC,0x04,0x04,0x04,0xFE,0x04,0x00,
0x00,0x40,0x20,0x1F,0x20,0x47,0x42,0x41,
0x40,0x7F,0x40,0x42,0x44,0x63,0x20,0x00,
"光", 0x40,0x40,0x42,0x44,0x58,0xC0,0x40,0x7F,
0x40,0xC0,0x50,0x48,0x46,0x64,0x40,0x00,
0x00,0x80,0x40,0x20,0x18,0x07,0x00,0x00,
0x00,0x3F,0x40,0x40,0x40,0x40,0x70,0x00,
"临", 0x00,0xFC,0x00,0xFF,0x40,0x20,0x10,0x0C,
0x2B,0x48,0xC8,0x08,0x08,0x8C,0x08,0x00,
0x00,0x1F,0x00,0xFF,0x00,0xFF,0x41,0x41,
0x41,0x7F,0x41,0x41,0x41,0xFF,0x01,0x00,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -