智能物流仓储项目(七)——SPI数码管驱动程序以及应用程序编写

cmd.h

#ifndef __CMD_H__
#define __CMD_H__

#define spi_1_to_4 _IOW('k',0,int)
#define spi_a_f  _IOW('k',1,int)
#define spi_OFF  _IOW('f',0,int)
#endif

spi_sg.c

#include <linux/init.h>
#include <linux/module.h>
#include <linux/spi/spi.h>
#include <linux/device.h>
#define CNAME "m74hc595"
#define spi_1_to_4 _IOW('k',0,int)
#define spi_a_f  _IOW('k',1,int)
char buf1_4[]={0x1,0x2,0x4,0x8,0xf}; // 1-4
char a_fbuf[]={
    0x3f, //0
	0x06, //1
	0x5b, //2
	0x4f, //3
	0x66, //4
	0x6d, //5
	0x7d, //6
	0x07, //7
	0x7f, //8
	0x6f, //9
	0x58, //c
    0x77, //R
}; // a-f

int smg2=0;
struct spi_device *sspi;
int spi_open(struct inode* inode, struct file* file)
{
    return 0;
}
long spi_ioctl(struct file* file,unsigned int cmd, unsigned long args)
{
    char O_2dian;
    switch (cmd) {
    case spi_1_to_4:
        spi_write(sspi,&am
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
SPI屏幕驱动程序编写需要考虑硬件平台和屏幕型号等因素,以下是一个基于Keil5开发环境的SPI屏幕驱动程序的示例: ```c #include <stdio.h> #include <stdlib.h> #include "stm32f4xx.h" #include "stm32f4xx_spi.h" #include "stm32f4xx_gpio.h" #include "stm32f4xx_rcc.h" // 定义SPI口和GPIO口 #define SPI_PORT SPI1 #define SPI_GPIO_PORT GPIOA #define SPI_MISO_PIN GPIO_Pin_6 #define SPI_MOSI_PIN GPIO_Pin_7 #define SPI_SCK_PIN GPIO_Pin_5 #define SPI_NSS_PIN GPIO_Pin_4 // 定义延时函数 void Delay(__IO uint32_t nCount) { while(nCount--) { } } // 初始化SPI口 static void SPI_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; // 开启SPI口和GPIO口的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // 配置SPI口的GPIO口 GPIO_InitStructure.GPIO_Pin = SPI_MOSI_PIN | SPI_MISO_PIN | SPI_SCK_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(SPI_GPIO_PORT, &GPIO_InitStructure); // 配置SPI口的片选口 GPIO_InitStructure.GPIO_Pin = SPI_NSS_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(SPI_GPIO_PORT, &GPIO_InitStructure); // 将GPIO口与SPI口的相应引脚绑定 GPIO_PinAFConfig(SPI_GPIO_PORT, GPIO_PinSource5, GPIO_AF_SPI1); GPIO_PinAFConfig(SPI_GPIO_PORT, GPIO_PinSource6, GPIO_AF_SPI1); GPIO_PinAFConfig(SPI_GPIO_PORT, GPIO_PinSource7, GPIO_AF_SPI1); // 配置SPISPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; 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_4; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_Init(SPI_PORT, &SPI_InitStructure); // 使能SPISPI_Cmd(SPI_PORT, ENABLE); } // 向SPI口写入数据 static void SPI_Write(uint8_t *buf, uint32_t len) { uint32_t i; for (i = 0; i < len; i++) { // 等待SPI口空闲 while (SPI_I2S_GetFlagStatus(SPI_PORT, SPI_I2S_FLAG_TXE) == RESET); // 向SPI口写入数据 SPI_I2S_SendData(SPI_PORT, buf[i]); // 等待SPI口传输完成 while (SPI_I2S_GetFlagStatus(SPI_PORT, SPI_I2S_FLAG_RXNE) == RESET); // 读取SPI口接收到的数据 SPI_I2S_ReceiveData(SPI_PORT); } } // 向屏幕发送命令 static void SCREEN_SendCommand(uint8_t cmd) { GPIO_ResetBits(SPI_GPIO_PORT, SPI_NSS_PIN); // 使能屏幕 SPI_Write(&cmd, 1); // 向屏幕发送命令 GPIO_SetBits(SPI_GPIO_PORT, SPI_NSS_PIN); // 失能屏幕 } // 向屏幕发送数据 static void SCREEN_SendData(uint8_t *buf, uint32_t len) { GPIO_ResetBits(SPI_GPIO_PORT, SPI_NSS_PIN); // 使能屏幕 SPI_Write(buf, len); // 向屏幕发送数据 GPIO_SetBits(SPI_GPIO_PORT, SPI_NSS_PIN); // 失能屏幕 } // 初始化屏幕 static void SCREEN_Init(void) { SCREEN_SendCommand(0x28); // 设置LCD显示模式 SCREEN_SendCommand(0x11); // 关闭睡眠模式 SCREEN_SendCommand(0xB1); // 设置像素格式 SCREEN_SendData((uint8_t *)"\x05", 1); SCREEN_SendData((uint8_t *)"\x3C", 1); SCREEN_SendData((uint8_t *)"\x3C", 1); SCREEN_SendCommand(0xB6); // 设置扫描模式 SCREEN_SendData((uint8_t *)"\x00", 1); SCREEN_SendData((uint8_t *)"\x22", 1); SCREEN_SendCommand(0xC0); // 设置电压偏置系数 SCREEN_SendData((uint8_t *)"\x02", 1); SCREEN_SendCommand(0xC1); // 设置LCD驱动电流 SCREEN_SendData((uint8_t *)"\x35", 1); SCREEN_SendCommand(0xC2); // 设置LCD预充电电流 SCREEN_SendData((uint8_t *)"\x01", 1); SCREEN_SendCommand(0xC3); // 设置LCD预充电时间 SCREEN_SendData((uint8_t *)"\x00", 1); SCREEN_SendCommand(0xC4); // 设置LCD预充电时间 SCREEN_SendData((uint8_t *)"\x2A", 1); SCREEN_SendCommand(0xC5); // 设置VcomH电压 SCREEN_SendData((uint8_t *)"\x2F", 1); SCREEN_SendCommand(0xE0); // 设置Gamma曲线 SCREEN_SendData((uint8_t *)"\x10", 1); SCREEN_SendData((uint8_t *)"\x0E", 1); SCREEN_SendData((uint8_t *)"\x02", 1); SCREEN_SendData((uint8_t *)"\x03", 1); SCREEN_SendData((uint8_t *)"\x0E", 1); SCREEN_SendData((uint8_t *)"\x07", 1); SCREEN_SendData((uint8_t *)"\x02", 1); SCREEN_SendData((uint8_t *)"\x07", 1); SCREEN_SendData((uint8_t *)"\x0A", 1); SCREEN_SendData((uint8_t *)"\x12", 1); SCREEN_SendData((uint8_t *)"\x27", 1); SCREEN_SendData((uint8_t *)"\x37", 1); SCREEN_SendData((uint8_t *)"\x00", 1); SCREEN_SendData((uint8_t *)"\x0D", 1); SCREEN_SendData((uint8_t *)"\x0E", 1); SCREEN_SendData((uint8_t *)"\x10", 1); SCREEN_SendCommand(0xE1); // 设置Gamma曲线 SCREEN_SendData((uint8_t *)"\x10", 1); SCREEN_SendData((uint8_t *)"\x0E", 1); SCREEN_SendData((uint8_t *)"\x03", 1); SCREEN_SendData((uint8_t *)"\x03", 1); SCREEN_SendData((uint8_t *)"\x0F", 1); SCREEN_SendData((uint8_t *)"\x06", 1); SCREEN_SendData((uint8_t *)"\x02", 1); SCREEN_SendData((uint8_t *)"\x08", 1); SCREEN_SendData((uint8_t *)"\x0A", 1); SCREEN_SendData((uint8_t *)"\x13", 1); SCREEN_SendData((uint8_t *)"\x26", 1); SCREEN_SendData((uint8_t *)"\x36", 1); SCREEN_SendData((uint8_t *)"\x00", 1); SCREEN_SendData((uint8_t *)"\x0D", 1); SCREEN_SendData((uint8_t *)"\x0E", 1); SCREEN_SendData((uint8_t *)"\x10", 1); SCREEN_SendCommand(0x29); // 开启LCD显示 } int main(void) { SPI_Configuration(); // 初始化SPI口 SCREEN_Init(); // 初始化屏幕 while (1) { } } ``` 在这个示例程序中,我们首先定义了一些常量和函数,包括SPI口和GPIO口的引脚定义、延时函数、SPI口初始化函数、向SPI口写入数据的函数、向屏幕发送命令和数据的函数以及初始化屏幕的函数等。 在主函数中,我们首先调用SPI口初始化函数和屏幕初始化函数来初始化硬件,然后进入一个死循环,程序会一直运行,直到被强制终止。 需要注意的是,这个示例程序仅供参考,实际的驱动程序需要根据具体的硬件平台和屏幕型号来进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小徐的记事本

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值