|
发表于 2023-7-27 15:40:25
|
显示全部楼层
硬件SPI挺简单的。
在main()函数里设置一下引脚,然后把代码里的引脚改一下就行了
P_SW2 |= 0x80; // 使能访问XFR
// P_SW1 = 0x00; //0000:SS-P1.2orP5.4, MOSI-P1.3, MISO-P1.4, SCLK-P1.5 SPI功能脚切换
// P_SW1 = 0x04; //0100:SS-P2.2, MOSI-P2.3, MISO-P2.4, SCLK-P2.5 SPI功能脚切换
// P_SW1 = 0x08; //1000:SS-P5.4, MOSI-P4.0, MISO-P4.1, SCLK-P4.3 SPI功能脚切换
P_SW1 = 0x0c; // 1100:SS-P3.5, MOSI-P3.4, MISO-P3.3, SCLK-P3.2 SPI功能脚切换
SPI_init(); // 初始化硬件SPI
- /********************引脚定义区********************/
- sbit LCD_CS = P3 ^ 7; //片选 CS
- sbit LCD_RST = P3 ^ 6; //复位 RST
- sbit LCD_RS = P3 ^ 5; //数据指令 A0/DC
- sbit LCD_CLK = P3 ^ 2; //串行时钟 SCL
- sbit LCD_DAT = P3 ^ 4; //串行数据 SDA
- // 7 6 5 4 3 2 1 0 Reset Value
- // SSIG SPEN DORD MSTR CPOL CPHA SPR1 SPR0 0x00
- #define SSIG 1 //1: 忽略SS脚,由MSTR位决定主机还是从机 0: SS脚用于决定主从机。
- #define SPEN 1 //1: 允许SPI, 0:禁止SPI,所有SPI管脚均为普通IO
- #define DORD 0 //1:LSB先发, 0:MSB先发
- #define MSTR 1 //1:设为主机 0:设为从机
- #define CPOL 1 //1: 空闲时SCLK为高电平, 0:空闲时SCLK为低电平
- #define CPHA 1 //
- #define SPR1 0 //SPR1,SPR0 00: fosc/4, 01: fosc/8
- #define SPR0 0 // 10: fosc/16, 11: fosc/32 or fosc/2(快速SPI模式时)
- #define SPEED_4 0 // fosc/4
- #define SPEED_16 1 // fosc/8
- #define SPEED_64 2 // fosc/16
- #define SPEED_2 3 // fosc/32 or fosc/2(快速SPI模式时)
- //#define SPEED_128 3 // fosc/32
- //sfr SPSTAT = 0xCD; //SPI状态寄存器
- // 7 6 5 4 3 2 1 0 Reset Value
- // SPIF WCOL - - - - - -
- #define SPIF 0x80 //SPI传输完成标志。写入1清0。
- #define WCOL 0x40 //SPI写冲突标志。写入1清0。
- /*********************************
- 函数名称:SPI_init
- 功能:SPI初始化
- 输入:无
- 输出:无
- 备注:无
- *********************************/
- void SPI_init(void)
- {
- SPCTL = (SSIG << 7)+(SPEN << 6)+(DORD << 5)+(MSTR << 4)+(CPOL << 3)+(CPHA << 2)+SPEED_2;
- }
- /*********************************
- 函数名称:Lcd_write_byte
- 功能:LCD通过硬件SPI发送一个字节
- 输入:写入内容
- 输出:无
- 备注:硬件SPI串口
- *********************************/
- void Lcd_write_byte(unsigned char Byte)
- {
- SPDAT = Byte; //发送一个字节
- while((SPSTAT & SPIF)==0) ; //等待发送完成
- SPSTAT = SPIF+WCOL; //清0 SPIF和WCOL标志
- }
复制代码 |
|