找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5727|回复: 14
打印 上一主题 下一主题
收起左侧

一款实用性极强的STC32G单片机开发板

  [复制链接]
跳转到指定楼层
楼主
本帖最后由 xiaoyuxinke 于 2022-7-4 00:30 编辑

最近要用STC32G12K128的单片机,但由于没用过51核的32位单片机,所以自己照官方手册做了一款STC32G的开发板,本板功能实用性极强,可测试的功能有:
1.双串口功能.这个大家都懂就不要细述
2.3.5寸TFT屏和LCD12864的显示,这两种屏做为中高端应用是必不可少的.
3.单独按键功能,这个很多开发板都有,大家也经常用到
4.两组CAN总线用排针引出,CAN总线在一些汽车检测设备中常用到
5.两组对称带死区PWM排针引出(P6.0-P6.3),相信大家对于这个不陌生,对于一些MOS管驱动,比如半桥和全桥驱动这个是必不可少的.
6.板载8M三星的FLASH闪存芯片,可用于存储开机图片和LOGO图片及一些不常用到的大容量代码.因为这些开机只运行一次.
7.仿编码器旋钮,这个在做一些电子设备类的经常用到,比如电子负载和T12焊台等.8.DS1302时钟芯片的仿真本板不需要,因为单片机内部集成了高精度和低精度的两种RTC时钟模块,直接设置好调用就可以了.
9.本板所支持所有I/O中断,也就是说任意引出的I/O都可用作中断功能,在很多工业控制以及设备和家电控制上面都很方便.
10.本板支持高速SPI功能,这块在SPI高速数据传输和SPI类的TFT显示屏上面很好用,普通51单片机刷SPI的TFT彩屏,速度慢的让人头痛.
11.本板支持在电路实时仿真功能,STC32G既是单片机,又可实时在电路仿真,这块对于单片机爱好者是一大助力.
12.本板支持32位/16位/8位 单时钟数据读写,内部集成FPMU单精度浮点运算模块(可进行基本算术运算和三角函数运算)

下面是本开发板的PCB图片
这个是正面图:


这个是板背面图


这个是嘉立创打样的效果图


        本开发板必需使用STC LINK下载器或USB下载才能下载程序,其它下载器不通用(STC LINK可向STC官方申请)
        下面是测试视频地址,大家可以自行观看:
        https://v.youku.com/v_show/id_XN ... o_XNTg4MjM3OTgyNA==
        由于本板兼容两种显示屏,所以必需用排母来插,如果焊接就只能用一种屏显示,我在某宝上买的排母还没到,所以屏的测试后面再上图了,多谢大家支持,
也感谢STC长期以来对我这的支持和照顾,谢谢!
       另附上开发板简单测试程序:
环宇之光开发板简单测试程序.rar (50.24 KB, 下载次数: 40)

//***************************************************************
//【程序版权所有 中山环宇之光】
//【此程序为环宇之光STC开发板专用程序,其它芯片不适用本程序 】               

//************************  功能说明    **************************

//本例程基于STC32G为主控芯片的环宇之光NO;STC32G12K128开发板进行编写测试.
//使用Keil C251编译器,Memory Model推荐设置XSmall模式,默认定义变量在edata,单时钟存取访问速度快。
//edata建议保留1K给堆栈使用,空间不够时可将大数组、不常用变量加xdata关键字定义到xdata空间。
//下载时,根据自己所用晶振选择时钟(用户可自行修改频率).环宇之光STC32G12K128开发板有外部晶振
//****************************************************************
//【程序宏定义部分】
//****************************************************************
#include <STC32G.h>
#include <stdio.h>
#include <intrins.h>
typedef         unsigned char        u8;
typedef         unsigned int        u16;
typedef         unsigned long        u32;
#define MAIN_Fosc        22118400UL
//****************************************************************
//【本地常量声明】
//****************************************************************
bit   flag0=0;                              //按键(key1)标志位

//****************************************************************
//【I/O定义部分】
//****************************************************************
sbit  beep=P0^7;                            //蜂鸣器I/O定义
sbit  key1=P0^0;                            //按键1(key1)I/O定义
sbit  key2=P0^1;                            //按键2(key2)I/O定义
sbit  key3=P0^2;                            //按键3(key3)I/O定义
sbit  key4=P0^3;                            //按键4(key4)I/O定义
//****************************************************************
//【本地变量声明】
//****************************************************************

u8 ledIndex;
u8 code ledNum[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

//****************************************************************
//【本地函数声明】
//****************************************************************

void  delay_ms(u8 ms);                      //全局定义毫秒级延时
void  ledflash(void);                       //LED闪烁程序声明
//void  key(void);                          //由于按键采用了中断功能,此句暂时注释掉
void  main(void);                           //KEIL C251中,MAIN函数也必需声明,不然无法编译
//****************************************************************

//****************************************************************
//【发光二极管闪烁程序】
//****************************************************************

void ledflash(void)
{
        if(flag0==1)                              //如果标志位0等于1,执行下列程序
                {
        P1 = ~ledNum[ledIndex];                    //输出低驱动
        ledIndex++;                         //LED变量加1
        if(ledIndex > 1)                    //如果变量数大于1,执行下列程序(此处可修改,按您的实际LED个数)
        {
            ledIndex = 0;                   //强制把此变量置0
        }
        delay_ms(125);                      //延时125毫秒
        delay_ms(125);                      //延时125毫秒
                                beep=0;                             //蜂鸣器响
                                P30=1;                              //P3^0所接LED灭
                                P31=1;                              //P3^1所接LED灭
                                delay_ms(125);                      //延时125毫秒
                                P30=0;                              //P3^0所接LED亮
                    P31=0;                              //P3^0所接LED亮
                                beep=1;                                    //蜂鸣器禁声
                        }
}
今天晚上写了一下这个开发板的LCD12864显示部分程序,显示很正常,用32位芯片比8位强多了,不是一个档次的东西.
下面是显示图片




夜深了,TFT彩屏的程序今晚就不写了,改天有空了再写一下,各位有什么要交流的可以回贴,看到一定会及时回复各位.



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:61140 发表于 2022-7-2 01:10 | 只看该作者
此程序按键使用端口中断的哦,任意端口都可用作中断端口.
回复

使用道具 举报

板凳
ID:161979 发表于 2022-7-8 14:39 | 只看该作者
期待你的TFT彩屏的程序
回复

使用道具 举报

地板
ID:61140 发表于 2022-7-8 18:17 | 只看该作者
jin8882008 发表于 2022-7-8 14:39
期待你的TFT彩屏的程序

彩屏程序已经出来了,改天有空发照片
回复

使用道具 举报

5#
ID:824490 发表于 2022-7-12 08:52 | 只看该作者
共享一下PCB文件不?
回复

使用道具 举报

6#
ID:61140 发表于 2022-7-13 13:03 | 只看该作者

某鱼上有我做好的PCB卖
回复

使用道具 举报

7#
ID:491577 发表于 2022-7-13 15:16 | 只看该作者
除了将全部IO口引出之外,看不出有什么特别之处,与其他开发板有什么区别?
回复

使用道具 举报

8#
ID:61140 发表于 2022-7-13 21:09 | 只看该作者
没有区别,但比STC官方提供的开发板要好用些。
回复

使用道具 举报

9#
ID:61140 发表于 2022-7-26 16:49 | 只看该作者

这个实在报歉……。
回复

使用道具 举报

10#
ID:272119 发表于 2022-7-31 13:23 | 只看该作者
Layout 风格很喜欢,VIA过孔排列平直,所有走线转弯都是大平直走线,我平时会走45'大弯,看来还是平直线路漂亮,不过平时很多杂散性走线也很难统一.
STC32问过他们客服,说还是建议先用STC8A或8H系列先,STC32现在的产能和成熟度还没有完成面对大批量.
看这个家伙很牛的样子,编程也可以直接8位转32位,过渡貌似很容易,我也是心痒痒.
回复

使用道具 举报

11#
ID:1034262 发表于 2022-8-1 22:50 | 只看该作者
STC官方出了一个用STC32G做的建议示波器,测试很不错,虽然带宽不高(最高采样500K,带宽50~100K,10V/DIV~50mV/DIV),但是很实用,非常稳定,显示时跟暂停一样静止的感觉。
回复

使用道具 举报

12#
ID:61140 发表于 2022-8-10 12:32 | 只看该作者
coody_sz 发表于 2022-8-1 22:50
STC官方出了一个用STC32G做的建议示波器,测试很不错,虽然带宽不高(最高采样500K,带宽50~100K,10V/DIV~ ...

此板硬件部分都正常,但是SPI的彩屏程序不好搞,我的板用的SPI硬件显示,但程序实在不太好搞
回复

使用道具 举报

13#
ID:1089682 发表于 2023-7-26 13:40 | 只看该作者
我想用洞洞板搭一个STC32与LCD12864,怎么接线,可以提供一下源程序吗
回复

使用道具 举报

14#
ID:155507 发表于 2023-7-27 17:27 | 只看该作者
啥也不会! 发表于 2023-7-26 13:40
我想用洞洞板搭一个STC32与LCD12864,怎么接线,可以提供一下源程序吗




  1. /*************  功能说明    **************

  2. 本例程基于STC32G为主控芯片的实验箱9.6版本进行编写测试。

  3. 使用Keil C251编译器,Memory Model推荐设置XSmall模式,默认定义变量在edata,单时钟存取访问速度快。

  4. edata建议保留1K给堆栈使用,空间不够时可将大数组、不常用变量加xdata关键字定义到xdata空间。

  5. 128*64的LCD显示程序

  6. 显示图形,汉字,英文,数字

  7. 下载时, 选择时钟 24MHz (用户可自行修改频率).

  8. ******************************************/

  9. #include "..\comm\STC32G.h"

  10. #include "stdio.h"
  11. #include "intrins.h"

  12. typedef         unsigned char        u8;
  13. typedef         unsigned int        u16;
  14. typedef         unsigned long        u32;

  15. #define MAIN_Fosc        24000000UL

  16. /****************************** 用户定义宏 ***********************************/
  17. sbit    LCD_RS = P4^1;  //定义引脚
  18. sbit    LCD_RW = P4^2;  //9.5版本之前实验箱需要将P42与P44对调才能正常使用
  19. sbit    LCD_E  = P4^4;
  20. //sbit    PSB    = P3^5;      //PSB脚为12864的串、并通讯功能切换,我们使用8位并行接口,PSB=1
  21. sbit    LCD_RESET   =   P3^4;   //  17---RESET  L-->Enable
  22. #define LCD_Data P0

  23. #define Busy    0x80 //用于检测LCD状态字中的Busy标识
  24. /*****************************************************************************/

  25. /*************  本地常量声明    **************/
  26. u8  code uctech[] = {"微电子  "};
  27. u8  code net[]    = {" stcmcu "};
  28. u8  code mcu[]    = {"51单片机"};
  29. u8  code qq[]     = {" 123456  "};

  30.     //128*64点阵图形数据
  31. u8 code gImage_gxw[1024] = { /* 0X10,0X01,0X00,0X80,0X00,0X40, */
  32. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  33. 0X00,0X3F,0X03,0XF0,0X3F,0X03,0XF0,0X00,0X00,0X00,0X0C,0X00,0X00,0X00,0XC0,0X00,
  34. 0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X00,0X00,0X0C,0X00,0X18,0XFF,0XE0,0X00,
  35. 0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X00,0X00,0X08,0X1C,0X1C,0X1B,0X00,0X00,
  36. 0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X00,0X1F,0XFF,0XFE,0X0C,0X0E,0X00,0X00,
  37. 0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X00,0X00,0X0C,0X00,0X00,0X8C,0X60,0X00,
  38. 0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X00,0X04,0X0C,0X10,0X00,0XFF,0XF0,0X00,
  39. 0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X00,0X07,0XFF,0XF8,0X0C,0XCC,0X60,0X00,
  40. 0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X00,0X06,0X63,0X18,0X7E,0XCC,0X60,0X00,
  41. 0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X06,0X33,0X98,0X0C,0XFF,0XE0,0X00,
  42. 0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X06,0X32,0X18,0X0C,0XCC,0X60,0X00,
  43. 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X06,0X05,0XD8,0X0C,0XCC,0X60,0X00,
  44. 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X06,0XFF,0X78,0X0C,0XFF,0XE0,0X00,
  45. 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X06,0X08,0XD8,0X0C,0XCC,0X60,0X00,
  46. 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X07,0XFF,0XF8,0X0C,0XCC,0X60,0X00,
  47. 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X06,0X0C,0X18,0X0C,0XCF,0XE0,0X00,
  48. 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X06,0X0C,0X18,0X3E,0X80,0X40,0X00,
  49. 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X06,0X0C,0X18,0X73,0XC0,0X00,0X00,
  50. 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X06,0X0D,0XF0,0X20,0X7F,0XF8,0X00,
  51. 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X06,0X00,0X30,0X00,0X00,0X00,0X00,
  52. 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  53. 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  54. 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X06,0X00,0X18,0X01,0X84,0X00,0X00,
  55. 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X07,0XFF,0XFC,0X01,0XC6,0X00,0X00,
  56. 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X06,0X00,0X58,0X01,0X86,0X30,0X00,
  57. 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X07,0XFF,0XD8,0X7F,0XFF,0XF8,0X00,
  58. 0X60,0X00,0XFD,0X1F,0XF0,0X7A,0X00,0X18,0X00,0X06,0X0C,0X18,0X01,0X86,0X00,0X00,
  59. 0X60,0X01,0X87,0X13,0X30,0XC6,0X00,0X18,0X00,0X06,0X0C,0X18,0X01,0X86,0X00,0X00,
  60. 0X60,0X03,0X03,0X33,0X11,0X83,0X00,0X18,0X00,0X06,0X0C,0X18,0X00,0X40,0X00,0X00,
  61. 0X60,0X03,0X03,0X03,0X01,0X83,0X00,0X18,0X00,0X06,0X0C,0XD8,0X00,0X30,0X00,0X00,
  62. 0X60,0X03,0X80,0X03,0X03,0X80,0X00,0X18,0X00,0X06,0XFF,0XF8,0X03,0X38,0X00,0X00,
  63. 0X60,0X01,0XC0,0X03,0X03,0X00,0X00,0X18,0X00,0X06,0X0F,0X18,0X0B,0X98,0X80,0X00,
  64. 0X60,0X00,0X78,0X03,0X03,0X00,0X00,0X18,0X00,0X06,0X0D,0X98,0X0B,0X18,0XC0,0X00,
  65. 0X60,0X00,0X1E,0X03,0X03,0X00,0X00,0X18,0X00,0X06,0X0C,0XD8,0X1B,0X00,0X70,0X00,
  66. 0X60,0X00,0X07,0X03,0X03,0X00,0X00,0X18,0X00,0X06,0X0C,0X18,0X1B,0X01,0X30,0X00,
  67. 0X60,0X00,0X03,0X03,0X03,0X80,0X00,0X18,0X00,0X06,0X0C,0XD8,0X3B,0X01,0X30,0X00,
  68. 0X60,0X03,0X03,0X03,0X03,0X83,0X00,0X18,0X00,0X07,0XF7,0XB8,0X33,0X01,0X80,0X00,
  69. 0X60,0X03,0X03,0X03,0X01,0X82,0X00,0X18,0X00,0X06,0X00,0X18,0X03,0X01,0X80,0X00,
  70. 0X60,0X01,0XC6,0X03,0X01,0XC6,0X00,0X18,0X00,0X07,0XFF,0XF8,0X01,0XFF,0X80,0X00,
  71. 0X60,0X01,0X7C,0X07,0XC0,0X7C,0X00,0X18,0X00,0X06,0X00,0X18,0X00,0X00,0X00,0X00,
  72. 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X04,0X00,0X00,0X00,0X00,0X00,0X00,
  73. 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  74. 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  75. 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  76. 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X21,0X86,0X00,0X07,0X00,0X00,0X00,0X10,
  77. 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X31,0X86,0X00,0X07,0X00,0X03,0XFF,0XF8,
  78. 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X65,0X66,0X00,0X02,0X00,0X00,0X00,0X68,
  79. 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0XC7,0X7C,0X00,0X02,0X08,0X00,0X00,0XC0,
  80. 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X95,0X6C,0X41,0XFF,0XFC,0X00,0X03,0X80,
  81. 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X19,0X3D,0X6F,0XE1,0X82,0X0C,0X00,0X0E,0X00,
  82. 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X3E,0XE9,0XA1,0X82,0X0C,0X00,0X0E,0X00,
  83. 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X60,0X59,0X81,0X82,0X0C,0X00,0X0C,0X0C,
  84. 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X6F,0XFD,0X81,0XFF,0XFC,0X1F,0XFF,0XFE,
  85. 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0XE0,0X15,0X81,0X82,0X0C,0X00,0X0C,0X02,
  86. 0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0XA6,0X45,0X81,0X82,0X0C,0X00,0X0C,0X00,
  87. 0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF9,0X27,0XC7,0X01,0X82,0X0C,0X00,0X0C,0X00,
  88. 0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X26,0X47,0X01,0XFF,0XFC,0X00,0X0C,0X00,
  89. 0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X26,0X5F,0X01,0X82,0X0B,0X00,0X0C,0X00,
  90. 0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X26,0X77,0X01,0X02,0X03,0X00,0X0C,0X00,
  91. 0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X26,0XEF,0X80,0X02,0X03,0X00,0X0C,0X00,
  92. 0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X24,0X59,0XC0,0X02,0X03,0X00,0X0C,0X00,
  93. 0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X38,0X30,0XE0,0X03,0XFF,0X80,0X7C,0X00,
  94. 0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X38,0XE0,0X00,0X00,0X00,0X00,0X18,0X00,
  95. 0X00,0X3F,0X03,0XF0,0X3F,0X03,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  96. };


  97. /*************  本地变量声明    **************/


  98. /*************  本地函数声明    **************/
  99. void    delay_ms(u16 ms);
  100. void    WriteDataLCD(u8 WDLCD);
  101. void    WriteCommandLCD(u8 WCLCD,u8 BuysC);
  102. u8      ReadDataLCD(void);
  103. u8      ReadStatusLCD(void);
  104. void    LCDInit(void);
  105. void    LCDClear(void);
  106. void    LCDFlash(void);
  107. void    DisplayOneChar(u8 X, u8 Y, u8 DData);
  108. void    DisplayListChar(u8 X, u8 Y, u8 code *DData);
  109. void    DisplayImage (u8 code *DData);

  110. /********************* 主函数 *************************/
  111. void main(void)
  112. {
  113.     WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
  114.     EAXFR = 1; //扩展寄存器(XFR)访问使能
  115.     CKCON = 0; //提高访问XRAM速度

  116.     P0M1 = 0x30;   P0M0 = 0x30;   //设置P0.4、P0.5为漏极开路(实验箱加了上拉电阻到3.3V)
  117.     P1M1 = 0x3a;   P1M0 = 0x32;   //设置P1.1、P1.4、P1.5为漏极开路(实验箱加了上拉电阻到3.3V), P1.1在PWM当DAC电路通过电阻串联到P2.3,  P1.3 为 ADC 高阻输入
  118.     P2M1 = 0x3c;   P2M0 = 0x3c;   //设置P2.2~P2.5为漏极开路(实验箱加了上拉电阻到3.3V)
  119.     P3M1 = 0x50;   P3M0 = 0x50;   //设置P3.4、P3.6为漏极开路(实验箱加了上拉电阻到3.3V)
  120.     P4M1 = 0x3c;   P4M0 = 0x3c;   //设置P4.2~P4.5为漏极开路(实验箱加了上拉电阻到3.3V)
  121.     P5M1 = 0x0c;   P5M0 = 0x0c;   //设置P5.2、P5.3为漏极开路(实验箱加了上拉电阻到3.3V)
  122.     P6M1 = 0xff;   P6M0 = 0xff;   //设置为漏极开路(实验箱加了上拉电阻到3.3V)
  123.     P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口

  124.     delay_ms(100); //启动等待,等LCD讲入工作状态
  125.     LCDInit(); //LCM初始化
  126.     delay_ms(5); //延时片刻(可不要)

  127.     while(1)
  128.     {
  129.         LCDClear();
  130.         DisplayImage(gImage_gxw);//显示图形
  131.         delay_ms(3000);
  132.         LCDClear();
  133.         DisplayListChar(0,1,uctech);    //显示字库中的中文数字
  134.         DisplayListChar(0,2,net);       //显示字库中的中文数字
  135.         DisplayListChar(0,3,mcu);       //显示字库中的中文
  136.         DisplayListChar(0,4,qq);        //显示字库中的中文数字
  137.         delay_ms(3000);
  138.     }
  139. }


  140. //========================================================================
  141. // 函数: void delay_ms(u8 ms)
  142. // 描述: 延时函数。
  143. // 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
  144. // 返回: none.
  145. // 版本: VER1.0
  146. // 日期: 2013-4-1
  147. // 备注:
  148. //========================================================================
  149. void delay_ms(u16 ms)
  150. {
  151.     u16 i;
  152.     do{
  153.         i = MAIN_Fosc / 6000;
  154.         while(--i);
  155.     }while(--ms);
  156. }


  157. //******************************************
  158. void LCD_delay(void)
  159. {
  160.     NOP(30);    //电压降低,IO口翻转速度变慢,驱动信号需要增加延时时间
  161.     NOP(30);
  162. }


  163. //写数据
  164. void WriteDataLCD(u8 WDLCD)
  165. {
  166.     ReadStatusLCD(); //检测忙
  167.     LCD_RS = 1;
  168.     LCD_delay();
  169.     LCD_RW = 0;
  170.     LCD_Data = WDLCD;
  171.     LCD_delay();
  172.     LCD_E = 1;
  173.     LCD_delay();
  174.     LCD_E = 0;
  175. }

  176. //写指令
  177. void WriteCommandLCD(u8 WCLCD,u8 BuysC) //BuysC为0时忽略忙检测
  178. {
  179.     if (BuysC) ReadStatusLCD(); //根据需要检测忙
  180.     LCD_RS = 0;
  181.     LCD_delay();
  182.     LCD_RW = 0;
  183.     LCD_Data = WCLCD;
  184.     LCD_delay();
  185.     LCD_E = 1;
  186.     LCD_delay();
  187.     LCD_E = 0;  
  188. }

  189. //读状态
  190. u8 ReadStatusLCD(void)
  191. {
  192.     LCD_Data = 0xFF;

  193.     LCD_RS = 0;
  194.     LCD_delay();
  195.     LCD_RW = 1;
  196.     LCD_delay();
  197.     LCD_E = 1;
  198.     LCD_delay();
  199.     while (LCD_Data & Busy); //检测忙信号
  200.     LCD_E = 0;

  201.     return(LCD_Data);
  202. }

  203. void LCDInit(void) //LCM初始化
  204. {
  205. //  PSB = 1;    //并口
  206. //  PSB = 0;    //SPI口
  207.     delay_ms(10);
  208.     LCD_RESET = 0;
  209.     delay_ms(10);
  210.     LCD_RESET = 1;
  211.     delay_ms(100);
  212.    
  213.     WriteCommandLCD(0x30,1); //显示模式设置,开始要求每次检测忙信号
  214.     WriteCommandLCD(0x01,1); //显示清屏
  215.     WriteCommandLCD(0x06,1); // 显示光标移动设置
  216.     WriteCommandLCD(0x0C,1); // 显示开及光标设置
  217. }

  218. void LCDClear(void) //清屏
  219. {
  220.     WriteCommandLCD(0x01,1); //显示清屏
  221.     WriteCommandLCD(0x34,1); // 显示光标移动设置
  222.     WriteCommandLCD(0x30,1); // 显示开及光标设置
  223. }


  224. //按指定位置显示一串字符
  225. void DisplayListChar(u8 X, u8 Y, u8 code *DData)
  226. {
  227.     u8 ListLength,X2;
  228.     ListLength = 0;
  229.     X2 = X;
  230.     if(Y < 1)   Y=1;
  231.     if(Y > 4)   Y=4;
  232.     X &= 0x0F; //限制X不能大于16,Y在1-4之内
  233.     switch(Y)
  234.     {
  235.         case 1: X2 |= 0X80; break;  //根据行数来选择相应地址
  236.         case 2: X2 |= 0X90; break;
  237.         case 3: X2 |= 0X88; break;
  238.         case 4: X2 |= 0X98; break;
  239.     }
  240.     WriteCommandLCD(X2, 1); //发送地址码
  241.     while (DData[ListLength] >= 0x20) //若到达字串尾则退出
  242.     {
  243.         if (X <= 0x0F) //X坐标应小于0xF
  244.         {
  245.             WriteDataLCD(DData[ListLength]); //
  246.             ListLength++;
  247.             X++;
  248.         }
  249.     }
  250. }

  251. //图形显示122*32
  252. void DisplayImage (u8 code *DData)
  253. {
  254.     u8 x,y,i;
  255.     unsigned int tmp=0;
  256.     for(i=0;i<9;)       //分两屏,上半屏和下半屏,因为起始地址不同,需要分开
  257.     {
  258.         for(x=0;x<32;x++)   //32行
  259.         {
  260.             WriteCommandLCD(0x34,1);
  261.             WriteCommandLCD((u8)(0x80+x),1);//列地址
  262.             WriteCommandLCD((u8)(0x80+i),1);    //行地址,下半屏,即第三行地址0X88
  263.             WriteCommandLCD(0x30,1);        
  264.             for(y=0;y<16;y++)   
  265.                 WriteDataLCD(DData[tmp+y]);//读取数据写入LCD
  266.             tmp+=16;        
  267.         }
  268.         i+=8;
  269.     }
  270.     WriteCommandLCD(0x36,1);    //扩充功能设定
  271.     WriteCommandLCD(0x30,1);
  272. }

复制代码

回复

使用道具 举报

15#
ID:61140 发表于 2023-10-21 20:18 | 只看该作者
hhh402 发表于 2022-7-13 15:16
除了将全部IO口引出之外,看不出有什么特别之处,与其他开发板有什么区别?

此板的布线和铺铜远优于官方的开发板。搞干扰性能极好
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表