595是一款串转并的芯片; (三极管的功能)
1 /*Include---------------------------*/ 2 #include"stm32f10x_lib.h" //包含所有的头文件 3 #include<stdio.h> 4 5 //----------------函数声明-------------------- 6 void Delay_MS(u16 dly); 7 void RCC_Configuration(void); 8 void GPIO_Configuration(void); 9 10 11 /******************************************************************************* 12 * Function Name : main 13 * Description : Main program. 14 * Input : None 15 * Output : None 16 * Return : None 17 *******************************************************************************/ 18 int main(void) 19 { 20 u8 data, i; 21 #ifdef DEBUG 22 debug(); 23 #endif 24 //------------初始化------------ 25 RCC_Configuration(); 26 GPIO_Configuration(); 27 28 //------------数码管控制----------- 29 //smgA1----PC8 30 //RCK----PA1 31 //SCK0---SPISCK----PA5 32 //MISO0-----PA6 33 //MOSI0-----PA7 34 //595_nCS----PA0 35 //PC8 =0; 36 //SCK0 上升沿; MOSI0:数据输出; 37 //595_nCS 为0,要送的目标数据是00100101 38 //RCK上升沿进行锁存; 39 GPIO_ResetBits(GPIOC, GPIO_Pin_8); 40 GPIO_ResetBits(GPIOA, GPIO_Pin_0); 41 42 data = 0x25; 43 for(i=0;i<8;++i) 44 { 45 GPIO_ResetBits(GPIOA, GPIO_Pin_5); //PB5清零 46 if((data&0x01) == 0x01) //注意,595是先送 低位 过去; 47 GPIO_ResetBits(GPIOA, GPIO_Pin_7); 48 else 49 GPIO_SetBits(GPIOA, GPIO_Pin_7); 50 data>>=1; //右移一位并赋值给data 51 GPIO_SetBits(GPIOA, GPIO_Pin_5); //PB5置1,为了产生上升沿 52 } 53 54 GPIO_ResetBits(GPIOA, GPIO_Pin_1); //产生上升沿 55 Delay_MS(10); 56 GPIO_SetBits(GPIOA, GPIO_Pin_1); 57 58 59 60 61 // GPIO_SetBits(GPIOE, GPIO_Pin_11); 62 // data = 0x30; 63 // for(i=0;i<8;++i) 64 // { 65 // GPIO_ResetBits(GPIOB, GPIO_Pin_5); //PB5清零 66 // if((data&0x80) == 0x00) 67 // GPIO_ResetBits(GPIOE, GPIO_Pin_10); 68 // else 69 // GPIO_SetBits(GPIOE, GPIO_Pin_10); 70 // data<<=1; //左移一位并赋值给data 71 // GPIO_SetBits(GPIOB, GPIO_Pin_5); //PB5置1,为了产生上升沿 72 // } 73 // 74 // 75 // while(1) 76 // { 77 // GPIO_SetBits(GPIOA, GPIO_Pin_3); 78 // Delay_MS(1000); 79 // GPIO_ResetBits(GPIOA, GPIO_Pin_3); 80 // Delay_MS(1000); 81 // } 82 83 } 84 85 /******************************************************************************* 86 * Function Name : Delay_Ms 87 * Description : delay 1 ms. 88 * Input : dly (ms) 89 * Output : None 90 * Return : None 91 *******************************************************************************/ 92 void Delay_MS(u16 dly) 93 { 94 u16 i,j; 95 for(i=0;i<dly;i++) 96 for(j=1000;j>0;j--); 97 } 98 99 /******************************************************************************* 100 * Function Name : RCC_Configuration 101 * Description : Configures the different system clocks. 102 * Input : None 103 * Output : None 104 * Return : None 105 *******************************************************************************/ 106 void RCC_Configuration(void) 107 { 108 //----------使用外部RC晶振----------- 109 RCC_DeInit(); //初始化为缺省值 110 RCC_HSEConfig(RCC_HSE_ON); //使能外部的高速时钟 111 while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET); //等待外部高速时钟使能就绪 112 113 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Enable Prefetch Buffer 114 FLASH_SetLatency(FLASH_Latency_2); //Flash 2 wait state 115 116 RCC_HCLKConfig(RCC_SYSCLK_Div1); //HCLK = SYSCLK 117 RCC_PCLK2Config(RCC_HCLK_Div1); //PCLK2 = HCLK 118 RCC_PCLK1Config(RCC_HCLK_Div2); //PCLK1 = HCLK/2 119 RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //PLLCLK = 8MHZ * 9 =72MHZ 120 RCC_PLLCmd(ENABLE); //Enable PLLCLK 121 122 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //Wait till PLLCLK is ready 123 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //Select PLL as system clock 124 while(RCC_GetSYSCLKSource()!=0x08); //Wait till PLL is used as system clock source 125 126 //---------打开相应外设时钟-------------------- 127 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能APB2外设的GPIOA的时钟 128 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); 129 } 130 131 /******************************************************************************* 132 * Function Name : GPIO_Configuration 133 * Description : 初始化GPIO外设 134 * Input : None 135 * Output : None 136 * Return : None 137 *******************************************************************************/ 138 void GPIO_Configuration(void) 139 { 140 //CLK:PB5 CLR:PE11 DATA:PE10 141 142 //smgA1----PC8 143 //RCK----PA1 144 //SCK0---SPISCK----PA5 145 //MISO0-----PA6 146 //MOSI0-----PA7 147 //595_nCS----PA0 148 149 GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量 150 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_5|GPIO_Pin_7; //选择PB.5 151 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //管脚频率为50MHZ 152 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //输出模式为推挽输出 153 GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化GPIOB寄存器 154 155 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 ; //选择PE.10 PE.11 156 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //管脚频率为50MHZ 157 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //输出模式为推挽输出 158 GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化GPIOE寄存器 159 160 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //选择PB.5 161 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //管脚频率为50MHZ 162 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //输出模式为推挽输出 163 GPIO_Init(GPIOC,&GPIO_InitStructure); //初始化GPIOB寄存器 164 165 //开启时钟 必须在RCC_Configuration中设置 166 }