OLED显示部分调试
This commit is contained in:
123
Driver/iic.c
Normal file
123
Driver/iic.c
Normal file
@ -0,0 +1,123 @@
|
||||
#include "iic.h"
|
||||
|
||||
|
||||
// 延时函数(2us)
|
||||
void IIC_Delay(void) {
|
||||
// 软件延时
|
||||
// _nop_();_nop_();_nop_();_nop_();_nop_();// 30个nop约1us@30MHz
|
||||
// _nop_();_nop_();_nop_();..............
|
||||
|
||||
DelayUs(1);
|
||||
}
|
||||
void IIC_Init(void) {
|
||||
// 配置P2.6和P2.7为开漏模式
|
||||
P2M1 |= 0xC0; // 1100 0000
|
||||
P2M0 |= 0xC0; // 开漏模式
|
||||
SDA = 1;
|
||||
SCL = 1;
|
||||
}
|
||||
|
||||
void IIC_Start(void) {
|
||||
SDA = 1;
|
||||
SCL = 1;
|
||||
IIC_Delay();
|
||||
SDA = 0;
|
||||
IIC_Delay();
|
||||
SCL = 0;
|
||||
}
|
||||
|
||||
void IIC_Stop(void) {
|
||||
SDA = 0;
|
||||
SCL = 1;
|
||||
IIC_Delay();
|
||||
SDA = 1;
|
||||
IIC_Delay();
|
||||
}
|
||||
|
||||
void IIC_SendByte(u8 dat) {
|
||||
u8 i;
|
||||
for(i=0; i<8; i++) {
|
||||
SDA = (dat & 0x80) ? 1 : 0;
|
||||
dat <<= 1;
|
||||
IIC_Delay();
|
||||
SCL = 1;
|
||||
IIC_Delay();
|
||||
SCL = 0;
|
||||
}
|
||||
}
|
||||
|
||||
u8 IIC_RecvByte(void) {
|
||||
u8 i, dat = 0;
|
||||
SDA = 1; // 释放数据线
|
||||
for(i=0; i<8; i++) {
|
||||
dat <<= 1;
|
||||
SCL = 1;
|
||||
IIC_Delay();
|
||||
if(SDA) dat |= 0x01;
|
||||
SCL = 0;
|
||||
IIC_Delay();
|
||||
}
|
||||
return dat;
|
||||
}
|
||||
|
||||
bit IIC_WaitAck(void) {
|
||||
SDA = 1; // 主机释放SDA
|
||||
IIC_Delay();
|
||||
SCL = 1;
|
||||
IIC_Delay();
|
||||
if(SDA) { // 检测SDA状态
|
||||
SCL = 0;
|
||||
return 0; // 无ACK
|
||||
} else {
|
||||
SCL = 0;
|
||||
return 1; // 收到ACK
|
||||
}
|
||||
}
|
||||
|
||||
void IIC_SendAck(bit ack) {
|
||||
SDA = ack ? 0 : 1;
|
||||
IIC_Delay();
|
||||
SCL = 1;
|
||||
IIC_Delay();
|
||||
SCL = 0;
|
||||
SDA = 1; // 释放SDA
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief I²C连续写入多个字节数据
|
||||
* @param devAddr : 从机地址(7位地址,左对齐)
|
||||
* @param regAddr : 寄存器地址
|
||||
* @param pData : 待写入数据缓冲区
|
||||
* @param len : 数据长度
|
||||
* @retval 写入状态:1-成功,0-失败
|
||||
*/
|
||||
bit IIC_WriteBytes(u8 devAddr, u8 regAddr, u8 *pData, u8 len) {
|
||||
IIC_Start(); // 启动I²C通信[6](@ref)
|
||||
|
||||
// 发送设备地址(写模式)
|
||||
IIC_SendByte(devAddr & 0xFE); // 7位地址+写位(0)
|
||||
if (!IIC_WaitAck()) { // 检测从机应答
|
||||
IIC_Stop();
|
||||
return 0; // 无应答则终止[2](@ref)
|
||||
}
|
||||
|
||||
// 发送寄存器地址
|
||||
IIC_SendByte(regAddr);
|
||||
if (!IIC_WaitAck()) {
|
||||
IIC_Stop();
|
||||
return 0; // 寄存器地址无应答
|
||||
}
|
||||
|
||||
// 循环发送数据字节
|
||||
while (len--) {
|
||||
IIC_SendByte(*pData++); // 发送当前字节
|
||||
if (!IIC_WaitAck()) { // 检测数据应答
|
||||
IIC_Stop();
|
||||
return 0; // 数据写入失败
|
||||
}
|
||||
}
|
||||
|
||||
IIC_Stop(); // 结束通信[6](@ref)
|
||||
return 1; // 写入成功
|
||||
}
|
||||
|
27
Driver/iic.h
Normal file
27
Driver/iic.h
Normal file
@ -0,0 +1,27 @@
|
||||
#ifndef __IIC_H__
|
||||
#define __IIC_H__
|
||||
|
||||
#include "stdint.h"
|
||||
#include <intrins.h>
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "delay.h"
|
||||
|
||||
|
||||
// #define FOSC 30000000UL // 定义系统频率
|
||||
|
||||
// sbit SDA = P2^7;
|
||||
// sbit SCL = P2^6;
|
||||
|
||||
void IIC_Init(void);
|
||||
void IIC_Start(void);
|
||||
void IIC_Stop(void);
|
||||
void IIC_SendByte(u8 dat);
|
||||
u8 IIC_RecvByte(void);
|
||||
bit IIC_WaitAck(void);
|
||||
void IIC_SendAck(bit ack);
|
||||
bit IIC_WriteBytes(u8 devAddr, u8 regAddr, u8 *pData, u8 len);
|
||||
bit IIC_ReadBytes(u8 devAddr, u8 regAddr, u8 *pData, u8 len);
|
||||
|
||||
#endif
|
45
Driver/timer4.c
Normal file
45
Driver/timer4.c
Normal file
@ -0,0 +1,45 @@
|
||||
#include "timer4.h"
|
||||
|
||||
u8 Timer4_OF = 0; // 定时器4溢出标志
|
||||
|
||||
// 定时器4初始化(16位自动重载模式)
|
||||
void Timer4_Init(void) {
|
||||
Timer4_Stop(); // 停止定时器4
|
||||
T4T3M &= 0x0F; // 清除T4控制位
|
||||
T4T3M |= 0x20; // 设置T4为1T模式
|
||||
T4L = 0xD0; // 设置定时初始值
|
||||
T4H = 0x8A; // 设置定时初始值 1ms@30MHz 1T
|
||||
IE2 |= 0x40; // 使能定时器4中断
|
||||
}
|
||||
|
||||
// 微秒级延时(误差±0.3us)
|
||||
void Timer4_DelayUs(u16 us) {
|
||||
u32 cycles = us * (FOSC / 1000000); // 计算所需时钟周期数
|
||||
u16 reload = 65536 - (cycles / 1); // 1T模式下无需分频
|
||||
|
||||
T4H = reload >> 8; // 设置重载值高字节
|
||||
T4L = reload & 0xFF;// 低字节
|
||||
T4T3M |= 0x80; // 启动定时器4
|
||||
|
||||
while ( Timer4_OF != True ); // 等待TF4溢出标志置位
|
||||
Timer4_OF = False; // 清除溢出标志
|
||||
}
|
||||
|
||||
// 毫秒级延时(基于微秒级扩展)
|
||||
void Timer4_DelayMs(u16 ms) {
|
||||
while(ms--) {
|
||||
Timer4_DelayUs(1000);
|
||||
}
|
||||
}
|
||||
|
||||
// 停止定时器4
|
||||
void Timer4_Stop(void) {
|
||||
T4T3M &= ~0x80; // 停止定时器4
|
||||
}
|
||||
|
||||
// 定时器4中断服务程序
|
||||
void Timer4_Isr(void) interrupt 20
|
||||
{
|
||||
Timer4_OF = True;
|
||||
Timer4_Stop();
|
||||
}
|
14
Driver/timer4.h
Normal file
14
Driver/timer4.h
Normal file
@ -0,0 +1,14 @@
|
||||
#ifndef __TIMER4_H__
|
||||
#define __TIMER4_H__
|
||||
|
||||
#include "config.h"
|
||||
#include <STC15.H>
|
||||
|
||||
// #define FOSC 30000000UL // 系统时钟30MHz
|
||||
|
||||
void Timer4_Init(void);
|
||||
void Timer4_DelayUs(u16 us);
|
||||
void Timer4_DelayMs(u16 ms);
|
||||
void Timer4_Stop(void);
|
||||
|
||||
#endif
|
25
Driver/uart.c
Normal file
25
Driver/uart.c
Normal file
@ -0,0 +1,25 @@
|
||||
#include "uart.h"
|
||||
#include <STC15.H>
|
||||
|
||||
void Uart1_Init(void) //115200bps@30.000MHz
|
||||
{
|
||||
SCON = 0x50; //8位数据,可变波特率
|
||||
AUXR |= 0x01; //串口1选择定时器2为波特率发生器
|
||||
AUXR |= 0x04; //定时器时钟1T模式
|
||||
T2L = 0xBF; //设置定时初始值
|
||||
T2H = 0xFF; //设置定时初始值
|
||||
AUXR |= 0x10; //定时器2开始计时
|
||||
ES = 1; //使能串口1中断
|
||||
}
|
||||
|
||||
// 重定向putchar函数
|
||||
char putchar(char c) {
|
||||
UART_SendByte(c);
|
||||
return c;
|
||||
}
|
||||
|
||||
void UART_SendByte(unsigned char dat) {
|
||||
SBUF = dat;
|
||||
while(!TI); // 等待发送完成
|
||||
TI = 0; // 清除发送中断标志
|
||||
}
|
9
Driver/uart.h
Normal file
9
Driver/uart.h
Normal file
@ -0,0 +1,9 @@
|
||||
#ifndef __UART_H__
|
||||
#define __UART_H__
|
||||
|
||||
#include "config.h"
|
||||
|
||||
void Uart1_Init(void);
|
||||
void UART_SendByte(unsigned char dat);
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user