本帖最后由 冰冰洁洁 于 2018-11-9 21:25 编辑
一些常用库我打包在之前发的贴子里,找找吧。我习惯把新库加好了备份一下打包。/* 16X16点阵显示 取模方式 阴码+逐行式+顺向
**/
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "DS18B20.h"
float Temp_Buffer = 0; //存放温度值的10倍
DS18B20 myDS18B20(A0);
int r,xo,yo,a,z;//动画变量不能用char型变量无法计算
int sec;//动画变量不能用char型变量无法计算
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2
#define LOGO16_GLCD_HEIGHT 16
#define LOGO16_GLCD_WIDTH 16
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
int x;//动画变量
//显示一个心形
static const uint8_t PROGMEM Heart_16x16[] = {
0x00,0x00,0x18,0x18,0x3C,0x3C,0x7E,0x7E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x7F,0xFE,0x3F,0xFC,0x1F,0xF8,0x0F,0xF0,0x07,0xE0,0x03,0xC0,0x00,0x00//未命名文件0
};
static const uint8_t PROGMEM bbjj_16x16[] ={
0x00,0x00,0x23,0xF8,0x12,0x08,0x12,0x08,0x83,0xF8,0x42,0x08,0x42,0x08,0x13,0xF8,
0x10,0x00,0x27,0xFC,0xE4,0xA4,0x24,0xA4,0x24,0xA4,0x24,0xA4,0x2F,0xFE,0x00,0x00,/*"温",0*/
0x01,0x00,0x00,0x80,0x3F,0xFE,0x22,0x20,0x22,0x20,0x3F,0xFC,0x22,0x20,0x22,0x20,
0x23,0xE0,0x20,0x00,0x2F,0xF0,0x24,0x10,0x42,0x20,0x41,0xC0,0x86,0x30,0x38,0x0E,/*"度",1*/
};
void setup() {
Serial.begin(115200);
delay(500);
// by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3D (for the 128x64)
}
void loop() {
//1.检测全屏显示(看看有没有大面积坏点)
display.fillScreen(WHITE);//检测全屏显示(看看有没有大面积坏点)
display.clearDisplay(); // clears the screen and buffer
/*
display.clearDisplay(); // clears the screen and buffer
//2.画点 点坐标(10,10)
display.drawPixel(20, 20, WHITE);// 列127 行63 画点 点坐标
//3. 画线 从(0,0)到(50,50)
display.drawLine(20, 25,20,63, WHITE);//(开始列127 开始行63)( 结束列127 结束行63)
//4.画空心矩形 左上角坐标(x0,y0) 右下角坐标(x1,y1)
display.drawRect(2,50,10,10,WHITE);//(控制位置列0/127 控制位置行0/63 )(控制大小=列+x 结束大小=行+Y)
//5.来画个实心矩形
display.fillRect(2,35,10,10,WHITE);//(控制位置列0/127 控制位置行0/63 )(控制大小=列+x 结束大小=行+Y)
//6.画空心圆
display.drawCircle(36,50,6,WHITE);//(控制圆心位置列0/127 控制圆心位置行0/63 )(控制大小=0+x )
//7.画实心圆
display.fillCircle(36,30,6,WHITE);//(控制圆心位置列0/127 控制圆心位置行0/63 )(控制大小=0+x )
//8.画空心三角形
display.drawTriangle(60,32,45,43,70,43,WHITE);//(控制三角形A点列0/127 行0/63 控制三角形B点列0/127 行0/63 控制三角形C点列0/127 行0/63)
//9.画实心三角形
display.fillTriangle(86,32,72,43,100,43,WHITE);//(控制三角形A点列0/127 行0/63 控制三角形B点列0/127 行0/63 控制三角形C点列0/127 行0/63)
//10.画空心圆角矩形
display.drawRoundRect(50,17,15,15,2,WHITE);//(控制位置列0/127 控制位置行0/63 )(控制大小=列+x 结束大小=行+Y 控制圆角=+x)
//11.画实心圆角矩形
display.fillRoundRect(70,17,15,15,2,WHITE);//(控制位置列0/127 控制位置行0/63 )(控制大小=列+x 结束大小=行+Y 控制圆角=+x)
//12.画心形(自己用取模软件画的)相当于一个任意16X16字
display.drawBitmap(88,17,Heart_16x16,16,16,WHITE);//(控制位置列0/127 控制位置行0/63 )(控制大小=16 结束大小=16)这里只能是16X16因为是16X16字
//13.显示英文
display.setTextSize(2);//设置字体大小
display.setTextColor(WHITE);//设置字体不反白
display.setCursor(0,0);//列127 行63 坐标
display.println("bb");
//14.显示数字变量
display.setTextSize(2);//设置字体大小
display.setTextColor(BLACK, WHITE); //设置字体反白
display.setCursor(30,0);//列127 行63 坐标
display.println(x);
//15.显示16进制变量
display.setTextSize(2);
display.setTextColor(WHITE);//设置字体不反白
display.setCursor(60,0);//列127 行63 坐标
display.print("0x");
display.println(x, HEX);
//16.显示单个文字 就是调用drawBitmap(自己用取模软件取模)相当于一个任意16X16字
//display.drawBitmap(0,17,Strong_16x16,16,16,BLACK);//可用BLACK黑字在图片上显示(控制位置列0/127 控制位置行0/63 )(控制大小=16 结束大小=16)这里只能是16X16因为是16X16字
display.drawBitmap(0,17,Strong_16x16,16,16,WHITE);//(控制位置列0/127 控制位置行0/63 )(控制大小=16 结束大小=16)这里只能是16X16因为是16X16字
//17.显示多个文字(在库里面加入一个ShowCN_16方法 为了同时显示多个中文 16X16 ,不然的话 就得一个一个drawBitmap)
display.ShowCN_16(0,45, bbjj_16x16,sizeof(bbjj_16x16)/32,WHITE);//查找数组法(控制位置列0/127 控制位置行0/63 )
*/
//6.画空心圆
display.drawCircle(xo,yo,19,WHITE);//(控制圆心位置列0/127 控制圆心位置行0/63 )(控制大小=0+x )
display.drawCircle(xo,yo,25+6,WHITE);//(控制圆心位置列0/127 控制圆心位置行0/63 )(控制大小=0+x )
//7.画实心圆
display.fillCircle(xo,yo,2,WHITE);//(控制圆心位置列0/127 控制圆心位置行0/63 )(控制大小=0+x )
//不能用char型变量无法计算
r=17;//指针半径
xo=80;//圆心坐标 MAX 127
yo=32;//圆心坐标 MAX 63
z=180;//圆
a=sec*6;//圆角度
//.画一圈实心圆
int B;
for(B=0;B<12;B++)//.画一圈实心圆
{
int A=B*30;//圆角度
display.fillCircle((xo+((r+9)*cos(A*3.14/z))),(yo+((r+9)*sin(A*3.14/z))),1,WHITE);//(控制圆心位置列0/127 控制圆心位置行0/63 )(控制大小=0+x )
}
//.画sec时针线
display.drawLine((xo+(r*cos(a*3.14/z))),(yo+(r*sin(a*3.14/z))),xo,yo, WHITE);//(开始列127 开始行63)( 结束列127 结束行63) /////00
//13.显示英文
display.setTextSize(1);//设置字体大小
display.setTextColor(WHITE);//设置字体不反白
display.setCursor(xo-3,yo-29);//列127 行63 坐标
display.println("0");
display.setCursor(xo+20,yo-5);//列127 行63 坐标
display.println("15");
display.setCursor(xo-5,yo+22);//列127 行63 坐标
display.println("30");
display.setCursor(xo-30,yo-5);//列127 行63 坐标
display.println("45");
// 17.显示多个文字(在库里面加入一个ShowCN_16方法 为了同时显示多个中文 16X16 ,不然的话 就得一个一个drawBitmap)
display.ShowCN_16(0,40, bbjj_16x16,sizeof(bbjj_16x16)/32,WHITE);//查找数组法(控制位置列0/127 控制位置行0/63 )
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0,17);
Temp_Buffer = myDS18B20.Get_temp();////温度
display.println((int)Temp_Buffer);////温度
sec=Temp_Buffer-15;//用于修正表针位置
display.display();
//delay(2000);
}
#include<main.h>
#include<1602.h>
#include<ds1302.h>
uchar time[]={40,27,1,9,11,5,18}; //改时间用,初始化时间2012年7月25日 23:59: 40
uchar code tab1[]="20 - - ";
uchar code tab2[]="T: : :";
uchar flag;
uchar wendu;
void delay(uint x)
{
uint m,n;
for(m=x;m>0;m--)
for(n=110;n>0;n--);
}
/****
******* 串口初始化函数
*****/
void uart_init()
{
TMOD=0x20; //9600bps
SCON=0x50;
TH1=0xFD;
TL1=0xFD;
TR1=1;
ES=1;
EA=1;
UART_EN=0; //串口一直处于接收状态
}
void main()
{
lcd_init();
uart_init();
lcd_write_str(0x80,tab1);
lcd_write_str(0xc0,tab2);
//DS1302_set_time(&time); //初始化时间,正常后不要,读1302自己保存的时间
//改好时间后不要这句,再下一次程序以后从1302读时间
while(1)
{
DS1302_read_time(&time);
lcd_write_time(0x82,time[6]); //年
switch(time[5]) //星期
{
case 1: lcd_write_str(0x8c,"MON");break;
case 2: lcd_write_str(0x8c,"TUE");break;
case 3: lcd_write_str(0x8c,"WED");break;
case 4: lcd_write_str(0x8c,"THU");break;
case 5: lcd_write_str(0x8c,"FRI");break;
case 6: lcd_write_str(0x8c,"SAT");break;
case 7: lcd_write_str(0x8c,"SUN");break;
}
lcd_write_time(0x85,time[4]); //月
lcd_write_time(0x88,time[3]); //日
lcd_write_time(0xc8,time[2]); //时
lcd_write_time(0xcb,time[1]); //分
lcd_write_time(0xce,time[0]); //秒
if(flag==1) //显示负温度
{
lcd_write_com(0xc2);
lcd_write_date('-');
lcd_wendu(0xc6,wendu);
}
else //显示正温度
{
lcd_write_com(0xc2);
lcd_write_date('+');
lcd_wendu(0xc3,wendu);
lcd_write_com(0xc6);
lcd_write_date('C');
}
}
}
/****
******* 串口中断服务程序函数
*****/
void ser() interrupt 4
{
static uchar string[2],i;
if(RI)
{
RI=0;
string[i++]=SBUF;
if(i>1)
i=0;
if(string[0]=='-')
{
|