找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 412|回复: 1
收起左侧

51单片机软件实现(SPI 驱动 Mini12864)

[复制链接]
ID:880573 发表于 2025-10-18 08:16 | 显示全部楼层 |阅读模式
  1. #include "STC8H2K12U.h"
  2. #include <intrins.h>

  3. // 引脚定义
  4. sbit LCD_SDA  = P3^4;  // SPI数据
  5. sbit LCD_SCLK = P3^5;  // SPI时钟
  6. sbit LCD_A0   = P3^2;  // 0=命令,1=数据
  7. sbit LCD_RST  = P3^3;  // 复位
  8. sbit LCD_CS   = P3^1;  // 片选

  9. // 延时函数(微秒级,近似值)
  10. void Delay_us(unsigned int us) {
  11.     while(us--) {
  12.         _nop_();_nop_();_nop_();_nop_();
  13.         _nop_();_nop_();_nop_();_nop_();
  14.     }
  15. }

  16. // 延时函数(毫秒级)
  17. void Delay_ms(unsigned int ms) {
  18.     unsigned int i, j;
  19.     for(i=0; i<ms; i++)
  20.         for(j=0; j<1200; j++);
  21. }

  22. // 向LCD发送1字节数据(SPI模拟)
  23. void LCD_WriteByte(unsigned char dat) {
  24.     unsigned char i;
  25.     LCD_CS = 0;  // 选中屏幕
  26.     for(i=0; i<8; i++) {
  27.         LCD_SCLK = 0;          // 时钟拉低
  28.         LCD_SDA = (dat & 0x80) ? 1 : 0;  // 发送高位
  29.         dat <<= 1;             // 移位
  30.         LCD_SCLK = 1;          // 时钟拉高,锁存数据
  31.     }
  32.     LCD_CS = 1;  // 取消片选
  33. }

  34. // 发送命令
  35. void LCD_WriteCmd(unsigned char cmd) {
  36.     LCD_A0 = 0;  // 命令模式
  37.     LCD_WriteByte(cmd);
  38. }

  39. // 发送数据
  40. void LCD_WriteData(unsigned char dat) {
  41.     LCD_A0 = 1;  // 数据模式
  42.     LCD_WriteByte(dat);
  43. }

  44. // 屏幕初始化
  45. void LCD_Init(void) {
  46.     LCD_RST = 0;  // 复位
  47.     Delay_ms(10);
  48.     LCD_RST = 1;  // 释放复位
  49.     Delay_ms(100);
  50.    
  51.     LCD_WriteCmd(0xAF);  // 开显示
  52.     LCD_WriteCmd(0xA0);  // 列地址正序(根据屏幕调整)
  53.     LCD_WriteCmd(0xC0);  // 行地址正序(根据屏幕调整)
  54.     LCD_WriteCmd(0xA6);  // 正常显示(0xA7反显)
  55.     LCD_WriteCmd(0x15);  // 设置列地址范围
  56.     LCD_WriteData(0x00); // 起始列
  57.     LCD_WriteData(0x7F); // 结束列(128列)
  58.     LCD_WriteCmd(0x75);  // 设置行地址范围
  59.     LCD_WriteData(0x00); // 起始行
  60.     LCD_WriteData(0x3F); // 结束行(64行)
  61.     LCD_WriteCmd(0x01);  // 清屏
  62.     Delay_ms(10);
  63. }

  64. // 设置显示位置(x:0-127列,y:0-63行)
  65. void LCD_SetPos(unsigned char x, unsigned char y) {
  66.     LCD_WriteCmd(0x15);      // 设置列地址
  67.     LCD_WriteData(x);        // 起始列=x
  68.     LCD_WriteData(0x7F);     // 结束列固定为127
  69.     LCD_WriteCmd(0x75);      // 设置行地址
  70.     LCD_WriteData(y);        // 起始行=y
  71.     LCD_WriteData(0x3F);     // 结束行固定为63
  72. }

  73. // 清屏(填充0)
  74. void LCD_Clear(void) {
  75.     unsigned int i, j;
  76.     LCD_SetPos(0, 0);
  77.     for(i=0; i<64; i++) {    // 64行
  78.         for(j=0; j<128; j++) { // 128列
  79.             LCD_WriteData(0x00);
  80.         }
  81.     }
  82. }

  83. // 显示一个ASCII字符(8x16点阵,x:0-15列块,y:0-3行块)
  84. // 需提前定义字库(示例仅包含部分字符)
  85. unsigned char code ASCII_8x16[][16] = {
  86.     {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 空格
  87.     {0x00,0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00}, // '0' (0x30)
  88.     // 更多字符需自行添加,可通过字模软件生成
  89. };

  90. void LCD_DispChar(unsigned char x, unsigned char y, unsigned char ch) {
  91.     unsigned char i;
  92.     ch -= 0x20;  // 偏移量(空格为0x20)
  93.     // 上8行
  94.     LCD_SetPos(x*8, y*16);
  95.     for(i=0; i<8; i++) {
  96.         LCD_WriteData(ASCII_8x16[ch][i]);
  97.     }
  98.     // 下8行
  99.     LCD_SetPos(x*8, y*16 + 8);
  100.     for(i=8; i<16; i++) {
  101.         LCD_WriteData(ASCII_8x16[ch][i]);
  102.     }
  103. }

  104. // 显示字符串
  105. void LCD_DispString(unsigned char x, unsigned char y, unsigned char *str) {
  106.     while(*str) {
  107.         LCD_DispChar(x++, y, *str++);
  108.         if(x >= 16) {  // 128列 / 8列每字符 = 16个字符
  109.             x = 0;
  110.             y++;
  111.             if(y >= 4) y = 0; // 64行 / 16行每字符 = 4行
  112.         }
  113.     }
  114. }

  115. void main(void) {
  116.     LCD_Init();    // 初始化屏幕
  117.     LCD_Clear();   // 清屏
  118.    
  119.     // 显示示例
  120.     LCD_DispString(0, 0, "Mini12864 Test");
  121.     LCD_DispString(0, 1, "STC8H Driver");
  122.     LCD_DispChar(0, 3, 'A');  // 显示单个字符
  123.    
  124.     while(1);
  125. }
复制代码
回复

使用道具 举报

ID:1064915 发表于 2025-10-18 11:40 | 显示全部楼层
mini12864控制器内部是ST7565R显示驱动芯片?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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