数码管不同位显示不同的数字
main.c
#include "spi.h"extern void printf(const char *fmt, ...);void delay_ms(int ms){int i,j;for(i = 0; i < ms;i++)for (j = 0; j < 1800; j++);} //保存0-9编码的数组int num[10] = {0xFC,0x60,0xDA,0xF2,0x66,0xB6,0x3E,0xE0,0xFE,0xF6};int main(void){unsigned char i,j;SPI_init();while(1){for ( j = 0; j<2000; j++){for(i = 0; i < 10; i++){SPI_write(0x80); // 发送数码管的位 SPI_write(num[i]); // 发送数码管的段NSS_OUTPUT_L();delay_ms(10);NSS_OUTPUT_H(); // 锁存的时钟从低到高的变化// 将移位寄存器中的数据锁存到锁存寄存器中SPI_write(0x40); // 发送数码管的位 SPI_write(num[i]); // 发送数码管的段NSS_OUTPUT_L();delay_ms(10);NSS_OUTPUT_H(); // 锁存的时钟从低到高的变化// 将移位寄存器中的数据锁存到锁存寄存器中SPI_write(0x20); // 发送数码管的位 SPI_write(num[i]); // 发送数码管的段NSS_OUTPUT_L();delay_ ms(10);NSS_OUTPUT_H(); // 锁存的时钟从低到高的变化// 将移位寄存器中的数据锁存到锁存寄存器中SPI_write(0x10); // 发送数码管的位 SPI_write(num[i]); // 发送数码管的段NSS_OUTPUT_L();delay_ms(10);NSS_OUTPUT_H(); // 锁存的时钟从低到高的变化// 将移位寄存器中的数据锁存到锁存寄存器中}}}return 0;}
spi.c
#include "spi.h"void delay_us1(unsigned int us)
{int i,j;for ( i = 0; i < us; i++){for ( j = 0; j < us; j++);}
}void SPI_init(void)
{//1.使能GPIOE时钟RCC->MP_AHB4ENSETR |= (0x1 << 4); //2.MOSI管脚PE14 设置其输入的属性GPIOE->MODER &= (~(0x3 << 28));GPIOE->MODER |= (0x1 << 28);GPIOE->OTYPER &= (~(0x1 << 14));GPIOE ->OSPEEDR &= (~(0X3 << 28));GPIOE ->PUPDR &= (~(0x3 << 28));//PE13 MISOGPIOE->MODER &= (~(0x3 << 24));GPIOE->MODER |= (0x1 << 24);GPIOE->OTYPER &= (~(0x1 << 12));GPIOE ->OSPEEDR &= (~(0X3 << 24));GPIOE ->PUPDR &= (~(0x3 << 24));//NSS PE11GPIOE->MODER &= (~(0x3 << 22));GPIOE->MODER |= (0x1 << 22);GPIOE->OTYPER &= (~(0x1 << 11));GPIOE ->OSPEEDR &= (~(0X3 << 22));GPIOE ->PUPDR &= (~(0x3 << 22));}void SPI_write(unsigned char dat)
{unsigned int i;for(i=0;i<8;i++){if (dat&0x01){/* 输出高电平*/MOSI_OUTPUT_H();}else{/* 输出低电平 */MOSI_OUTPUT_L();}dat >>= 1;//产生上升沿//时钟线从低电平到高电平的变化时,MOSI数据线上的数据//被写到595芯片的移位寄存器中SCK_OUTPUT_L(); //SCK拉低delay_us1(20);SCK_OUTPUT_H(); //SCK拉高delay_us1(20);}
}