本帖最后由 冰冰潔潔 于 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]=='-')
{
|