diff --git a/oledlib/draw_api.h b/oledlib/draw_api.h index 4b847bcefe59dd9cb062f450babaea45ee90e2a5..08783bcb5302ee3b01152dba51284cf629661d2f 100644 --- a/oledlib/draw_api.h +++ b/oledlib/draw_api.h @@ -11,20 +11,20 @@ #include "oled_debug.h" //*********************************************************************** -//* 为了做这个绘制图形库,我参考了很多其他的算法,花了大量时间去做移植 -//*优化,其中参考最多的是github中的arduboy游戏机,大部分图形是移植它的, -//*现在是最初的初稿版本,还有很多地方需要优化改进。我想要将这个图形库做大, -//*后续会加入更多有趣的东西,和模块,代码都是用最简单的方式编写的,都是开源的。 -//*后续也会加上注释说明,让更多人以单片机和oled屏来入门硬件编程,如果你 -//使用了该库,请标明出处。b站关注oximeterg,可获取该库的最新版本和消息。 -//注意:绘制填充或实心的图形,影响刷新效率(待优化中) -//*oled屏图形库0.0.0.1 作者:maoyongjie +//* 涓轰簡鍋氳繖涓粯鍒跺浘褰㈠簱锛屾垜鍙傝冧簡寰堝鍏朵粬鐨勭畻娉,鑺变簡澶ч噺鏃堕棿鍘诲仛绉绘 +//*浼樺寲锛屽叾涓弬鑰冩渶澶氱殑鏄痝ithub涓殑arduboy娓告垙鏈猴紝澶ч儴鍒嗗浘褰㈡槸绉绘瀹冪殑锛 +//*鐜板湪鏄渶鍒濈殑鍒濈ǹ鐗堟湰,杩樻湁寰堝鍦版柟闇瑕佷紭鍖栨敼杩涖傛垜鎯宠灏嗚繖涓浘褰㈠簱鍋氬ぇ锛 +//*鍚庣画浼氬姞鍏ユ洿澶氭湁瓒g殑涓滆タ锛屽拰妯″潡锛屼唬鐮侀兘鏄敤鏈绠鍗曠殑鏂瑰紡缂栧啓鐨勶紝閮芥槸寮婧愮殑銆 +//*鍚庣画涔熶細鍔犱笂娉ㄩ噴璇存槑锛岃鏇村浜轰互鍗曠墖鏈哄拰oled灞忔潵鍏ラ棬纭欢缂栫▼锛屽鏋滀綘 +//浣跨敤浜嗚搴擄紝璇锋爣鏄庡嚭澶勩俠绔欏叧娉╫ximeterg锛屽彲鑾峰彇璇ュ簱鐨勬渶鏂扮増鏈拰娑堟伅銆 +//娉ㄦ剰锛氱粯鍒跺~鍏呮垨瀹炲績鐨勫浘褰紝褰卞搷鍒锋柊鏁堢巼锛堝緟浼樺寲涓級 +//*oled灞忓浘褰㈠簱0.0.0.1 浣滆咃細maoyongjie //https://github.com/hello-myj/stm32_oled/ //************************************************************************ //------------------------------------------------------------------------- /**************************************************************************/ - //坐标说明 + //鍧愭爣璇存槑 /* x(0~127) ------------------> | @@ -38,158 +38,161 @@ /**************************************************************************/ //////////////////////////////////////////////////////////////////////////////////////////////// -//功能:初始化图形库 +//鍔熻兘:鍒濆鍖栧浘褰㈠簱 void InitGraph(void); -//功能:将屏幕数据更新到设备上 +//鍔熻兘:灏嗗睆骞曟暟鎹洿鏂板埌璁惧涓 void UpdateScreen(void); -//功能:清屏 +//鍔熻兘:娓呭睆 void ClearScreen(void); -//请将此函数放入1ms中断里,为图形提供时基 +//璇峰皢姝ゅ嚱鏁版斁鍏1ms涓柇閲岋紝涓哄浘褰㈡彁渚涙椂鍩 void OledTimeMsFunc(void); -//图形库test.c的延时函数 +//鍥惧舰搴搕est.c鐨勫欢鏃跺嚱鏁 void DelayMs(u16 ms); -//功能:设置字体的背景模式 0为透明,1为正常。 -void SetTextBkMode(unsigned char value); -//功能:获取字体的背景模式 0为透明,1为正常。 -unsigned char GetTextBkMode(void); -//功能:设置绘制的颜色 pix_black:黑色、pix_white:白色 + +//鍔熻兘:璁剧疆缁樺埗鐨勯鑹 pix_black:榛戣壊銆乸ix_white:鐧借壊 extern void SetDrawColor(Type_color value); -//功能:获取当前设置的绘制颜色 pix_black:黑色、pix_white:白色 +//鍔熻兘:鑾峰彇褰撳墠璁剧疆鐨勭粯鍒堕鑹 pix_black:榛戣壊銆乸ix_white:鐧借壊 extern Type_color GetDrawColor(void); -//功能:设置填充的颜色 pix_black:黑色、pix_white:白色 +//鍔熻兘:璁剧疆濉厖鐨勯鑹 pix_black:榛戣壊銆乸ix_white:鐧借壊 extern void SetFillcolor(Type_color value); -//功能:获取当前设置的填充颜色 pix_black:黑色、pix_white:白色 +//鍔熻兘:鑾峰彇褰撳墠璁剧疆鐨勫~鍏呴鑹 pix_black:榛戣壊銆乸ix_white:鐧借壊 extern Type_color GetFillColor(void); ///////////////////////////////////////////////////////////////////////////////////////////////////// -//以下函数为oled.draw中直接供用户调用的函数 +//浠ヤ笅鍑芥暟涓簅led.draw涓洿鎺ヤ緵鐢ㄦ埛璋冪敤鐨勫嚱鏁 -//功能:绘制一个点 +//鍔熻兘锛氱粯鍒朵竴涓偣 extern void DrawPixel(int x,int y); -//功能:获取一个像素点的颜色 +//鍔熻兘锛氳幏鍙栦竴涓儚绱犵偣鐨勯鑹 extern Type_color GetPixel(int x,int y); -//功能:绘制一条任意线 +//鍔熻兘:缁樺埗涓鏉′换鎰忕嚎 extern void DrawLine(int x1,int y1,int x2,int y2); -//功能:快速绘制一条水平线 w为长度 +//鍔熻兘:蹇熺粯鍒朵竴鏉℃按骞崇嚎 w涓洪暱搴 extern void DrawFastHLine(int x, int y, unsigned char w); -//功能:快速绘制一条垂直线 +//鍔熻兘:蹇熺粯鍒朵竴鏉″瀭鐩寸嚎 extern void DrawFastVLine(int x, int y, unsigned char h); -//功能:连续画线 折线 num为折点个数 +//鍔熻兘:杩炵画鐢荤嚎 鎶樼嚎 num涓烘姌鐐逛釜鏁 void DrawPolyLineTo(const TypeXY *points,int num); -//功能:使用对角点绘制矩形 +//鍔熻兘:浣跨敤瀵硅鐐圭粯鍒剁煩褰 extern void DrawRect1(int left,int top,int right,int bottom); -//功能:使用对角点填充矩形 +//鍔熻兘:浣跨敤瀵硅鐐瑰~鍏呯煩褰 extern void DrawFillRect1(int left,int top,int right,int bottom); -//功能:使用顶点 宽高绘制矩形 +//鍔熻兘:浣跨敤椤剁偣 瀹介珮缁樺埗鐭╁舰 extern void DrawRect2(int left,int top,int width,int height); -//功能:使用顶点 宽高填充矩形 +//鍔熻兘:浣跨敤椤剁偣 瀹介珮濉厖鐭╁舰 extern void DrawFillRect2(int left,int top,int width,int height); -//功能:绘制一个圆 +//鍔熻兘:缁樺埗涓涓渾 extern void DrawCircle( int usX_Center, int usY_Center, int usRadius); -//功能:绘制一个实心圆 +//鍔熻兘:缁樺埗涓涓疄蹇冨渾 extern void DrawFillCircle( int usX_Center, int usY_Center, int usRadius); -//功能:4份之一圆要画哪一份或哪几份 +//鍔熻兘:4浠戒箣涓鍦嗚鐢诲摢涓浠芥垨鍝嚑浠 extern void DrawCircleHelper(int x0, int y0, unsigned char r, unsigned char cornername); -//功能://填充2个四分之一圆和中间的矩形 (专用函数 见函数注释) +//鍔熻兘://濉厖2涓洓鍒嗕箣涓鍦嗗拰涓棿鐨勭煩褰 (涓撶敤鍑芥暟 瑙佸嚱鏁版敞閲) extern void DrawFillCircleHelper(int x0, int y0, unsigned char r, unsigned char cornername, int delta); -//功能:绘制一个圆弧(需优化) +//鍔熻兘:缁樺埗涓涓渾寮(闇浼樺寲) extern void DrawArc(int x,int y,unsigned char r,int angle_start,int angle_end); -//功能:填充一个圆弧(待补充) +//鍔熻兘:濉厖涓涓渾寮(寰呰ˉ鍏) extern void DrawFillArc(int x,int y,unsigned char r,int angle_start,int angle_end); -//功能:绘制一个圆角矩形 +//鍔熻兘:缁樺埗涓涓渾瑙掔煩褰 extern void DrawRoundRect(int x, int y, unsigned char w, unsigned char h, unsigned char r); -//功能:绘制一个填充圆角矩形 +//鍔熻兘:缁樺埗涓涓~鍏呭渾瑙掔煩褰 extern void DrawfillRoundRect(int x, int y, unsigned char w, unsigned char h, unsigned char r); -//功能:绘制一个椭圆 +//鍔熻兘:缁樺埗涓涓き鍦 extern void DrawEllipse(int x0,int y0,int a,int b); -//功能:绘制一个填充椭圆 +//鍔熻兘:缁樺埗涓涓~鍏呮き鍦 extern void DrawFillEllipse(int x0,int y0,int a,int b); -//功能:绘制一个矩形内切椭圆 +//鍔熻兘:缁樺埗涓涓煩褰㈠唴鍒囨き鍦 extern void DrawEllipseRect( int x0, int y0, int x1, int y1); -//功能:绘制一个三角形 +//鍔熻兘:缁樺埗涓涓笁瑙掑舰 extern void DrawTriangle(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2); -//功能:绘制一个填充三角形 +//鍔熻兘:缁樺埗涓涓~鍏呬笁瑙掑舰 extern void DrawFillTriangle(int x0, int y0, int x1, int y1, int x2, int y2); -//功能:绘制一张图片 bitmap为图片数据(可通过取模获取) +//鍔熻兘:缁樺埗涓寮犲浘鐗 bitmap涓哄浘鐗囨暟鎹紙鍙氳繃鍙栨ā鑾峰彇锛孭CtoLCD2002鍙傛暟璇烽夋嫨[闃寸爜 鍒楄寮 閫嗗悜]锛 extern void DrawBitmap(int x, int y, const unsigned char *bitmap, unsigned char w, unsigned char h); +//鍔熻兘锛氱粯鍒朵竴寮 XBM 鏍囧噯鐨勫浘鐗 +//XBM锛1銆佹槸涓绉嶆爣鍑嗙殑鍥剧墖鏍煎紡锛屽彲鐢ˋCDsee绛夌湅鍥捐蒋浠舵墦寮锛岀敤鍒板崟鐗囨満缂栫▼涓紝鍙娇鍥剧墖涓嶇敤鍙栨ā杞欢鍙栨ā灏卞彲寰楀嚭鍥剧墖浠g爜锛 +// 鍦╗https://onlineconvertfree.com/zh/convert/xbm/]鍙浆鎹㈠崟鑹插浘鐗囧埌XBM鏍煎紡锛屼箣鍚庣敤璁颁簨鏈墦寮鍗冲彲寰楀埌鍥剧墖浠g爜 +// 2銆佸鏋滆鐢ㄥ彇妯¤蒋浠惰浆鎹紝PCtoLCD2002鍙傛暟璇烽夋嫨[闃寸爜 閫愯寮 閫嗗悜] +// 3銆佸洜涓轰笌SSD1306鍐呴儴鏁版嵁瀛樺偍鏂瑰紡涓嶄竴鏍凤紝娑夊強鍒版暟鎹浆鎹㈤棶棰橈紝閫熷害杈僛DrawBitmap]鎱紝浣嗗嚑涔庡彲浠ュ拷鐣ヤ笉璁° +void DrawXBitmap(int x, int y, const unsigned char *bitmap, unsigned char w, unsigned char h); -//功能:设置字体大小 0 1 2 3 +//鍔熻兘:璁剧疆瀛椾綋澶у皬 0 1 2 3 extern void SetFontSize(unsigned char value); -//功能:获取字体大小 +//鍔熻兘:鑾峰彇瀛椾綋澶у皬 extern unsigned char GetFontSize(void); -//功能:设置填充字符时的背景颜色 +//鍔熻兘:璁剧疆濉厖瀛楃鏃剁殑鑳屾櫙棰滆壊 extern void SetTextBkMode(Type_textbk value); -//功能:获取填充字符时的背景颜色 +//鍔熻兘:鑾峰彇濉厖瀛楃鏃剁殑鑳屾櫙棰滆壊 extern Type_textbk GetTextBkMode(void); -//功能:绘制一个字符 特殊地:当size=0时 x为0-7大行 y为0-127列 +//鍔熻兘:缁樺埗涓涓瓧绗 鐗规畩鍦:褰搒ize=0鏃 x涓0-7澶ц y涓0-127鍒 extern void DrawChar(int x, int y, unsigned char c); -//功能:绘制字符串 特殊地:当size=0时 x为0-7大行 y为0-127列 +//鍔熻兘:缁樺埗瀛楃涓 鐗规畩鍦:褰搒ize=0鏃 x涓0-7澶ц y涓0-127鍒 extern void DrawString(int x, int y,char *str); -//功能:绘制数字 len为数字长度 特殊地:当size=0时 x为0-7大行 y为0-127列 +//鍔熻兘:缁樺埗鏁板瓧 len涓烘暟瀛楅暱搴 鐗规畩鍦:褰搒ize=0鏃 x涓0-7澶ц y涓0-127鍒 extern void DrawNum(unsigned char x,unsigned char y,unsigned int num,unsigned char len); -//显示汉字 -void OLED_ShowCHinese(u8 x,u8 y,u8 *cn); +//鏄剧ず姹夊瓧 +void OLED_ShowCHinese(uint8_t x,uint8_t y,uint8_t *cn); ///////////////////////////////////////////////////////////////////////////////////////////////////// -//以下函数为oled.basic中直接供用户调用的函数 +//浠ヤ笅鍑芥暟涓簅led.basic涓洿鎺ヤ緵鐢ㄦ埛璋冪敤鐨勫嚱鏁 -//功能:可用于填充一个封闭图形(可能在填充圆弧中非常适合使用) +//鍔熻兘:鍙敤浜庡~鍏呬竴涓皝闂浘褰(鍙兘鍦ㄥ~鍏呭渾寮т腑闈炲父閫傚悎浣跨敤) extern void FloodFill2(unsigned char x,unsigned char y,int oldcolor,int newcolor); -//功能:移动绘制坐标 +//鍔熻兘:绉诲姩缁樺埗鍧愭爣 extern void MoveTo(int x,int y); -//功能:线性绘制,并将绘制坐标移动到下一个坐标(在绘制折线中被调用) +//鍔熻兘:绾挎х粯鍒,骞跺皢缁樺埗鍧愭爣绉诲姩鍒颁笅涓涓潗鏍(鍦ㄧ粯鍒舵姌绾夸腑琚皟鐢) extern void LineTo(int x,int y); -//功能:获取当前点绘制点的y坐标 +//鍔熻兘:鑾峰彇褰撳墠鐐圭粯鍒剁偣鐨剏鍧愭爣 extern int GetY(void); -//功能:获取当前点绘制点的X坐标 +//鍔熻兘:鑾峰彇褰撳墠鐐圭粯鍒剁偣鐨刋鍧愭爣 extern int GetX(void); -//功能:获取当前点绘制点的X、Y坐标 +//鍔熻兘:鑾峰彇褰撳墠鐐圭粯鍒剁偣鐨刋銆乊鍧愭爣 extern TypeXY GetXY(void); -//功能:设置旋转中心点 +//鍔熻兘:璁剧疆鏃嬭浆涓績鐐 extern void SetRotateCenter(int x0,int y0); -//功能:设置旋转角度 +//鍔熻兘:璁剧疆鏃嬭浆瑙掑害 extern void SetAngle(float angle); -//功能:设置旋转方向 +//鍔熻兘:璁剧疆鏃嬭浆鏂瑰悜 extern void SetAnggleDir(int direction); -//功能:设置角度、旋转方向、旋转中心 +//鍔熻兘:璁剧疆瑙掑害銆佹棆杞柟鍚戙佹棆杞腑蹇 extern void SetRotateValue(int x,int y,float angle,int direct); -//功能:将一个坐标旋转一定角度 +//鍔熻兘:灏嗕竴涓潗鏍囨棆杞竴瀹氳搴 extern TypeXY GetRotateXY(int x,int y); -//屏幕数据缓冲 +//灞忓箷鏁版嵁缂撳啿 extern void SetScreenBuffer(void); -//功能:设置新的缓冲作为屏幕数据, +//鍔熻兘:璁剧疆鏂扮殑缂撳啿浣滀负灞忓箷鏁版嵁锛 extern void SetTempBuffer(void); -//功能:获取当前的缓冲buffer的系数 返回缓冲系数SCREEN_BUFFER或TEMP_BUFFER +//鍔熻兘:鑾峰彇褰撳墠鐨勭紦鍐瞓uffer鐨勭郴鏁 杩斿洖缂撳啿绯绘暟SCREEN_BUFFER鎴朤EMP_BUFFER extern unsigned char GetSelectedBuffer(void); -//功能:清除掉默认的屏幕缓冲数据 +//鍔熻兘:娓呴櫎鎺夐粯璁ょ殑灞忓箷缂撳啿鏁版嵁 extern void ClearScreenBuffer(unsigned char val); -//功能:清除掉临时的屏幕缓冲数据 +//鍔熻兘:娓呴櫎鎺変复鏃剁殑灞忓箷缂撳啿鏁版嵁 extern void ClearTempBuffer(void); -//功能:临时缓冲的功能 +//鍔熻兘:涓存椂缂撳啿鐨勫姛鑳 extern void TempBufferFunc(int func); -//功能:固定帧刷新 +//鍔熻兘:鍥哄畾甯у埛鏂 extern unsigned char FrameRateUpdateScreen(int value); -//功能:用以打印调试bug,功能和printf一致,不用使用ClearScreen方法也可打印出数据 +//鍔熻兘:鐢ㄤ互鎵撳嵃璋冭瘯bug锛屽姛鑳藉拰printf涓鑷达紝涓嶇敤浣跨敤ClearScreen鏂规硶涔熷彲鎵撳嵃鍑烘暟鎹 extern int OledPrintf(const char *str,...); #endif diff --git a/oledlib/oled_basic.c b/oledlib/oled_basic.c index 9a361d2691f30989d0e659cc25d29d650bc643e0..a6f194af392748fa03011198872c339398d9aca6 100644 --- a/oledlib/oled_basic.c +++ b/oledlib/oled_basic.c @@ -1,13 +1,13 @@ /* - 原作者哔哩哔哩: MjGame https://space.bilibili.com/38673747 - 同GifHub: maoyongjie https://github.com/hello-myj/stm32_oled/ - 代码整理注释删减增加优化等 哔哩哔哩: 一只程序缘 https://space.bilibili.com/237304109 - 整理之前的原代码随本代码一同提供,浏览以上网址获取更多相关信息,本代码以征得原作同意,感谢原作 + 鍘熶綔鑰呭摂鍝╁摂鍝: MjGame https://space.bilibili.com/38673747 + 鍚孏ifHub: maoyongjie https://github.com/hello-myj/stm32_oled/ + 浠g爜鏁寸悊娉ㄩ噴鍒犲噺澧炲姞浼樺寲绛 鍝斿摡鍝斿摡: 涓鍙▼搴忕紭 https://space.bilibili.com/237304109 + 鏁寸悊涔嬪墠鐨勫師浠g爜闅忔湰浠g爜涓鍚屾彁渚,娴忚浠ヤ笂缃戝潃鑾峰彇鏇村鐩稿叧淇℃伅,鏈唬鐮佷互寰佸緱鍘熶綔鍚屾剰,鎰熻阿鍘熶綔 - 此c文件用于画图的底层操作(基础操作) - 全屏操作包括 初始化 清屏 更新数组到屏幕 - 画线 点 旋转 封闭图形的填充 时间的基准更新 + 姝鏂囦欢鐢ㄤ簬鐢诲浘鐨勫簳灞傛搷浣(鍩虹鎿嶄綔) + 鍏ㄥ睆鎿嶄綔鍖呮嫭 鍒濆鍖 娓呭睆 鏇存柊鏁扮粍鍒板睆骞 + 鐢荤嚎 鐐 鏃嬭浆 灏侀棴鍥惧舰鐨勫~鍏 鏃堕棿鐨勫熀鍑嗘洿鏂 */ #include "oled_basic.h" @@ -22,25 +22,25 @@ static void Rotate(int x0,int y0,int*x,int*y,double angle,int direction); extern void DriverInit(void); extern unsigned int OledTimeMs; -//初始化oled +//鍒濆鍖杘led void InitGraph(void) { - //初始化引脚 配置oled并清屏 + //鍒濆鍖栧紩鑴 閰嶇疆oled骞舵竻灞 DriverInit(); } -//清屏 +//娓呭睆 void ClearScreen(void) { ClearScreenBuffer(0); } -//更新屏幕 注意此处特指刷新屏幕数组而不是临时数组 +//鏇存柊灞忓箷 娉ㄦ剰姝ゅ鐗规寚鍒锋柊灞忓箷鏁扮粍鑰屼笉鏄复鏃舵暟缁 void UpdateScreen(void) { UpdateScreenDisplay(); } /////////////////////////////////////////////////////////////////////////////////////////////// -//给选择的缓冲区写入8位数据 +//缁欓夋嫨鐨勭紦鍐插尯鍐欏叆8浣嶆暟鎹 void FillByte(int page,int x,unsigned char byte) { if(GetFillColor()) @@ -48,11 +48,11 @@ void FillByte(int page,int x,unsigned char byte) else WriteByteBuffer(page,x,ReadByteBuffer(page,x)&(~byte)); } -//给选择的缓冲区填充一个矩形 +//缁欓夋嫨鐨勭紦鍐插尯濉厖涓涓煩褰 void FillRect(int x,int y,int width,int height) { int i,j; - int temp =(y+height-1)/8-y/8; //需要填充的矩形在屏幕中所占的行数 屏幕被分为8大行 + int temp =(y+height-1)/8-y/8; //闇瑕佸~鍏呯殑鐭╁舰鍦ㄥ睆骞曚腑鎵鍗犵殑琛屾暟 灞忓箷琚垎涓8澶ц if(x>SCREEN_COLUMN ||y>SCREEN_ROW) return; for(i=x; i> 30); // 获取最高位:B[m-1] + tmp = (M >> 30); // 鑾峰彇鏈楂樹綅锛欱[m-1] M <<= 2; - if (tmp > 1) // 最高位为1 + if (tmp > 1) // 鏈楂樹綅涓1 { - N ++; // 结果当前位为1,否则为默认的0 + N ++; // 缁撴灉褰撳墠浣嶄负1锛屽惁鍒欎负榛樿鐨0 tmp -= N; } - for (i=15; i>0; i--) // 求剩余的15位 + for (i=15; i>0; i--) // 姹傚墿浣欑殑15浣 { - N <<= 1; // 左移一位 + N <<= 1; // 宸︾Щ涓浣 tmp <<= 2; - tmp += (M >> 30); // 假设 + tmp += (M >> 30); // 鍋囪 ttp = N; ttp = (ttp<<1)+1; M <<= 2; - if (tmp >= ttp) // 假设成立 + if (tmp >= ttp) // 鍋囪鎴愮珛 { tmp -= ttp; N ++; @@ -142,7 +142,7 @@ unsigned int sqrt_16(unsigned long M) return N; } -//需要优化atant2 cos sin算法 +//闇瑕佷紭鍖朼tant2 cos sin绠楁硶 static void Rotate(int x0,int y0,int*x,int*y,double angle,int direction) { int temp=(*y-y0)*(*y-y0)+(*x-x0)*(*x-x0); @@ -160,32 +160,32 @@ static void Rotate(int x0,int y0,int*x,int*y,double angle,int direction) } } -//功能:设置旋转角度 +//鍔熻兘:璁剧疆鏃嬭浆瑙掑害 void SetAngle(float angle) { _RoateValue.angle=RADIAN(angle); } -//功能:设置旋转方向 1为逆时针,0为顺时针 +//鍔熻兘:璁剧疆鏃嬭浆鏂瑰悜 1涓洪嗘椂閽堬紝0涓洪『鏃堕拡 void SetAnggleDir(int direction) { _RoateValue.direct=direction; } -//功能:设置旋转中心点 +//鍔熻兘:璁剧疆鏃嬭浆涓績鐐 void SetRotateCenter(int x0,int y0) { _RoateValue.center.x=x0; _RoateValue.center.y=y0; } -//功能:设置角度、旋转方向、旋转中心 +//鍔熻兘:璁剧疆瑙掑害銆佹棆杞柟鍚戙佹棆杞腑蹇 void SetRotateValue(int x,int y,float angle,int direct) { SetRotateCenter(x,y); SetAnggleDir(direct); SetAngle(angle); } -//功能:将一个坐标旋转一定角度 -//x,y:需要旋转的坐标 -//return:旋转后的坐标 +//鍔熻兘:灏嗕竴涓潗鏍囨棆杞竴瀹氳搴 +//x,y:闇瑕佹棆杞殑鍧愭爣 +//return锛氭棆杞悗鐨勫潗鏍 TypeXY GetRotateXY(int x,int y) { TypeXY temp; @@ -198,7 +198,7 @@ TypeXY GetRotateXY(int x,int y) } ///////////////////////////////////////////////////////////////////////////////////// -//由某一点开始 获取向上方向同颜色的像素点的个数 +//鐢辨煇涓鐐瑰紑濮 鑾峰彇鍚戜笂鏂瑰悜鍚岄鑹茬殑鍍忕礌鐐圭殑涓暟 unsigned char GetLengthUp(unsigned char x,unsigned char y,unsigned char value) { if(GetPointBuffer(x,y)==value) @@ -209,7 +209,7 @@ unsigned char GetLengthUp(unsigned char x,unsigned char y,unsigned char value) } return 0; } -//和上面函数同理 获取向下方向 +//鍜屼笂闈㈠嚱鏁板悓鐞 鑾峰彇鍚戜笅鏂瑰悜 unsigned char GetLengthDown(unsigned char x,unsigned char y,unsigned char value) { if(GetPointBuffer(x,y)==value) @@ -221,26 +221,26 @@ unsigned char GetLengthDown(unsigned char x,unsigned char y,unsigned char value) return 0; } ///////////////////////////////////////////////////////////////////////////////////////////// -//由一个点开始填充一个封闭图形 -//亲测此函数可能有问题 可能是套娃太多 内存不够用 -//测试效果是套娃几十个点后花屏 +//鐢变竴涓偣寮濮嬪~鍏呬竴涓皝闂浘褰 +//浜叉祴姝ゅ嚱鏁板彲鑳芥湁闂 鍙兘鏄濞冨お澶 鍐呭瓨涓嶅鐢 +//娴嬭瘯鏁堟灉鏄濞冨嚑鍗佷釜鐐瑰悗鑺卞睆 void FloodFill(unsigned char x,unsigned char y,int oldcolor,int newcolor) { UpdateScreen(); - if(GetPointBuffer(x,y)==oldcolor)//这个点的颜色不对 + if(GetPointBuffer(x,y)==oldcolor)//杩欎釜鐐圭殑棰滆壊涓嶅 { - SetPointBuffer(x,y,newcolor);//把这个点的颜色改为新颜色 - //开始套娃 - FloodFill(x-1,y,oldcolor,newcolor);//修改这个点周围的4个点的颜色 - FloodFill(x+1,y,oldcolor,newcolor);//用这个方法逐渐扩散 填完范围内所有颜色 + SetPointBuffer(x,y,newcolor);//鎶婅繖涓偣鐨勯鑹叉敼涓烘柊棰滆壊 + //寮濮嬪濞 + FloodFill(x-1,y,oldcolor,newcolor);//淇敼杩欎釜鐐瑰懆鍥寸殑4涓偣鐨勯鑹 + FloodFill(x+1,y,oldcolor,newcolor);//鐢ㄨ繖涓柟娉曢愭笎鎵╂暎 濉畬鑼冨洿鍐呮墍鏈夐鑹 FloodFill(x,y+1,oldcolor,newcolor); FloodFill(x,y-1,oldcolor,newcolor); } } -//功能:可用于填充一个封闭图形 -//x,y:在封闭图形任意一点坐标 -//oldcolor:封闭图形中旧的颜色 -//newcolor:填充的新颜色 +//鍔熻兘:鍙敤浜庡~鍏呬竴涓皝闂浘褰 +//x,y:鍦ㄥ皝闂浘褰换鎰忎竴鐐瑰潗鏍 +//oldcolor:灏侀棴鍥惧舰涓棫鐨勯鑹 +//newcolor:濉厖鐨勬柊棰滆壊 void FloodFill2(unsigned char x,unsigned char y,int oldcolor,int newcolor) { unsigned char h1=0,h2=0; @@ -273,9 +273,9 @@ unsigned int oled_pow(unsigned char m,unsigned char n) while(n--)result*=m; return result; } -//功能:固定帧刷新 -//OledTimeMs在OledTimeMsFunc()中被1ms中断持续调用 减到0位置 -//此函数放在while循环中 符合条件时刷新屏幕 +//鍔熻兘:鍥哄畾甯у埛鏂 +//OledTimeMs鍦∣ledTimeMsFunc()涓1ms涓柇鎸佺画璋冪敤 鍑忓埌0浣嶇疆 +//姝ゅ嚱鏁版斁鍦╳hile寰幆涓 绗﹀悎鏉′欢鏃跺埛鏂板睆骞 unsigned char FrameRateUpdateScreen(int value) { if(OledTimeMs==0) @@ -287,10 +287,10 @@ unsigned char FrameRateUpdateScreen(int value) } return 0; } -//硬核延时函数 -void WaitTimeMs(unsigned int time) -{ - OledTimeMs=time; - while(OledTimeMs); -} +////纭牳寤舵椂鍑芥暟 +//void WaitTimeMs(unsigned int time) +//{ +// OledTimeMs=time; +// while(OledTimeMs); +//} diff --git a/oledlib/oled_basic.h b/oledlib/oled_basic.h index 1c415258b6ddfef89308d350b84d94069bf21df3..eb45d48235200500b5ce998c1289b0e1492c09d5 100644 --- a/oledlib/oled_basic.h +++ b/oledlib/oled_basic.h @@ -36,10 +36,7 @@ typedef struct ROATE #define SPI_2 (21) -//设置背景模式,0为透明,1为正常。 -void SetTextBkMode(unsigned char value); -//获取当前背景模式 -unsigned char GetTextBkMode(void); + void SetPointBuffer(int x,int y,int value); unsigned char GetPointBuffer(int x,int y); void UpdateScreen(void); diff --git a/oledlib/oled_buffer.c b/oledlib/oled_buffer.c index b81b674e3cf2a4c895119c312c96c2ebc1241757..2ab8c276f4d6196e49a756c4db55fecf7c930f92 100644 --- a/oledlib/oled_buffer.c +++ b/oledlib/oled_buffer.c @@ -1,68 +1,68 @@ /* - 原作者哔哩哔哩: MjGame https://space.bilibili.com/38673747 - 同GifHub: maoyongjie https://github.com/hello-myj/stm32_oled/ - 代码整理注释删减增加优化等 哔哩哔哩: 一只程序缘 https://space.bilibili.com/237304109 - 整理之前的原代码随本代码一同提供,浏览以上网址获取更多相关信息,本代码以征得原作同意,感谢原作 + 鍘熶綔鑰呭摂鍝╁摂鍝: MjGame https://space.bilibili.com/38673747 + 鍚孏ifHub: maoyongjie https://github.com/hello-myj/stm32_oled/ + 浠g爜鏁寸悊娉ㄩ噴鍒犲噺澧炲姞浼樺寲绛 鍝斿摡鍝斿摡: 涓鍙▼搴忕紭 https://space.bilibili.com/237304109 + 鏁寸悊涔嬪墠鐨勫師浠g爜闅忔湰浠g爜涓鍚屾彁渚,娴忚浠ヤ笂缃戝潃鑾峰彇鏇村鐩稿叧淇℃伅,鏈唬鐮佷互寰佸緱鍘熶綔鍚屾剰,鎰熻阿鍘熶綔 - 此c文件用于对屏幕数组进行操作 - 数组包括屏幕缓冲和临时缓冲 - 函数只会目前选择的缓冲进行操作 - 目前选择的缓冲可通过函数设置上面两个缓冲之一 + 姝鏂囦欢鐢ㄤ簬瀵瑰睆骞曟暟缁勮繘琛屾搷浣 + 鏁扮粍鍖呮嫭灞忓箷缂撳啿鍜屼复鏃剁紦鍐 + 鍑芥暟鍙細鐩墠閫夋嫨鐨勭紦鍐茶繘琛屾搷浣 + 鐩墠閫夋嫨鐨勭紦鍐插彲閫氳繃鍑芥暟璁剧疆涓婇潰涓や釜缂撳啿涔嬩竴 - 然后就是提供读或写入取缓冲中的8位数据或1位数据的接口 - 最后是更新缓冲数据到屏幕 + 鐒跺悗灏辨槸鎻愪緵璇绘垨鍐欏叆鍙栫紦鍐蹭腑鐨8浣嶆暟鎹垨1浣嶆暟鎹殑鎺ュ彛 + 鏈鍚庢槸鏇存柊缂撳啿鏁版嵁鍒板睆骞 */ #include "oled_buffer.h" #include "oled_config.h" #include "oled_color.h" #include "string.h" -#include "usart.h" -//定义缓冲 屏幕缓冲区和临时缓冲区 -unsigned char ScreenBuffer[SCREEN_PAGE_NUM][SCREEN_COLUMN]={0}; //屏幕缓冲 -unsigned char TempBuffer[SCREEN_PAGE_NUM][SCREEN_COLUMN]={0}; //临时操作缓冲 -static _Bool _SelectedBuffer=SCREEN_BUFFER; //当前选择的缓冲区 + +//瀹氫箟缂撳啿 灞忓箷缂撳啿鍖哄拰涓存椂缂撳啿鍖 +unsigned char ScreenBuffer[SCREEN_PAGE_NUM][SCREEN_COLUMN]={0}; //灞忓箷缂撳啿 +unsigned char TempBuffer[SCREEN_PAGE_NUM][SCREEN_COLUMN]={0}; //涓存椂鎿嶄綔缂撳啿 +static _Bool _SelectedBuffer=SCREEN_BUFFER; //褰撳墠閫夋嫨鐨勭紦鍐插尯 #define BUFFERSIZE sizeof(ScreenBuffer) extern void UpdateTempBuffer(void); extern void UpdateScreenBuffer(void); /////////////////////////////////////////////////////////////////// -//设置选择 屏幕缓冲 +//璁剧疆閫夋嫨 灞忓箷缂撳啿 void SetScreenBuffer(void) { _SelectedBuffer=SCREEN_BUFFER; } -//设置选择 临时缓冲 +//璁剧疆閫夋嫨 涓存椂缂撳啿 void SetTempBuffer(void) { _SelectedBuffer=TEMP_BUFFER; } -//获取程序目前选择的缓冲区 +//鑾峰彇绋嬪簭鐩墠閫夋嫨鐨勭紦鍐插尯 unsigned char GetSelectedBuffer(void) { return _SelectedBuffer; } -//功能:清除屏幕缓冲数据 +//鍔熻兘:娓呴櫎灞忓箷缂撳啿鏁版嵁 void ClearScreenBuffer(unsigned char val) { memset(ScreenBuffer,val,sizeof(ScreenBuffer)); } -//功能:清除临时缓冲数据 +//鍔熻兘:娓呴櫎涓存椂缂撳啿鏁版嵁 void ClearTempBuffer(void) { memset(TempBuffer,0,sizeof(TempBuffer)); } -//对临时缓冲进行一些操作 -//func:执行的功能可选择的参数如下 +//瀵逛复鏃剁紦鍐茶繘琛屼竴浜涙搷浣 +//func:鎵ц鐨勫姛鑳藉彲閫夋嫨鐨勫弬鏁板涓 /* - TEMPBUFF_COPY_TO_SCREEN, 将temp缓冲复制到屏幕缓冲 - TEMPBUFF_CLEAN, 清楚掉temp缓冲数据 - TEMPBUFF_COVER_L, 将temp缓冲的数据取反再覆盖掉屏幕上的数据 - TEMPBUFF_COVER_H 将temp缓冲的数据覆盖掉屏幕上的数据 */ + TEMPBUFF_COPY_TO_SCREEN, 灏唗emp缂撳啿澶嶅埗鍒板睆骞曠紦鍐 + TEMPBUFF_CLEAN, 娓呮鎺塼emp缂撳啿鏁版嵁 + TEMPBUFF_COVER_L, 灏唗emp缂撳啿鐨勬暟鎹彇鍙嶅啀瑕嗙洊鎺夊睆骞曚笂鐨勬暟鎹 + TEMPBUFF_COVER_H 灏唗emp缂撳啿鐨勬暟鎹鐩栨帀灞忓箷涓婄殑鏁版嵁 */ void TempBufferFunc(int func) { int i,j; @@ -90,12 +90,12 @@ void TempBufferFunc(int func) } /////////////////////////////////////////////////////////////////////////////////////////// -//读取选择的缓冲区的8位数据 +//璇诲彇閫夋嫨鐨勭紦鍐插尯鐨8浣嶆暟鎹 unsigned char ReadByteBuffer(int page,int x) { return _SelectedBuffer? ScreenBuffer[page][x] :TempBuffer[page][x]; } -//写入读取选择的缓冲区8位数据 +//鍐欏叆璇诲彇閫夋嫨鐨勭紦鍐插尯8浣嶆暟鎹 void WriteByteBuffer(int page,int x,unsigned char byte) { if(_SelectedBuffer) @@ -108,10 +108,10 @@ void WriteByteBuffer(int page,int x,unsigned char byte) } } -//设置当前选择的缓冲区 的 某一个点的亮灭 +//璁剧疆褰撳墠閫夋嫨鐨勭紦鍐插尯 鐨 鏌愪竴涓偣鐨勪寒鐏 void SetPointBuffer(int x,int y,int value) { - if(x>SCREEN_COLUMN-1 ||y>SCREEN_ROW-1) //超出范围 + if(x>SCREEN_COLUMN-1 ||y>SCREEN_ROW-1) //瓒呭嚭鑼冨洿 return; if(_SelectedBuffer) { @@ -128,17 +128,17 @@ void SetPointBuffer(int x,int y,int value) TempBuffer[y/SCREEN_PAGE_NUM][x] &= ~(1<<(y%SCREEN_PAGE_NUM)); } } -//获取当前选择的缓冲区 的 某一点的颜色 +//鑾峰彇褰撳墠閫夋嫨鐨勭紦鍐插尯 鐨 鏌愪竴鐐圭殑棰滆壊 unsigned char GetPointBuffer(int x,int y) { - if(x>SCREEN_COLUMN-1 ||y>SCREEN_ROW-1) //超出范围 + if(x>SCREEN_COLUMN-1 ||y>SCREEN_ROW-1) //瓒呭嚭鑼冨洿 return 0; if(_SelectedBuffer) return (ScreenBuffer[y/SCREEN_PAGE_NUM][x]>>(y%SCREEN_PAGE_NUM))&0x01; else return (TempBuffer[y/SCREEN_PAGE_NUM][x]>>(y%SCREEN_PAGE_NUM))&0x01; } -//刷新屏幕显示 +//鍒锋柊灞忓箷鏄剧ず void UpdateScreenDisplay(void) { UpdateScreenBuffer(); diff --git a/oledlib/oled_config.c b/oledlib/oled_config.c index 766ca73fe922c32618e54f7edf2271d2127f461f..4ff39f2414ae4ec6412467f19935634f53468be5 100644 --- a/oledlib/oled_config.c +++ b/oledlib/oled_config.c @@ -1,45 +1,49 @@ /* - 原作者哔哩哔哩: MjGame https://space.bilibili.com/38673747 - 同GifHub: maoyongjie https://github.com/hello-myj/stm32_oled/ - 代码整理注释删减增加优化等 哔哩哔哩: 一只程序缘 https://space.bilibili.com/237304109 - 整理之前的原代码随本代码一同提供,浏览以上网址获取更多相关信息,本代码以征得原作同意,感谢原作 + 鍘熶綔鑰呭摂鍝╁摂鍝: MjGame https://space.bilibili.com/38673747 + 鍚孏ifHub: maoyongjie https://github.com/hello-myj/stm32_oled/ + 浠g爜鏁寸悊娉ㄩ噴鍒犲噺澧炲姞浼樺寲绛 鍝斿摡鍝斿摡: 涓鍙▼搴忕紭 https://space.bilibili.com/237304109 + 鏁寸悊涔嬪墠鐨勫師浠g爜闅忔湰浠g爜涓鍚屾彁渚,娴忚浠ヤ笂缃戝潃鑾峰彇鏇村鐩稿叧淇℃伅,鏈唬鐮佷互寰佸緱鍘熶綔鍚屾剰,鎰熻阿鍘熶綔 - 此c文件用于配置oled - 例如初始化oled引脚 刷新oled - 注意!!! - 如需演示动画效果 OledTimeMsFunc()需放入1ms中断等中1ms调用一次为库提供时间基准 原作是放入滴答定时器中 + 姝鏂囦欢鐢ㄤ簬閰嶇疆oled + 渚嬪鍒濆鍖杘led寮曡剼 鍒锋柊oled + 娉ㄦ剰!!! + 濡傞渶婕旂ず鍔ㄧ敾鏁堟灉 OledTimeMsFunc()闇鏀惧叆1ms涓柇绛変腑1ms璋冪敤涓娆′负搴撴彁渚涙椂闂村熀鍑 鍘熶綔鏄斁鍏ユ淮绛斿畾鏃跺櫒涓 */ #include "oled_config.h" #include "oled_driver.h" #include "delay.h" -#include "draw_api.h" + extern unsigned char ScreenBuffer[SCREEN_PAGE_NUM][SCREEN_COLUMN]; extern unsigned char TempBuffer[SCREEN_PAGE_NUM][SCREEN_COLUMN]; -unsigned int OledTimeMs=0; //时间基准 +unsigned int OledTimeMs=0; //鏃堕棿鍩哄噯 -//初始化图形库,请将硬件初始化信息放入此中 +//鍒濆鍖栧浘褰㈠簱锛岃灏嗙‖浠跺垵濮嬪寲淇℃伅鏀惧叆姝や腑 void DriverInit(void) { - SPI_Configuration(); //初始化接口 - OLED_Init(); //初始化配置oled + #if (TRANSFER_METHOD == HW_IIC) || (TRANSFER_METHOD == SW_IIC) + I2C_Configuration(); + #elif (TRANSFER_METHOD == HW_SPI) || (TRANSFER_METHOD == SW_SPI) + SPI_Configuration(); //鍒濆鍖栨帴鍙 + #endif + OLED_Init(); //鍒濆鍖栭厤缃畂led } -//将ScreenBuffer屏幕缓存的内容显示到屏幕上 +//灏哠creenBuffer灞忓箷缂撳瓨鐨勫唴瀹规樉绀哄埌灞忓箷涓 void UpdateScreenBuffer(void) { OLED_FILL(ScreenBuffer[0]); } -//将TempBuffer临时缓存的内容显示到屏幕上 +//灏員empBuffer涓存椂缂撳瓨鐨勫唴瀹规樉绀哄埌灞忓箷涓 void UpdateTempBuffer(void) { OLED_FILL(TempBuffer[0]); } ////////////////////////////////////////////////////////// -//请将此函数放入1ms中断里,为图形提供时基 -//系统时间基准主要用于FrameRateUpdateScreen()中固定帧率刷新屏幕 +//璇峰皢姝ゅ嚱鏁版斁鍏1ms涓柇閲岋紝涓哄浘褰㈡彁渚涙椂鍩 +//绯荤粺鏃堕棿鍩哄噯涓昏鐢ㄤ簬FrameRateUpdateScreen()涓浐瀹氬抚鐜囧埛鏂板睆骞 void OledTimeMsFunc(void) { if(OledTimeMs != 0x00) @@ -47,7 +51,7 @@ void OledTimeMsFunc(void) OledTimeMs--; } } -//图形库普通的延时函数 需要用户自己配置 这里在delay.c中调用 +//鍥惧舰搴撴櫘閫氱殑寤舵椂鍑芥暟 闇瑕佺敤鎴疯嚜宸遍厤缃 杩欓噷鍦╠elay.c涓皟鐢 void DelayMs(u16 ms) { delay_ms(ms); diff --git a/oledlib/oled_config.h b/oledlib/oled_config.h index 0d935cf115e57683e161524cd944410e911fd46d..34995f522c88f968c321119730a3e73d8587e832 100644 --- a/oledlib/oled_config.h +++ b/oledlib/oled_config.h @@ -1,18 +1,96 @@ + #ifndef OLED_CONFIG_H #define OLED_CONFIG_H + #include "oled_basic.h" +//瀹氫箟灞忓箷鍩烘湰鐘跺喌 +//淇濇寔浜嗗彲鎷撳睍鎬 濡傛灉鎹㈢敤鍏朵粬绫诲瀷灞 +//鍥犳敞鎰忓叾浠栭厤濂梒鏂囦欢涓敤浜嗚繖浜涘畯瀹氫箟鐨勯儴鍒 + +//閰嶇疆鍥惧舰搴 +/*****************************************************************/ +//閫夋嫨灞忓箷绫诲瀷 +//1.HW_IIC 纭欢IIC +//2.SW_IIC 杞欢IIC +//3.HW_SPI 纭欢SPI +//4.SW_SPI 杞欢IIC +//5.HW_8080 纭欢8080 +//鐜板湪涓嶆敮鎸5 +/*****************************************************************/ +#define TRANSFER_METHOD (SW_IIC) //濡傛灉閫夋嫨浜嗙‖浠堕┍鍔紝璇峰湪涓嬫柟閫夋嫨纭欢缂栧彿 + +#if (TRANSFER_METHOD==HW_IIC) + //IIC_1: PB6 -- SCL; PB7 -- SDA + //IIC_2: PB10-- SCL; PB11 --SDA + #define USE_HW_IIC IIC_1 //IIC2椹卞姩杩樻湭娴嬭瘯锛岀幇鍦ㄤ娇鐢ㄧ殑IIC1 + +#elif (TRANSFER_METHOD==HW_SPI) + //濡傞渶鏇存崲鐗囬夈佸浣嶃佹帶鍒剁瓑寮曡剼鍘籵led_driver.h璁剧疆 + //SPI_1: 娌℃坊鍔燬PI1锛屽闇瑕丼PI1锛屽埌oled_driver.h,鑷娣诲姞 + //SPI_2: PB10--RES; PB11--DC; PB12--CS;PB13--D0;PB15--D1; + #define USE_HW_SPI SPI_2 //SPI1纭欢椹卞姩骞舵湭娣诲姞 +#endif + +/*****************************************************************/ +//閫夋嫨瀛楀簱鏉ユ簮 +//0.FONT_FROM_NULL 涓嶄娇鐢ㄥ瓧搴 +//1.FONT_FROM_SCREEN 灞忓箷鑷甫 +//2.FONT_FROM_EXTL 寮曠敤澶栭儴 +//3.FONT_FROM_FLASH 浠巉lash璇诲彇 +//4.FONT_FROM_EEMPROM 浠巈eprom璇诲彇 +//5.FONT_FROM_SOFT 杞欢鍙栨ā锛岃繖涓細鍗犵敤寰堝鍐呭瓨 +//鐜板湪鍙湁杞欢鍙栨ā瀛楀簱锛 +/*****************************************************************/ +#define FONT_SOURCE (FONT_FROM_SOFT) -//定义屏幕基本状况 -//保持了可拓展性 如果换用其他类型屏 -//因注意其他配套c文件中用了这些宏定义的部分 +/*****************************************************************/ +//閫夋嫨灞忓箷绫诲瀷 +//1.OLED_12864 +//2.OLED_12832 +//3.CUSTOMIZE 鑷畾涔 +//鐜板湪浠呮敮鎸丱LED_12864 +/*****************************************************************/ +#define SCREEN_TYPE (OLED_12864) -#define OLED_12864 //屏幕类型 -#define SCREEN_PAGE_NUM (8) //总行数 (大行) -#define SCREEN_PAGEDATA_NUM (128) //每大行的列数 -#define SCREEN_ROW (64) //总行数 -#define SCREEN_COLUMN (128) //总列数 +#if (SCREEN_TYPE==OLED_12864) + #define OLED_12864 //灞忓箷绫诲瀷 + #define SCREEN_PAGE_NUM (8) //鎬昏鏁 (澶ц) + #define SCREEN_PAGEDATA_NUM (128) //姣忓ぇ琛岀殑鍒楁暟 + #define SCREEN_ROW (64) //鎬昏鏁 + #define SCREEN_COLUMN (128) //鎬诲垪鏁 + #if 0 + #define SCREEN_PHY_X (21.744) + #define SCREEN_PHY_Y (10.864) + #endif +#elif (SCREEN_TYPE==OLED_12832) + #define SCREEN_PAGE_NUM (4) + #define SCREEN_PAGEDATA_NUM (128) + #define SCREEN_COLUMN (128) + #define SCREEN_ROW (32) + #if 0 + #define SCREEN_PHY_X () + #define SCREEN_PHY_Y () + #endif +#elif (SCREEN_TYPE==CUSTOMIZE) + /*璋冩暣鐐归樀鍒嗚鲸鐜128*64,瀹藉害:128鍒楋紝楂樺害:64琛*/ + #define SCREEN_COLUMN (128) + #define SCREEN_ROW (64) + /*閰嶇疆涓甯ф暟鎹兘鍐欏灏戦〉*/ + #define SCREEN_PAGE_NUM (8) + /*閰嶇疆涓椤佃兘鍐欏灏戞暟鎹*/ + #define SCREEN_PAGEDATA_NUM (128) + #if 0 + /*璋冩暣鐗╃悊灏哄*/ + #define SCREEN_PHY_X () + #define SCREEN_PHY_Y () + #endif #endif + +#endif //OLED_CONFIG_H + + + diff --git a/oledlib/oled_draw.c b/oledlib/oled_draw.c index e51a4193c21414c10ffe5175e738967af472838e..ddf4f711ee513675fbf153fa01c9a1011fdea4b7 100644 --- a/oledlib/oled_draw.c +++ b/oledlib/oled_draw.c @@ -1,16 +1,16 @@ /* - 原作者哔哩哔哩: MjGame https://space.bilibili.com/38673747 - 同GifHub: maoyongjie https://github.com/hello-myj/stm32_oled/ - 代码整理注释删减增加优化等 哔哩哔哩: 一只程序缘 https://space.bilibili.com/237304109 - 整理之前的原代码随本代码一同提供,浏览以上网址获取更多相关信息,本代码以征得原作同意,感谢原作 + 鍘熶綔鑰呭摂鍝╁摂鍝: MjGame https://space.bilibili.com/38673747 + 鍚孏ifHub: maoyongjie https://github.com/hello-myj/stm32_oled/ + 浠g爜鏁寸悊娉ㄩ噴鍒犲噺澧炲姞浼樺寲绛 鍝斿摡鍝斿摡: 涓鍙▼搴忕紭 https://space.bilibili.com/237304109 + 鏁寸悊涔嬪墠鐨勫師浠g爜闅忔湰浠g爜涓鍚屾彁渚,娴忚浠ヤ笂缃戝潃鑾峰彇鏇村鐩稿叧淇℃伅,鏈唬鐮佷互寰佸緱鍘熶綔鍚屾剰,鎰熻阿鍘熶綔 - 此c文件用于画图和字符操作(高级操作) - (主要)由打点为基础 - 再 线 折线 - 再画和填充 矩形 三角形 圆 椭圆 圆角矩形 - 然后是 图片 字符 字符串 - 最后是 汉字 + 姝鏂囦欢鐢ㄤ簬鐢诲浘鍜屽瓧绗︽搷浣(楂樼骇鎿嶄綔) + (涓昏)鐢辨墦鐐逛负鍩虹 + 鍐 绾 鎶樼嚎 + 鍐嶇敾鍜屽~鍏 鐭╁舰 涓夎褰 鍦 妞渾 鍦嗚鐭╁舰 + 鐒跺悗鏄 鍥剧墖 瀛楃 瀛楃涓 + 鏈鍚庢槸 姹夊瓧 */ #include "oled_draw.h" @@ -20,14 +20,14 @@ #include "math.h" #include "oled_bmp.h" #include "oled_font.h" -#include "usart.h" -//画图光标 + +//鐢诲浘鍏夋爣 static int _pointx=0; static int _pointy=0; //////////////////////////////////////////////////////////////////// -//以下4个函数是对当前光标的设置 供以下绘制函数调用 用户不直接使用 +//浠ヤ笅4涓嚱鏁版槸瀵瑰綋鍓嶅厜鏍囩殑璁剧疆 渚涗互涓嬬粯鍒跺嚱鏁拌皟鐢 鐢ㄦ埛涓嶇洿鎺ヤ娇鐢 void MoveTo(int x,int y) { _pointx=x; @@ -58,12 +58,12 @@ void LineTo(int x,int y) } /////////////////////////////////////////////////////////////////////////////////// -//绘制一个点 +//缁樺埗涓涓偣 void DrawPixel(int x,int y) { SetPointBuffer(x,y,GetDrawColor()); } -//得到某个点的颜色 +//寰楀埌鏌愪釜鐐圭殑棰滆壊 Type_color GetPixel(int x,int y) { if(GetPointBuffer(x,y)) @@ -73,8 +73,8 @@ Type_color GetPixel(int x,int y) } //////////////////////////////////////////////////////////////////////////////////// -//划线 -//参数:起点坐标 终点坐标 +//鍒掔嚎 +//鍙傛暟:璧风偣鍧愭爣 缁堢偣鍧愭爣 void DrawLine(int x1,int y1,int x2,int y2) { unsigned short us; @@ -83,43 +83,43 @@ void DrawLine(int x1,int y1,int x2,int y2) int lError_X = 0, lError_Y = 0, lDelta_X, lDelta_Y, lDistance; int lIncrease_X, lIncrease_Y; - lDelta_X = x2 - x1; //计算坐标增量 + lDelta_X = x2 - x1; //璁$畻鍧愭爣澧為噺 lDelta_Y = y2 - y1; usX_Current = x1; usY_Current = y1; if ( lDelta_X > 0 ) - lIncrease_X = 1; //设置单步正方向 + lIncrease_X = 1; //璁剧疆鍗曟姝f柟鍚 else if ( lDelta_X == 0 ) - lIncrease_X = 0; //垂直线 + lIncrease_X = 0; //鍨傜洿绾 else { - lIncrease_X = -1; //设置单步反方向 + lIncrease_X = -1; //璁剧疆鍗曟鍙嶆柟鍚 lDelta_X = - lDelta_X; } - //Y轴的处理方式与上图X轴的处理方式同理 + //Y杞寸殑澶勭悊鏂瑰紡涓庝笂鍥綳杞寸殑澶勭悊鏂瑰紡鍚岀悊 if ( lDelta_Y > 0 ) lIncrease_Y = 1; else if ( lDelta_Y == 0 ) - lIncrease_Y = 0; //水平线 + lIncrease_Y = 0; //姘村钩绾 else { lIncrease_Y = -1; lDelta_Y = - lDelta_Y; } - //选取不那么陡的方向依次画点 + //閫夊彇涓嶉偅涔堥櫋鐨勬柟鍚戜緷娆$敾鐐 if ( lDelta_X > lDelta_Y ) lDistance = lDelta_X; else lDistance = lDelta_Y; - //依次画点 进入缓存区 画好后再刷新缓冲区就好啦 - for ( us = 0; us <= lDistance + 1; us ++ ) //画线输出 + //渚濇鐢荤偣 杩涘叆缂撳瓨鍖 鐢诲ソ鍚庡啀鍒锋柊缂撳啿鍖哄氨濂藉暒 + for ( us = 0; us <= lDistance + 1; us ++ ) //鐢荤嚎杈撳嚭 { - SetPointBuffer(usX_Current,usY_Current,GetDrawColor()); //画点 + SetPointBuffer(usX_Current,usY_Current,GetDrawColor()); //鐢荤偣 lError_X += lDelta_X ; lError_Y += lDelta_Y ; @@ -136,7 +136,7 @@ void DrawLine(int x1,int y1,int x2,int y2) } } } -//快速划线 专用于画横平竖直的线 提高效率 +//蹇熷垝绾 涓撶敤浜庣敾妯钩绔栫洿鐨勭嚎 鎻愰珮鏁堢巼 void DrawFastHLine(int x, int y, unsigned char w) { int end = x+w; @@ -148,7 +148,7 @@ void DrawFastHLine(int x, int y, unsigned char w) SetPointBuffer(a,y,color); } } -//快速划线 专用于画横平竖直的线 提高效率 +//蹇熷垝绾 涓撶敤浜庣敾妯钩绔栫洿鐨勭嚎 鎻愰珮鏁堢巼 void DrawFastVLine(int x, int y, unsigned char h) { int end = y+h; @@ -160,7 +160,7 @@ void DrawFastVLine(int x, int y, unsigned char h) SetPointBuffer(x,a,color); } } -//绘制折线 开始和转折点的坐标 总点个数 +//缁樺埗鎶樼嚎 寮濮嬪拰杞姌鐐圭殑鍧愭爣 鎬荤偣涓暟 void DrawPolyLineTo(const TypeXY *points,int num) { int i=0; @@ -172,7 +172,7 @@ void DrawPolyLineTo(const TypeXY *points,int num) } /////////////////////////////////////////////////////////////////////////////////////// -//使用对角点填充矩形 +//浣跨敤瀵硅鐐瑰~鍏呯煩褰 void DrawRect1(int left,int top,int right,int bottom) { DrawLine ( left, top, right, top ); @@ -180,13 +180,13 @@ void DrawRect1(int left,int top,int right,int bottom) DrawLine ( left, top, left, bottom ); DrawLine ( right , top, right , bottom ); } -//功能:使用对角点填充矩形 +//鍔熻兘:浣跨敤瀵硅鐐瑰~鍏呯煩褰 void DrawFillRect1(int left,int top,int right,int bottom) { DrawRect1(left,top,right,bottom); FillRect(left+1,top+1,right-left-1,bottom-top-1); } -//左上角坐标 矩形宽高 +//宸︿笂瑙掑潗鏍 鐭╁舰瀹介珮 void DrawRect2(int left,int top,int width,int height) { DrawLine ( left, top, left+width-1, top ); @@ -194,28 +194,28 @@ void DrawRect2(int left,int top,int width,int height) DrawLine ( left, top, left, top+height-1); DrawLine ( left+width-1 , top, left+width-1 , top+height-1); } -//填充矩形 +//濉厖鐭╁舰 void DrawFillRect2(int left,int top,int width,int height) { - //先用上面的函数画外框 + //鍏堢敤涓婇潰鐨勫嚱鏁扮敾澶栨 DrawRect2(left,top,width,height); - //然后填充实心 + //鐒跺悗濉厖瀹炲績 FillRect(left+1,top+1,width-1,height-1); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//画圆 +//鐢诲渾 void DrawCircle ( int usX_Center, int usY_Center, int usRadius) { short sCurrentX, sCurrentY; short sError; sCurrentX = 0; sCurrentY = usRadius; - sError = 3 - ( usRadius << 1 ); //判断下个点位置的标志 + sError = 3 - ( usRadius << 1 ); //鍒ゆ柇涓嬩釜鐐逛綅缃殑鏍囧織 while ( sCurrentX <= sCurrentY ) { - //此处画圆打点的方法和画圆角矩形的四分之一圆弧的函数有点像 - SetPointBuffer ( usX_Center + sCurrentX, usY_Center + sCurrentY ,GetDrawColor()); //1,研究对象 + //姝ゅ鐢诲渾鎵撶偣鐨勬柟娉曞拰鐢诲渾瑙掔煩褰㈢殑鍥涘垎涔嬩竴鍦嗗姬鐨勫嚱鏁版湁鐐瑰儚 + SetPointBuffer ( usX_Center + sCurrentX, usY_Center + sCurrentY ,GetDrawColor()); //1锛岀爺绌跺璞 SetPointBuffer ( usX_Center - sCurrentX, usY_Center + sCurrentY ,GetDrawColor()); //2 SetPointBuffer ( usX_Center - sCurrentY, usY_Center + sCurrentX ,GetDrawColor()); //3 SetPointBuffer ( usX_Center - sCurrentY, usY_Center - sCurrentX ,GetDrawColor()); //4 @@ -233,7 +233,7 @@ void DrawCircle ( int usX_Center, int usY_Center, int usRadius) } } } -//填充圆 +//濉厖鍦 void DrawFillCircle( int usX_Center, int usY_Center, int r) { DrawFastVLine(usX_Center, usY_Center-r, 2*r+1); @@ -241,8 +241,8 @@ void DrawFillCircle( int usX_Center, int usY_Center, int r) } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//画部分圆 -//圆心坐标 半径 4份圆要画哪一份或哪几份 +//鐢婚儴鍒嗗渾 +//鍦嗗績鍧愭爣 鍗婂緞 4浠藉渾瑕佺敾鍝竴浠芥垨鍝嚑浠 void DrawCircleHelper(int x0, int y0, unsigned char r, unsigned char cornername) { int f = 1 - r; @@ -265,32 +265,32 @@ void DrawCircleHelper(int x0, int y0, unsigned char r, unsigned char cornername) ddF_x += 2; f += ddF_x; - if (cornername & 0x4)//右上 + if (cornername & 0x4)//鍙充笂 { - //此处画圆的方式是交替打点 从2边打到中间 最终x SCREEN_COLUMN - 1 || y + h < 0 || y > SCREEN_ROW - 1) + return; + for (yi = 0; yi < h; yi++) { + for (xi = 0; xi < w; xi++ ) { + if (pgm_read_byte(bitmap + yi * byteWidth + xi / 8) & (1 << (xi & 7))) { + SetPointBuffer(x + xi, y + yi, GetDrawColor()); + } + } + } +} + ////////////////////////////////////////////////////////////////////////////////////////////////// -//显示一个字符 -//关于字体尺寸及使用请看SetFontSize()的注释 -//当size=0时 x为第几行 y为第几列 +//鏄剧ず涓涓瓧绗 +//鍏充簬瀛椾綋灏哄鍙婁娇鐢ㄨ鐪婼etFontSize()鐨勬敞閲 +//褰搒ize=0鏃 x涓虹鍑犺 y涓虹鍑犲垪 void DrawChar(int x, int y, unsigned char c) { int i,j; unsigned char draw_background,bg,a,b,size,color; - size=GetFontSize(); //字体尺寸 - color=GetDrawColor(); //字体颜色 1白0黑 - bg=GetTextBkMode(); //写字的时候字的背景的颜色 1白0黑 - draw_background= bg != color; //这两个颜色要不一样字才看得到 + size=GetFontSize(); //瀛椾綋灏哄 + color=GetDrawColor(); //瀛椾綋棰滆壊 1鐧0榛 + bg=GetTextBkMode(); //鍐欏瓧鐨勬椂鍊欏瓧鐨勮儗鏅殑棰滆壊 1鐧0榛 + draw_background= bg != color; //杩欎袱涓鑹茶涓嶄竴鏍峰瓧鎵嶇湅寰楀埌 - if(!size)//默认字符大小 + if(!size)//榛樿瀛楃澶у皬 { if((x>6) || (y>SCREEN_COLUMN-8)) return; - c=c-' '; //得到偏移后的位置 + c=c-' '; //寰楀埌鍋忕Щ鍚庣殑浣嶇疆 for(i=0;i<8;i++) WriteByteBuffer(x,y+i,F8X16[c*16+i]); for(i=0;i<8;i++) WriteByteBuffer(x+1,y+i,F8X16[c*16+i+8]); } - else//使用原作粗体字符 + else//浣跨敤鍘熶綔绮椾綋瀛楃 { - //判断一个字符的上下左右是否超出边界范围 + //鍒ゆ柇涓涓瓧绗︾殑涓婁笅宸﹀彸鏄惁瓒呭嚭杈圭晫鑼冨洿 if ((x >= SCREEN_COLUMN) || // Clip right (y >= SCREEN_ROW) || // Clip bottom ((x + 5 * size - 1) < 0) || // Clip left @@ -797,8 +815,8 @@ void DrawChar(int x, int y, unsigned char c) for (i=0; i<6; i++) { int line; - //一个字符在font5x7中由一行6个char表示 - //line为这个字符的第某行内容 + //涓涓瓧绗﹀湪font5x7涓敱涓琛6涓猚har琛ㄧず + //line涓鸿繖涓瓧绗︾殑绗煇琛屽唴瀹 if (i == 5) line = 0x0; else @@ -806,10 +824,10 @@ void DrawChar(int x, int y, unsigned char c) for (j=0; j<8; j++) { - unsigned char draw_color = (line & 0x1) ? color : bg;//目前需要填充的颜色是0 就是背景色 1就是字体色 + unsigned char draw_color = (line & 0x1) ? color : bg;//鐩墠闇瑕佸~鍏呯殑棰滆壊鏄0 灏辨槸鑳屾櫙鑹 1灏辨槸瀛椾綋鑹 - //不同号大小的字体只是最基础字体的放大倍数 这点要注意 - //比如基础字是1个像素 放大后就是4个像素 再就是9个像素 达到马赛克的放大效果 + //涓嶅悓鍙峰ぇ灏忕殑瀛椾綋鍙槸鏈鍩虹瀛椾綋鐨勬斁澶у嶆暟 杩欑偣瑕佹敞鎰 + //姣斿鍩虹瀛楁槸1涓儚绱 鏀惧ぇ鍚庡氨鏄4涓儚绱 鍐嶅氨鏄9涓儚绱 杈惧埌椹禌鍏嬬殑鏀惧ぇ鏁堟灉 if (draw_color || draw_background) for ( a = 0; a < size; a++ ) for ( b = 0; b < size; b++ ) @@ -820,13 +838,13 @@ void DrawChar(int x, int y, unsigned char c) } } } -//显示字符串 就是显示多次显示字符 +//鏄剧ず瀛楃涓 灏辨槸鏄剧ず澶氭鏄剧ず瀛楃 void DrawString(int x, int y,char *str) { unsigned char j=0,tempx=x,tempy=y; unsigned char size=GetFontSize(); - if(!size)//默认字体 + if(!size)//榛樿瀛椾綋 { while (str[j]!='\0') { @@ -836,7 +854,7 @@ void DrawString(int x, int y,char *str) j++; } } - else//使用原作粗体字符 + else//浣跨敤鍘熶綔绮椾綋瀛楃 { while (str[j]!='\0') { @@ -853,7 +871,7 @@ void DrawString(int x, int y,char *str) } } } -//显示数字 就是多次显示数字的字符 +//鏄剧ず鏁板瓧 灏辨槸澶氭鏄剧ず鏁板瓧鐨勫瓧绗 void DrawNum(unsigned char x,unsigned char y,unsigned int num,unsigned char len) { unsigned char t,temp; @@ -896,23 +914,23 @@ void DrawNum(unsigned char x,unsigned char y,unsigned int num,unsigned char len) } } ////////////////////////////////////////////////////////////////////////////////////////////////// -//显示汉字 -void OLED_ShowCHinese(u8 x,u8 y,u8 *cn) +//鏄剧ず姹夊瓧 +void OLED_ShowCHinese(uint8_t x,uint8_t y,uint8_t *cn) { - u8 j,wordNum; + uint8_t j,wordNum; if((x > 7)||(y>128-16)) return; - while ( *cn != '\0') //在C语言中字符串结束以‘\0’结尾 + while ( *cn != '\0') //鍦–璇█涓瓧绗︿覆缁撴潫浠モ榎0鈥欑粨灏 { for (wordNum=0; wordNum<8; wordNum++) { - if ((CN16CHAR[wordNum].Index[0] == *cn)&&(CN16CHAR[wordNum].Index[1] == *(cn+1))) //查询要写的字在字库中的位置 + if ((CN16CHAR[wordNum].Index[0] == *cn)&&(CN16CHAR[wordNum].Index[1] == *(cn+1))) //鏌ヨ瑕佸啓鐨勫瓧鍦ㄥ瓧搴撲腑鐨勪綅缃 { - for (j=0; j<32; j++) //写一个字 + for (j=0; j<32; j++) //鍐欎竴涓瓧 { - if (j == 16) //由于16X16用到两个Y坐标,当大于等于16时,切换坐标 + if (j == 16) //鐢变簬16X16鐢ㄥ埌涓や釜Y鍧愭爣锛屽綋澶т簬绛変簬16鏃讹紝鍒囨崲鍧愭爣 { x++; } @@ -924,6 +942,6 @@ void OLED_ShowCHinese(u8 x,u8 y,u8 *cn) {x += 2;y = 0;} } } - cn += 2; //此处打完一个字,接下来寻找第二个字 + cn += 2; //姝ゅ鎵撳畬涓涓瓧锛屾帴涓嬫潵瀵绘壘绗簩涓瓧 } } diff --git a/oledlib/oled_draw.h b/oledlib/oled_draw.h index 917efc2a8c1cecfdaf2a9513f1ebafe2b3eb9f85..769ed865c1b780bc8d0be506e1901adc24694aae 100644 --- a/oledlib/oled_draw.h +++ b/oledlib/oled_draw.h @@ -2,6 +2,7 @@ #define OLED_DRAW_H #include "oled_basic.h" #include "oled_color.h" +#include "stdint.h" void DrawPixel(int x,int y); void DrawLine(int x1,int y1,int x2,int y2); void DrawFastHLine(int x, int y, unsigned char w); @@ -25,10 +26,12 @@ void DrawEllipseRect( int x0, int y0, int x1, int y1); void DrawTriangle(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2); void DrawFillTriangle(int x0, int y0, int x1, int y1, int x2, int y2); void DrawBitmap(int x, int y, const unsigned char *bitmap, unsigned char w, unsigned char h); +void DrawXBitmap(int x, int y, const unsigned char *bitmap, unsigned char w, unsigned char h);//姝ゅ嚱鏁板叿浣撴敞閲婅鍙傜収'draw_api.h'鍐 void DrawSlowBitmap(int x, int y, const unsigned char *bitmap, unsigned char w, unsigned char h); void DrawChar(int x, int y, unsigned char c); void DrawString(int x, int y,char *str); void DrawNum(unsigned char x,unsigned char y,unsigned int num,unsigned char len); +void OLED_ShowCHinese(uint8_t x,uint8_t y,uint8_t *cn); Type_color GetPixel(int x,int y); diff --git a/oledlib/oled_driver.c b/oledlib/oled_driver.c index 06ca47958c0a56298a7f72b82f402188b90123f6..a1dc5ad114f8bde3620f4a07bd966ff8db694ff1 100644 --- a/oledlib/oled_driver.c +++ b/oledlib/oled_driver.c @@ -1,156 +1,416 @@ /* - 原作者哔哩哔哩: MjGame https://space.bilibili.com/38673747 - 同GifHub: maoyongjie https://github.com/hello-myj/stm32_oled/ - 代码整理注释删减增加优化等 哔哩哔哩: 一只程序缘 https://space.bilibili.com/237304109 - 整理之前的原代码随本代码一同提供,浏览以上网址获取更多相关信息,本代码以征得原作同意,感谢原作 - - 图形库原理:其实就是对一个数组进行操作,数组操作完成之后,直接将整个 - 数组刷新到屏幕上 - 因此此c文件用于配置oled底层 用于单片机与oled的直接且唯一通信 - - 移植此图形库主要改变以下内容 - SPI_Configuration() 配置通信引脚 - WriteCmd() 写命令 - WriteDat() 写数据 - OledTimeMsFunc() oled_config中的函数 为系统提供时基 - 此例程仅为SPI通信方式 需要更改其他通信方式改好底层上面3个函数大概就行 + 鍘熶綔鑰呭摂鍝╁摂鍝: MjGame https://space.bilibili.com/38673747 + 鍚孏ifHub: maoyongjie https://github.com/hello-myj/stm32_oled/ + 浠g爜鏁寸悊娉ㄩ噴鍒犲噺澧炲姞浼樺寲绛 鍝斿摡鍝斿摡: 涓鍙▼搴忕紭 https://space.bilibili.com/237304109 + 鏁寸悊涔嬪墠鐨勫師浠g爜闅忔湰浠g爜涓鍚屾彁渚,娴忚浠ヤ笂缃戝潃鑾峰彇鏇村鐩稿叧淇℃伅,鏈唬鐮佷互寰佸緱鍘熶綔鍚屾剰,鎰熻阿鍘熶綔 + + 鍥惧舰搴撳師鐞:鍏跺疄灏辨槸瀵逛竴涓暟缁勮繘琛屾搷浣,鏁扮粍鎿嶄綔瀹屾垚涔嬪悗,鐩存帴灏嗘暣涓 + 鏁扮粍鍒锋柊鍒板睆骞曚笂 + 鍥犳姝鏂囦欢鐢ㄤ簬閰嶇疆oled搴曞眰 鐢ㄤ簬鍗曠墖鏈轰笌oled鐨勭洿鎺ヤ笖鍞竴閫氫俊 + + 绉绘姝ゅ浘褰㈠簱涓昏鏀瑰彉浠ヤ笅鍐呭 + SPI_Configuration() 閰嶇疆閫氫俊寮曡剼 + WriteCmd() 鍐欏懡浠 + WriteDat() 鍐欐暟鎹 + OledTimeMsFunc() oled_config涓殑鍑芥暟 涓虹郴缁熸彁渚涙椂鍩 + 姝や緥绋嬩粎婕旂ずSPI閫氫俊鏂瑰紡 闇瑕佹洿鏀瑰叾浠栭氫俊鏂瑰紡璇峰湪[oled_config.h]淇敼 */ + + #include "oled_driver.h" -#include "delay.h" -#include "draw_api.h" + +#if (TRANSFER_METHOD == HW_IIC) + #include "delay.h" + //I2C_Configuration锛屽垵濮嬪寲纭欢IIC寮曡剼 + void I2C_Configuration(void) + { + I2C_InitTypeDef I2C_InitStructure; + GPIO_InitTypeDef GPIO_InitStructure; + + RCC_APB1PeriphClockCmd(IIC_RCC_APB1Periph_I2CX, ENABLE); + RCC_APB2PeriphClockCmd(IIC_RCC_APB2Periph_GPIOX, ENABLE); + + GPIO_InitStructure.GPIO_Pin = IIC_SCL_Pin_X | IIC_SDA_Pin_X; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;//I2C蹇呴』寮婕忚緭鍑 + GPIO_Init(IIC_GPIOX, &GPIO_InitStructure); + + I2C_DeInit(I2CX); + I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; + I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; + I2C_InitStructure.I2C_OwnAddress1 = 0x30;//涓绘満鐨処2C鍦板潃,闅忎究鍐 + I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; + I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; + I2C_InitStructure.I2C_ClockSpeed = 400000; + + I2C_Cmd(I2CX, ENABLE); + I2C_Init(I2CX, &I2C_InitStructure); + delay_ms(200); + } + + /** + @brief I2C_WriteByte锛屽悜OLED瀵勫瓨鍣ㄥ湴鍧鍐欎竴涓猙yte鐨勬暟鎹 + @param addr锛氬瘎瀛樺櫒鍦板潃 + data锛氳鍐欏叆鐨勬暟鎹 + @retval 鏃 + */ + void I2C_WriteByte(uint8_t addr, uint8_t data) + { + while (I2C_GetFlagStatus(I2CX, I2C_FLAG_BUSY)); + + I2C_GenerateSTART(I2CX, ENABLE);//寮鍚疘2C1 + while (!I2C_CheckEvent(I2CX, I2C_EVENT_MASTER_MODE_SELECT)); /*EV5,涓绘ā寮*/ + + I2C_Send7bitAddress(I2CX, OLED_ADDRESS, I2C_Direction_Transmitter);//鍣ㄤ欢鍦板潃 -- 榛樿0x78 + while (!I2C_CheckEvent(I2CX, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); + + I2C_SendData(I2CX, addr);//瀵勫瓨鍣ㄥ湴鍧 + while (!I2C_CheckEvent(I2CX, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); + + I2C_SendData(I2CX, data);//鍙戦佹暟鎹 + while (!I2C_CheckEvent(I2CX, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); + + I2C_GenerateSTOP(I2CX, ENABLE);//鍏抽棴I2C1鎬荤嚎 + } + + void WriteCmd(unsigned char cmd)//鍐欏懡浠 + { + I2C_WriteByte(0x00, cmd); + } + + void WriteDat(unsigned char dat)//鍐欐暟鎹 + { + I2C_WriteByte(0x40, dat); + } + + + + + +#elif (TRANSFER_METHOD ==SW_IIC) + #include "delay.h" + void IIC_Start(void); + void IIC_Send_Byte(uint8_t txd); + void IIC_Stop(void); + + void I2C_Configuration(void) + { + GPIO_InitTypeDef GPIO_InitStructure; + + RCC_APB2PeriphClockCmd(OLED_RCC_I2C_PORT, ENABLE); /* 鎵撳紑GPIO鏃堕挓 */ + + GPIO_InitStructure.GPIO_Pin = OLED_I2C_SCL_PIN | OLED_I2C_SDA_PIN; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; /* 寮婕忚緭鍑 */ + GPIO_Init(OLED_GPIO_PORT_I2C, &GPIO_InitStructure); + + IIC_SDA = 1; + IIC_SCL = 1; + } + + /** + @brief I2C_WriteByte锛屽悜OLED瀵勫瓨鍣ㄥ湴鍧鍐欎竴涓猙yte鐨勬暟鎹 + @param addr锛氬瘎瀛樺櫒鍦板潃 data锛氳鍐欏叆鐨勬暟鎹 + @retval 鏃 + */ + void I2C_WriteByte(uint8_t addr, uint8_t data) + { + IIC_Start(); + IIC_Send_Byte(OLED_ADDRESS); + IIC_Send_Byte(addr); //write data + IIC_Send_Byte(data); + IIC_Stop(); + } + + void WriteCmd(unsigned char cmd)//鍐欏懡浠 + { + I2C_WriteByte(0x00, cmd); + } + + void WriteDat(unsigned char dat)//鍐欐暟鎹 + { + I2C_WriteByte(0x40, dat); + } + + //浜х敓IIC璧峰淇″彿 + void IIC_Start(void) + { + IIC_SCL = 1; + IIC_SDA = 1; + //delay_us(1); + IIC_SDA = 0; + //delay_us(1); + IIC_SCL = 0; + } + + //IIC鍙戦佷竴涓瓧鑺 + //杩斿洖浠庢満鏈夋棤搴旂瓟 + //1锛屾湁搴旂瓟 + //0锛屾棤搴旂瓟 + void IIC_Send_Byte(uint8_t IIC_Byte) + { + unsigned char i; + for (i = 0; i < 8; i++) + { + if (IIC_Byte & 0x80) + IIC_SDA = 1; + else + IIC_SDA = 0; + //delay_us(1); + IIC_SCL = 1; + delay_us(1); //蹇呴』鏈変繚鎸丼CL鑴夊啿鐨勫欢鏃 + IIC_SCL = 0; + IIC_Byte <<= 1; + } + //鍘熺▼搴忚繖閲屾湁涓涓媺楂楽DA锛屾牴鎹甇LED鐨勮姹傦紝姝ゅ彞蹇呴』鍘绘帀銆 + IIC_SCL = 1; + delay_us(1); + IIC_SCL = 0; + } + + //浜х敓IIC鍋滄淇″彿 + void IIC_Stop(void) + { + IIC_SDA = 0; + //delay_us(1); + IIC_SCL = 1; + //delay_us(1); + IIC_SDA = 1; + } + +#elif (TRANSFER_METHOD ==HW_SPI) + + #define OLED_RESET_LOW() GPIO_ResetBits(SPI_RES_GPIOX, SPI_RES_PIN) //浣庣數骞冲浣 + #define OLED_RESET_HIGH() GPIO_SetBits(SPI_RES_GPIOX, SPI_RES_PIN) + + #define OLED_CMD_MODE() GPIO_ResetBits(SPI_DC_GPIOX, SPI_DC_PIN) //鍛戒护妯″紡 + #define OLED_DATA_MODE() GPIO_SetBits(SPI_DC_GPIOX, SPI_DC_PIN) //鏁版嵁妯″紡 + + #define OLED_CS_HIGH() GPIO_SetBits(SPI_CS_GPIOX, SPI_CS_Pin_X) + #define OLED_CS_LOW() GPIO_ResetBits(SPI_CS_GPIOX, SPI_CS_Pin_X) + + + void SPI_Configuration(void) + { + SPI_InitTypeDef SPI_InitStructure; + GPIO_InitTypeDef GPIO_InitStructure; + #if (USE_HW_SPI==SPI_2) + RCC_APB1PeriphClockCmd(SPI_RCC_APB1Periph_SPIX, ENABLE); + #elif (USE_HW_SPI==SPI_1) + RCC_APB2PeriphClockCmd(SPI_RCC_APB2Periph_SPIX, ENABLE); + #endif + RCC_APB2PeriphClockCmd(SPI_RCC_APB2Periph_GPIOX | RCC_APB2Periph_AFIO, ENABLE); + + GPIO_InitStructure.GPIO_Pin = SPI_CS_Pin_X; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; + GPIO_Init(SPI_CS_GPIOX, &GPIO_InitStructure); + OLED_CS_HIGH(); + + GPIO_InitStructure.GPIO_Pin = SPI_HW_ALL_PINS; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; + GPIO_Init(SPI_HW_ALL_GPIOX, &GPIO_InitStructure); + + + SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//SPI_Direction_1Line_Tx; + SPI_InitStructure.SPI_Mode = SPI_Mode_Master; + SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; + SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; + SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; + SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; + SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; + SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; + SPI_InitStructure.SPI_CRCPolynomial = 7; + + SPI_Init(SPIX, &SPI_InitStructure); + SPI_Cmd(SPIX, ENABLE); + + GPIO_InitStructure.GPIO_Pin = SPI_RES_PIN; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; + GPIO_Init(SPI_RES_GPIOX, &GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = SPI_DC_PIN; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; + GPIO_Init(SPI_DC_GPIOX, &GPIO_InitStructure); + OLED_DATA_MODE(); + + OLED_RESET_HIGH(); + WaitTimeMs(100); + OLED_RESET_LOW(); + WaitTimeMs(100); + OLED_RESET_HIGH(); + } + + void SPI_WriterByte(unsigned char dat) + { + + while (SPI_I2S_GetFlagStatus(SPIX, SPI_I2S_FLAG_TXE) == RESET ) {}; //妫鏌ユ寚瀹氱殑SPI鏍囧織浣嶈缃笌鍚:鍙戦佺紦瀛樼┖鏍囧織浣 + SPI_I2S_SendData(SPIX, dat); //閫氳繃澶栬SPIx鍙戦佷竴涓暟鎹 + while (SPI_I2S_GetFlagStatus(SPIX, SPI_I2S_FLAG_RXNE) == RESET) {}; //妫鏌ユ寚瀹氱殑SPI鏍囧織浣嶈缃笌鍚:鎺ュ彈缂撳瓨闈炵┖鏍囧織浣 + SPI_I2S_ReceiveData(SPIX); //杩斿洖閫氳繃SPIx鏈杩戞帴鏀剁殑鏁版嵁 + + } + + void WriteCmd(unsigned char cmd) + { + OLED_CMD_MODE(); + OLED_CS_LOW(); + SPI_WriterByte(cmd); + OLED_CS_HIGH(); + OLED_DATA_MODE(); + } + + void WriteDat(unsigned char dat) + { + OLED_DATA_MODE(); + OLED_CS_LOW(); + SPI_WriterByte(dat); + OLED_CS_HIGH(); + OLED_DATA_MODE(); + } + + + +#elif (TRANSFER_METHOD ==SW_SPI) void SPI_Configuration(void) { - GPIO_InitTypeDef GPIO_InitStructure; - - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能A端口时钟 - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz - GPIO_Init(GPIOA, &GPIO_InitStructure); - GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_7|GPIO_Pin_4); - - OLED_RST_Set(); - DelayMs(100); - OLED_RST_Clr(); - DelayMs(200); - OLED_RST_Set(); -} + GPIO_InitTypeDef GPIO_InitStructure; -void OLED_WR_Byte(u8 dat,u8 cmd) -{ - u8 i; - if(cmd) - OLED_DC_Set(); - else - OLED_DC_Clr(); - OLED_CS_Clr(); - for(i=0;i<8;i++) - { - OLED_SCLK_Clr(); - if(dat&0x80) - OLED_SDIN_Set(); - else - OLED_SDIN_Clr(); - OLED_SCLK_Set(); - dat<<=1; - } - OLED_CS_Set(); - OLED_DC_Set(); -} + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //浣胯兘A绔彛鏃堕挓 + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //鎺ㄦ尳杈撳嚭 + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //閫熷害50MHz + GPIO_Init(GPIOA, &GPIO_InitStructure); + GPIO_SetBits(GPIOA, GPIO_Pin_5 | GPIO_Pin_7 | GPIO_Pin_4); + OLED_RST_Set(); + DelayMs(100); + OLED_RST_Clr(); + DelayMs(200); + OLED_RST_Set(); +} + +void OLED_WR_Byte(uint8_t dat, uint8_t cmd) +{ + uint8_t i; + if (cmd) + OLED_DC_Set(); + else + OLED_DC_Clr(); + OLED_CS_Clr(); + for (i = 0; i < 8; i++) + { + OLED_SCLK_Clr(); + if (dat & 0x80) + OLED_SDIN_Set(); + else + OLED_SDIN_Clr(); + OLED_SCLK_Set(); + dat <<= 1; + } + OLED_CS_Set(); + OLED_DC_Set(); +} void WriteCmd(unsigned char cmd) { - OLED_WR_Byte(cmd,0); + OLED_WR_Byte(cmd, 0); } void WriteDat(unsigned char dat) { - OLED_WR_Byte(dat,1); + OLED_WR_Byte(dat, 1); } -void OLED_FILL(unsigned char BMP[]) -{ - u8 i,j; - unsigned char *p; - p=BMP; - for(i=0;i<8;i++) - { - WriteCmd(0xb0+i); //page0-page1 - WriteCmd(0x00); //low column start address - WriteCmd(0x10); - - for(j=0;j<128;j++) - { - WriteDat(*p++); - } - } -} +#endif //(TRANSFER_METHOD ==HW_IIC) void OLED_Init(void) { - WriteCmd(0xAE); //display off - WriteCmd(0x20); //Set Memory Addressing Mode - WriteCmd(0x10); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid - WriteCmd(0xb0); //Set Page Start Address for Page Addressing Mode,0-7 - WriteCmd(0xc8); //Set COM Output Scan Direction - WriteCmd(0x00); //---set low column address - WriteCmd(0x10); //---set high column address - WriteCmd(0x40); //--set start line address - WriteCmd(0x81); //--set contrast control register - WriteCmd(0xff); //亮度调节 0x00~0xff - WriteCmd(0xa1); //--set segment re-map 0 to 127 - WriteCmd(0xa6); //--set normal display - WriteCmd(0xa8); //--set multiplex ratio(1 to 64) - WriteCmd(0x3F); // - WriteCmd(0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content - WriteCmd(0xd3); //-set display offset - WriteCmd(0x00); //-not offset - WriteCmd(0xd5); //--set display clock divide ratio/oscillator frequency - WriteCmd(0xf0); //--set divide ratio - WriteCmd(0xd9); //--set pre-charge period - WriteCmd(0x22); // - WriteCmd(0xda); //--set com pins hardware configuration - WriteCmd(0x12); - WriteCmd(0xdb); //--set vcomh - WriteCmd(0x20); //0x20,0.77xVcc - WriteCmd(0x8d); //--set DC-DC enable - WriteCmd(0x14); // - WriteCmd(0xaf); //--turn on oled panel - OLED_CLS(); + WriteCmd(0xAE); //display off + WriteCmd(0x20); //Set Memory Addressing Mode + WriteCmd(0x10); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid + WriteCmd(0xb0); //Set Page Start Address for Page Addressing Mode,0-7 + WriteCmd(0xc8); //Set COM Output Scan Direction + WriteCmd(0x00); //---set low column address + WriteCmd(0x10); //---set high column address + WriteCmd(0x40); //--set start line address + WriteCmd(0x81); //--set contrast control register + WriteCmd(0xff); //浜害璋冭妭 0x00~0xff + WriteCmd(0xa1); //--set segment re-map 0 to 127 + WriteCmd(0xa6); //--set normal display + WriteCmd(0xa8); //--set multiplex ratio(1 to 64) + WriteCmd(0x3F); // + WriteCmd(0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content + WriteCmd(0xd3); //-set display offset + WriteCmd(0x00); //-not offset + WriteCmd(0xd5); //--set display clock divide ratio/oscillator frequency + WriteCmd(0xf0); //--set divide ratio + WriteCmd(0xd9); //--set pre-charge period + WriteCmd(0x22); // + WriteCmd(0xda); //--set com pins hardware configuration + WriteCmd(0x12); + WriteCmd(0xdb); //--set vcomh + WriteCmd(0x20); //0x20,0.77xVcc + WriteCmd(0x8d); //--set DC-DC enable + WriteCmd(0x14); // + WriteCmd(0xaf); //--turn on oled panel + OLED_CLS(); } -void OLED_CLS(void)//清屏 全部发送0x00 +void OLED_CLS(void)//娓呭睆 { - unsigned char m,n; - for(m=0;m<8;m++) - { - WriteCmd(0xb0+m); //page0-page1 - WriteCmd(0x00); //low column start address - WriteCmd(0x10); //high column start address - for(n=0;n<128;n++) - { - WriteDat(0x00); - } - } + unsigned char m, n; + for (m = 0; m < 8; m++) + { + WriteCmd(0xb0 + m); //page0-page1 + WriteCmd(0x00); //low column start address + WriteCmd(0x10); //high column start address + for (n = 0; n < 128; n++) + { + WriteDat(0x00); + } + } } void OLED_ON(void) { - WriteCmd(0X8D); //设置电荷泵 - WriteCmd(0X14); //开启电荷泵 - WriteCmd(0XAF); //OLED唤醒 + WriteCmd(0X8D); //璁剧疆鐢佃嵎娉 + WriteCmd(0X14); //寮鍚數鑽锋车 + WriteCmd(0XAF); //OLED鍞ら啋 } + + void OLED_OFF(void) { - WriteCmd(0X8D); //设置电荷泵 - WriteCmd(0X10); //关闭电荷泵 - WriteCmd(0XAE); //OLED休眠 + WriteCmd(0X8D); //璁剧疆鐢佃嵎娉 + WriteCmd(0X10); //鍏抽棴鐢佃嵎娉 + WriteCmd(0XAE); //OLED浼戠湢 +} + +void OLED_FILL(unsigned char BMP[]) +{ + uint8_t i, j; + unsigned char *p; + p = BMP; + + for (i = 0; i < 8; i++) + { + WriteCmd(0xb0 + i); //page0-page1 + WriteCmd(0x00); //low column start address + WriteCmd(0x10); + + for (j = 0; j < 128; j++) + { + WriteDat(*p++); + } + } } diff --git a/oledlib/oled_driver.h b/oledlib/oled_driver.h index 45a9837a2ba81d4ff6bf717397366450778f3972..639dbcbbfbfec889bf7dc93edadde7bb8c12ff75 100644 --- a/oledlib/oled_driver.h +++ b/oledlib/oled_driver.h @@ -1,39 +1,106 @@ #ifndef __OLED_DRIVER_H -#define __OLED_DRIVER_H - +#define __OLED_DRIVER_H #include "stm32f10x.h" #include "oled_config.h" #include "oled_basic.h" -#define OLED_SCLK_Clr() GPIO_ResetBits(GPIOA,GPIO_Pin_4) //CLK -#define OLED_SCLK_Set() GPIO_SetBits(GPIOA,GPIO_Pin_4) -#define OLED_SDIN_Clr() GPIO_ResetBits(GPIOA,GPIO_Pin_5) //DIN -#define OLED_SDIN_Set() GPIO_SetBits(GPIOA,GPIO_Pin_5) +#if (TRANSFER_METHOD == HW_IIC) + + #define OLED_ADDRESS 0x78 //閫氳繃璋冩暣0R鐢甸樆,灞忓彲浠0x78鍜0x7A涓や釜鍦板潃 -- 榛樿0x78 + #if (USE_HW_IIC == IIC_1) + /*STM32F103C8T6鑺墖鐨勭‖浠禝2C: PB6 -- SCL; PB7 -- SDA */ + #define IIC_RCC_APB1Periph_I2CX RCC_APB1Periph_I2C1 + #define IIC_RCC_APB2Periph_GPIOX RCC_APB2Periph_GPIOB + #define IIC_GPIOX GPIOB + #define IIC_SCL_Pin_X GPIO_Pin_6 + #define IIC_SDA_Pin_X GPIO_Pin_7 + #define I2CX I2C1 + #elif (USE_HW_IIC == IIC_2) + #define IIC_RCC_APB1Periph_I2CX RCC_APB1Periph_I2C2 + #define IIC_RCC_APB2Periph_GPIOX RCC_APB2Periph_GPIOB + #define IIC_GPIOX GPIOB + #define IIC_SCL_Pin_X GPIO_Pin_10 + #define IIC_SDA_Pin_X GPIO_Pin_11 + #define I2CX I2C2 + #endif + void I2C_Configuration(void); + void I2C_WriteByte(uint8_t addr, uint8_t data); + +#elif (TRANSFER_METHOD == SW_IIC)//杞欢I2C渚濊禆涓婚锛屽湪F103锛72M锛夋祴璇曚笅閫氳繃锛屽叾浣欒鑷娴嬭瘯 + + #define OLED_ADDRESS 0x78 //閫氳繃璋冩暣0R鐢甸樆,灞忓彲浠0x78鍜0x7A涓や釜鍦板潃 -- 榛樿0x78 + #define IIC_SCL BIT_ADDR(GPIOE_ODR_Addr, 12) //SCL + #define IIC_SDA BIT_ADDR(GPIOE_ODR_Addr, 15) //SDA + #define OLED_GPIO_PORT_I2C GPIOE /* GPIO绔彛 */ + #define OLED_RCC_I2C_PORT RCC_APB2Periph_GPIOE /* GPIO绔彛鏃堕挓 */ + #define OLED_I2C_SCL_PIN GPIO_Pin_12 /* 杩炴帴鍒癝CL鏃堕挓绾跨殑GPIO */ + #define OLED_I2C_SDA_PIN GPIO_Pin_15 /* 杩炴帴鍒癝DA鏁版嵁绾跨殑GPIO */ + void I2C_Configuration(void); + void I2C_WriteByte(uint8_t addr, uint8_t data); + + +#elif (TRANSFER_METHOD ==HW_SPI) + + #if (USE_HW_SPI==SPI_1) + //纭欢SPI1杩樻病瀹炵幇 + #elif (USE_HW_SPI==SPI_2) + #define SPIX SPI2 + //浣胯兘SPI2鏃堕挓 + #define SPI_RCC_APB1Periph_SPIX RCC_APB1Periph_SPI2 + //浣胯兘gpio鏃堕挓锛屼娇鐢ㄧ殑GPIO涓嶄竴鏍锋椂鍙畾涔夊涓嬶細 + //#define SPI_RCC_APB2Periph_GPIOX RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC + #define SPI_RCC_APB2Periph_GPIOX RCC_APB2Periph_GPIOB + //CS鐗囬夛紙杞欢鐗囬夛級 + #define SPI_CS_Pin_X GPIO_Pin_12 + #define SPI_CS_GPIOX GPIOB + //SPI2 鏃堕挓銆乵osi銆乵iso寮曡剼 + #define SPI_HW_ALL_PINS (GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15) + #define SPI_HW_ALL_GPIOX GPIOB + //澶嶄綅寮曡剼 + #define SPI_RES_PIN GPIO_Pin_10 + #define SPI_RES_GPIOX GPIOB + //鎺у埗寮曡剼 + #define SPI_DC_PIN GPIO_Pin_11 + #define SPI_DC_GPIOX GPIOB + #endif + void SPI_Configuration(void); + void SPI_WriterByte(unsigned char dat); + +#elif (TRANSFER_METHOD ==SW_SPI) + + #define OLED_SCLK_Clr() GPIO_ResetBits(GPIOA,GPIO_Pin_4) //CLK + #define OLED_SCLK_Set() GPIO_SetBits(GPIOA,GPIO_Pin_4) + + #define OLED_SDIN_Clr() GPIO_ResetBits(GPIOA,GPIO_Pin_5) //DIN + #define OLED_SDIN_Set() GPIO_SetBits(GPIOA,GPIO_Pin_5) -#define OLED_RST_Clr() GPIO_ResetBits(GPIOA,GPIO_Pin_6) //RES -#define OLED_RST_Set() GPIO_SetBits(GPIOA,GPIO_Pin_6) + #define OLED_RST_Clr() GPIO_ResetBits(GPIOA,GPIO_Pin_6) //RES + #define OLED_RST_Set() GPIO_SetBits(GPIOA,GPIO_Pin_6) + + #define OLED_DC_Clr() GPIO_ResetBits(GPIOA,GPIO_Pin_7) //DC + #define OLED_DC_Set() GPIO_SetBits(GPIOA,GPIO_Pin_7) + + #define OLED_CS_Clr() GPIO_ResetBits(GPIOA,GPIO_Pin_8) //CS + #define OLED_CS_Set() GPIO_SetBits(GPIOA,GPIO_Pin_8) + + #define OLED_CMD 0 //鍐欏懡浠 + #define OLED_DATA 1 //鍐欐暟鎹 + void SPI_Configuration(void); + void SPI_WriterByte(unsigned char dat); + +#endif -#define OLED_DC_Clr() GPIO_ResetBits(GPIOA,GPIO_Pin_7) //DC -#define OLED_DC_Set() GPIO_SetBits(GPIOA,GPIO_Pin_7) - -#define OLED_CS_Clr() GPIO_ResetBits(GPIOA,GPIO_Pin_8) //CS -#define OLED_CS_Set() GPIO_SetBits(GPIOA,GPIO_Pin_8) -#define OLED_CMD 0 //写命令 -#define OLED_DATA 1 //写数据 -void I2C_Configuration(void); -void I2C_WriteByte(uint8_t addr,uint8_t data); -void SPI_Configuration(void); -void SPI_WriterByte(unsigned char dat); void WriteCmd(unsigned char cmd); void WriteDat(unsigned char Dat); + void OLED_Init(void); void OLED_CLS(void); void OLED_ON(void); void OLED_OFF(void); void OLED_FILL(unsigned char BMP[]); -#endif +#endif //__OLED_DRIVER_H diff --git a/oledlib/oled_font.h b/oledlib/oled_font.h index 99d4976f10104d68afaa28d5c999e63e256e95c8..9b5466bd63c5d85972411b8bd6ffee5c8041a216 100644 --- a/oledlib/oled_font.h +++ b/oledlib/oled_font.h @@ -7,10 +7,10 @@ typedef enum TEXT_BK_NOT_NULL, }Type_textbk; -struct Cn16CharTypeDef // 汉字字模数据结构 +struct Cn16CharTypeDef // 姹夊瓧瀛楁ā鏁版嵁缁撴瀯 { - unsigned char Index[2]; // 汉字内码索引,一个汉字占两个字节 - unsigned char Msk[32]; // 点阵码数据(16*16有32个数据) + unsigned char Index[2]; // 姹夊瓧鍐呯爜绱㈠紩,涓涓眽瀛楀崰涓や釜瀛楄妭 + unsigned char Msk[32]; // 鐐归樀鐮佹暟鎹(16*16鏈32涓暟鎹) }; @@ -18,6 +18,13 @@ extern const unsigned char font5x7[]; extern const unsigned char F8X16[]; extern struct Cn16CharTypeDef const CN16CHAR[]; + + +//鍔熻兘:璁剧疆瀛椾綋鐨勮儗鏅ā寮 0涓洪忔槑锛1涓烘甯搞 +void SetTextBkMode(Type_textbk value); +//鍔熻兘:鑾峰彇瀛椾綋鐨勮儗鏅ā寮 0涓洪忔槑锛1涓烘甯搞 +Type_textbk GetTextBkMode(void); + unsigned char GetFontSize(void); void SetFontSize(unsigned char value); #endif