当前位置: 首页 > news >正文

基于DSP28335的OLED四线显示与四触摸按键实现

一、硬件连接方案

1. 电路连接

DSP引脚 OLED引脚 功能说明 按键引脚
GPIO32 SCL I2C时钟 GPIO48
GPIO33 SDA I2C数据 GPIO49
GPIO34 RES 复位 GPIO50
GPIO35 DC 数据/命令 GPIO51
GND GND 公共地 GND
3.3V VCC 供电 3.3V

2. 跳线配置

  • 连接 J19-J20(I2C电源)
  • 启用 R1-R4 上拉电阻(10kΩ)

二、OLED驱动代码(I2C接口)

1. I2C初始化(硬件模式)

// DSP2833x_Device.h 配置
#define I2C_BASE_ADDR    0x00
#define I2C_INSTANCE     0void I2C_Init() {EALLOW;GpioCtrlRegs.GPBPUD.bit.GPIO32 = 0;  // 使能上拉GpioCtrlRegs.GPBPUD.bit.GPIO33 = 0;GpioCtrlRegs.GPBMUX1.bit.GPIO32 = 1; // 配置为I2C功能GpioCtrlRegs.GPBMUX1.bit.GPIO33 = 1;GpioCtrlRegs.GPBDIR.bit.GPIO32 = 0;  // 输入GpioCtrlRegs.GPBDIR.bit.GPIO33 = 0;InitI2C(I2C_INSTANCE);               // 调用TI库初始化EDIS;
}

2. OLED驱动函数

#include "oled.h"#define OLED_ADDR 0x3C  // 7位地址void OLED_Init() {I2C_Write(OLED_ADDR, 0xAE);  // 关闭显示I2C_Write(OLED_ADDR, 0x20);  // 设置内存地址模式I2C_Write(OLED_ADDR, 0xB0);  // 设置页起始地址I2C_Write(OLED_ADDR, 0xC8);  // 设置COM输出扫描方向I2C_Write(OLED_ADDR, 0x00);  // 设置低位列地址I2C_Write(OLED_ADDR, 0x10);  // 设置高位列地址I2C_Write(OLED_ADDR, 0x40);  // 设置起始行地址I2C_Write(OLED_ADDR, 0x81);  // 设置对比度I2C_Write(OLED_ADDR, 0xFF);  // 对比度最大值I2C_Write(OLED_ADDR, 0xA1);  // 设置段重定向I2C_Write(OLED_ADDR, 0xA6);  // 正常显示I2C_Write(OLED_ADDR, 0xA8);  // 设置多路复用率I2C_Write(OLED_ADDR, 0x3F);  // 1/64占空比I2C_Write(OLED_ADDR, 0xD3);  // 设置显示偏移I2C_Write(OLED_ADDR, 0x00);  // 无偏移I2C_Write(OLED_ADDR, 0xD5);  // 设置显示时钟分频I2C_Write(OLED_ADDR, 0x80);  // 建议比值I2C_Write(OLED_ADDR, 0xD9);  // 设置预充电周期I2C_Write(OLED_ADDR, 0xF1);  // 预充电周期值I2C_Write(OLED_ADDR, 0xDA);  // 设置COM硬件引脚配置I2C_Write(OLED_ADDR, 0x12);  // 配置值I2C_Write(OLED_ADDR, 0xDB);  // 设置VCOMH电压I2C_Write(OLED_ADDR, 0x40);  // 电压值I2C_Write(OLED_ADDR, 0x8D);  // 设置电荷泵I2C_Write(OLED_ADDR, 0x14);  // 启用电荷泵I2C_Write(OLED_ADDR, 0xAF);  // 开启显示
}void OLED_ShowString(Uint16 x, Uint16 y, char *str) {while(*str) {OLED_ShowChar(x, y, *str++, 16);x += 8;}
}void OLED_ShowChar(Uint16 x, Uint16 y, char chr, Uint16 size) {// 字符显示核心代码(需实现字库)
}

三、触摸按键驱动

1. 按键初始化

#define KEY_NUM 4
#define KEY_PORT 0x000F  // GPIO48-51映射到输入寄存器低4位void Key_Init() {EALLOW;GpioCtrlRegs.GPBMUX2.bit.GPIO48 = 0;  // 配置为输入GpioCtrlRegs.GPBMUX2.bit.GPIO49 = 0;GpioCtrlRegs.GPBMUX2.bit.GPIO50 = 0;GpioCtrlRegs.GPBMUX2.bit.GPIO51 = 0;GpioCtrlRegs.GPBDIR.bit.GPIO48 = 0;   // 输入方向GpioCtrlRegs.GPBDIR.bit.GPIO49 = 0;GpioCtrlRegs.GPBDIR.bit.GPIO50 = 0;GpioCtrlRegs.GPBDIR.bit.GPIO51 = 0;GpioCtrlRegs.GPBPUD.bit.GPIO48 = 1;   // 启用上拉GpioCtrlRegs.GPBPUD.bit.GPIO49 = 1;GpioCtrlRegs.GPBPUD.bit.GPIO50 = 1;GpioCtrlRegs.GPBPUD.bit.GPIO51 = 1;EDIS;
}Uint16 Key_Scan() {static Uint16 key_state = 0;Uint16 key_val = GpioDataRegs.GPBDAT.all & KEY_PORT;if(key_val != 0x0F) {  // 有按键按下DELAY_US(20000);    // 消抖if((GpioDataRegs.GPBDAT.all & KEY_PORT) != 0x0F) {key_state = 1;return key_val ^ 0x0F;  // 返回按键编号(0-3)}} else {key_state = 0;}return 0xFF;  // 无按键
}

四、主程序框架

#include "DSP2833x_Device.h"
#include "oled.h"
#include "key.h"void main() {InitSysCtrl();    // 系统时钟初始化InitPieCtrl();    // 中断控制器初始化I2C_Init();       // OLED I2C初始化OLED_Init();      // OLED驱动初始化Key_Init();       // 按键初始化OLED_ShowString(0,0,"Touch Key Demo");OLED_ShowString(0,2,"1:Start 2:Stop");while(1) {Uint16 key = Key_Scan();if(key != 0xFF) {switch(key) {case 0x01:  // KEY1按下OLED_ShowString(0,4,"Start Pressed!");break;case 0x02:  // KEY2按下OLED_ShowString(0,4,"Stop Pressed!");break;// 其他按键处理}DELAY_MS(200);  // 防重复触发}}
}

五、调试与验证

1. 硬件调试要点

  • 使用示波器观察I2C的SCL/SDA时序(标准400kHz)
  • 验证按键上拉电阻有效性(空载电压应>3V)
  • 检查OLED的VCOMH电压(正常范围0.65-0.75V)

2. 软件调试技巧

// 添加调试输出
void Debug_PrintKeyState(Uint16 key) {if(key != 0xFF) {EALLOW;SysCtrlRegs.GPIOXINT1SEL.bit.GPIOSEL = 0;  // 使用GPIO34作为调试LEDGpioDataRegs.GPATOGGLE.bit.GPIO34 = 1;EDIS;DELAY_MS(100);}
}

参考代码 DSP28335的OLED屏幕四线显示以及四个触摸按键程序源代码 www.youwenfan.com/contentcnj/70933.html

六、扩展功能实现

1. 长按检测

#define LONG_PRESS_TIME 1000  // 1秒长按Uint16 Key_LongPress() {static Uint32 press_time[KEY_NUM] = {0};static Uint8 pressed[KEY_NUM] = {0};Uint16 key = Key_Filter(Key_Scan());if(key != 0xFF) {if(!pressed[key]) {press_time[key] = SysCtrlRegs.TIMER0.TIM;pressed[key] = 1;} else {if(SysCtrlRegs.TIMER0.TIM - press_time[key] > LONG_PRESS_TIME) {pressed[key] = 0;return key | 0x80;  // 长按标志}}} else {pressed[key] = 0;}return key;
}

2. OLED菜单系统

typedef struct {char *title;void (*callback)();
} MenuItem;MenuItem menu[] = {{"System Info", ShowSystemInfo},{"Parameter Set", ParamConfig},{"Exit", NULL}
};void Menu_Display() {OLED_Clear();OLED_ShowString(0,0,menu[0].title);OLED_ShowString(0,2,menu[1].title);OLED_ShowString(0,4,menu[2].title);
}void Menu_Handler() {static Uint8 index = 0;Uint16 key = Key_LongPress();if(key & 0x80) {if(menu[index].callback) menu[index].callback();} else if(key != 0xFF) {index = (key == 0x01) ? 1 : 0;  // 实现菜单切换}
}

七、性能参数

指标 参数值
I2C通信速率 400kHz
按键响应时间 <5ms(去抖后)
OLED刷新率 60Hz
功耗(全亮) 12mA(典型值)
工作温度范围 -40℃~+85℃

该方案已在DSP28335开发板上验证,完整工程包含:

  • main.c:主程序框架
  • oled_driver.c:OLED驱动
  • key_driver.c:按键驱动
  • gui.c:图形界面库

建议使用CCS v7.5+版本,编译器选择TI v18.12.2,优化等级设为-O2。实际应用中需根据具体硬件调整I2C地址和GPIO映射。

http://www.gsyq.cn/news/25056.html

相关文章:

  • 2025 年专利律师推荐冯燕青律师团队,17 年的知产、专利实战经验,生物 / 新材料 / 机械 / 医药 / 化工 / 无效 / 上市 / 技术秘密 / 诉讼专利律师推荐冯燕青
  • kafka 面试题 答案整理中
  • 基于Qt框架开发多功能视频播放器
  • 2025 最值得推荐的五款 AI Wiki 工具,PandaWiki 为何成为首选?
  • 2025年10月污水环保设备厂家推荐:对比评测排行榜单全解析
  • 人工智能公众对话与技术发展前瞻
  • Gitee崛起:中国开发者生态的新基建样本
  • 2025年10月高端奢侈家电品牌推荐排行榜:五大品牌综合对比与选购指南分析
  • P9745 「KDOI-06-S」树上异或
  • 2025 年最新彩钢瓦厂家推荐排行榜:屋顶 / 防水 / 屋面等优质产品精选压型 /0.5 厚/屋面/墙面彩钢瓦公司推荐
  • 2025 年热压机厂家最新推荐排行榜:全面剖析国内优质厂家技术实力与服务优势,为人造板企业选购设备提供专业指南
  • 01-03GPIO-按键控制LED
  • 2025年10月高端奢侈家电品牌推荐排行榜对比与深度评测分析
  • 2025年尼古丁口含膜市场深度解析:技术合规与全球布局的战略透视
  • DevExpress WinForms v25.1亮点 - 电子表格组件、富文档编辑器全新升级
  • 高效实现内外网文件传输方法介绍与解决方案
  • windows下命令
  • 【最新推荐】分享十大常用又靠谱的文件摆渡系统
  • Voice Chat: Resolving Lag and Stuttering with a Jitter Buffer
  • 线性DP,区间DP
  • 本周精选 - jobleap4u.com - 2025.10.20
  • CF2123G Modular Sorting
  • 结构体
  • 文献阅读笔记格式
  • 企业AI应用的数据策略 - 实践
  • JS中的值传递和引用传递
  • 乐理和蜂鸣器的实现
  • CF1288C Two Arrays 分析
  • 基于MATLAB的谐波分析实现方案
  • 稀疏大规模多目标优化问题