这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 高校专区 » 漓东e学堂 » 【系统滴答&18B20】16号同学的作业本

共94条 4/10 |‹ 2 3 4 5 6 7 ›| 跳转至
菜鸟
2014-10-27 08:22:55     打赏
31楼

LED&RGB (用位操作实现

 
视频地址:http://player.youku.com/player.php/sid/XODEyMjM1NTky/v.swf

 

#include "stm32f10x.h"
#include "stm32_eval.h"
GPIO_InitTypeDef GPIO_InitStructure;

void RCC_Configuration(void)
{
  RCC_DeInit();
    
  RCC_HSICmd(ENABLE);
  while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);
  
  RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
  
  RCC_HSEConfig(RCC_HSE_OFF);
  RCC_LSEConfig(RCC_LSE_OFF);
  RCC_PLLConfig(RCC_PLLSource_HSI_Div2,RCC_PLLMul_9); //  72HMz
  RCC_PLLCmd(ENABLE);
  while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
  RCC_ADCCLKConfig(RCC_PCLK2_Div4);
  RCC_PCLK2Config(RCC_HCLK_Div1);
  RCC_PCLK1Config(RCC_HCLK_Div2);
  RCC_HCLKConfig(RCC_SYSCLK_Div1);
  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
  while(RCC_GetSYSCLKSource() != 0x08);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE);
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//disable JTAG
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
	GPIO_ResetBits(GPIOD,GPIO_Pin_2);//1?·??ù?÷
}
void GPIO_INIT()
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOA, ENABLE);//òa????PC,PA
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//òaê1ó?PC0µ?PC7
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//í?íìê?3?
  GPIO_Init(GPIOC, &GPIO_InitStructure);//3?ê??¯PC
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;//òaê1ó?PA1,PA2,PA3
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//í?íìê?3?
	GPIO_Init(GPIOA, &GPIO_InitStructure);//3?ê??¯PA
}

void func(void)
{
	 int i,j;
        while(1)
        {
					GPIO_SetBits(GPIOC,0x000000ff);//LED全部熄灭
					GPIO_SetBits(GPIOA,0x0000000e);//RGB全部熄灭
					i=0x00000010;//给i赋一个右移前的值
          for(j=1;j<=4;j++)//LED D4-D1通过i右移4次依次点亮
          {
						i>>=1;右移一位
						GPIO_ResetBits(GPIOC,i);//PC3-PC0 D4-D1			
            delay_ms(200);
						GPIO_SetBits(GPIOC,i);//依次熄灭
          }
					i=0x00000100;//给i赋一个右移前的值
					for(j=1;j<=4;j++)//LED D8-D5通过i右移4次依次点亮
					{
						i>>=1;//右移一位
						GPIO_ResetBits(GPIOC,i); 	//PC7-PC4 D8-D5
						delay_ms(200);
						GPIO_SetBits(GPIOC,i);//依次熄灭
          }
					i=0x00000001;
					for(j=1;j<=3;j++)//RGB三基色通过左移3次实现依次点亮,下面的混合色的颜色顺序我不写了。。
					{
						i<<=1;//左移一位
						GPIO_ResetBits(GPIOA,i); 	//
						delay_ms(200);
						GPIO_SetBits(GPIOA,i);
						
						GPIO_ResetBits(GPIOA,0x00000006); 	//
						delay_ms(200);
						GPIO_SetBits(GPIOA,0x00000006);
						
						GPIO_ResetBits(GPIOA,0x0000000a); 	//
						delay_ms(200);
						GPIO_SetBits(GPIOA,0x0000000a);
						
						GPIO_ResetBits(GPIOA,0x0000000c); 	//
						delay_ms(200);
						GPIO_SetBits(GPIOA,0x0000000c);
          } 
        }
}
int main(void)
{ 
	RCC_Configuration();
	GPIO_INIT();
	func();
}

 

 

 

顺便说说这次的作业。。。我想不用switch的写法来做按键计数和动态扫描显示。

用if else,for写好了(35#),100多行,比较简短。


高工
2014-10-27 12:38:57     打赏
32楼

位操作不错

不用switch都行

c语言只要会if else和for

基本上所有结构的程序都能写出来了


菜鸟
2014-10-27 12:52:52     打赏
33楼
我已经意识到递归要慎用了。。。昨天搞的那个递归让内存溢出了

高工
2014-10-27 13:00:39     打赏
34楼

童鞋,不要整这么复杂

复杂的在后头


菜鸟
2014-10-27 15:55:46     打赏
35楼

作业五:s1按键计数,s4切换扫描速度

 

视频

 
视频地址:http://player.youku.com/player.php/sid/XODEyNjAzOTU2/v.swf

 

#include "stm32f10x.h"
#include "stm32_eval.h"
#include "stdbool.h"
GPIO_InitTypeDef GPIO_InitStructure;

void RCC_Configuration(void)
{
  RCC_DeInit();
  RCC_HSICmd(ENABLE);
  while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);
  RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
  RCC_HSEConfig(RCC_HSE_OFF);
  RCC_LSEConfig(RCC_LSE_OFF);
  RCC_PLLConfig(RCC_PLLSource_HSI_Div2,RCC_PLLMul_9); //  72HMz
  RCC_PLLCmd(ENABLE);
  while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
  RCC_ADCCLKConfig(RCC_PCLK2_Div4);
  RCC_PCLK2Config(RCC_HCLK_Div1);
  RCC_PCLK1Config(RCC_HCLK_Div2);
  RCC_HCLKConfig(RCC_SYSCLK_Div1);
  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
  while(RCC_GetSYSCLKSource() != 0x08);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE);
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//disable JTAG
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
	GPIO_ResetBits(GPIOD,GPIO_Pin_2);//关蜂鸣器
}

void GPIO_INIT()   
{   
   //GPIOB(数码管初始化 
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);   
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;   
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
  GPIO_Init(GPIOB, &GPIO_InitStructure);   
       
 //按键初始化
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);   
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;   
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   
  GPIO_Init(GPIOC, &GPIO_InitStructure);   
}   

void delay_us(u32 n)
{
	u8 j;
	while(n--)
	for(j=0;j<10;j++);
}

void  delay_ms(u32 n)
{
	while(n--)
	delay_us(1000);
}

void function(void)
{
	int display[10],i=0;//数组保存0-9的数码管显示组合
	bool flag=false,shift=true;//bool 变量  作为标识位 flag--S1   shift--S4
	display[0]=GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14;
	display[1]=GPIO_Pin_9|GPIO_Pin_12;
	display[2]=GPIO_Pin_5|GPIO_Pin_7|GPIO_Pin_9|GPIO_Pin_13|GPIO_Pin_14;
	display[3]=GPIO_Pin_5|GPIO_Pin_7|GPIO_Pin_9|GPIO_Pin_12|GPIO_Pin_14;
	display[4]=GPIO_Pin_5|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_12;
	display[5]=GPIO_Pin_5|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_12|GPIO_Pin_14;
	display[6]=GPIO_Pin_5|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14;
	display[7]=GPIO_Pin_7|GPIO_Pin_9|GPIO_Pin_12;
	display[8]=GPIO_Pin_5|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14;
	display[9]=GPIO_Pin_5|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_12|GPIO_Pin_14;
	GPIO_SetBits(GPIOB,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14);

	while(1)
	{
		if(!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_8))
		{
			delay_ms(50);
			if(!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_8))
			{
				flag=true;//s1 按下 标识位翻转
				for(;flag==true,i<=30;)//动态扫描显示
				{
					if(!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_8))
					{
						delay_ms(50);		
						if(!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_8)){i++;}
					}
					if(i>30){i=0;}
					if(!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_11))
					{
						delay_ms(50);		
						if(!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_11)){shift=!shift;}//S4的标识位状态翻转
					}
					GPIO_ResetBits(GPIOB,GPIO_Pin_15);//PB15 off
					GPIO_SetBits(GPIOB,GPIO_Pin_1);//PB1  on
					GPIO_ResetBits(GPIOB,display[i%10]);//在个位显display 0-9 on units digit
					if(!shift) {delay_ms(50);}
					else     { delay_ms(5);}
					GPIO_SetBits(GPIOB,display[i%10]);	//off
					GPIO_ResetBits(GPIOB,GPIO_Pin_1);//PB1 off
					GPIO_SetBits(GPIOB,GPIO_Pin_15);//PB15 on
					GPIO_ResetBits(GPIOB,display[i/10]);//在十位显display 0-9 on tens digit
					if(!shift) {delay_ms(50);}
					else     { delay_ms(5);}
					GPIO_SetBits(GPIOB,display[i/10]);	//off
				}
			}
		}
	}
}
int main(void)
{ 
	RCC_Configuration();
	GPIO_INIT();
	function();
}

菜鸟
2014-10-27 19:53:45     打赏
36楼
西瓜霸再见~好多我看不懂的字母~

院士
2014-10-27 20:47:14     打赏
37楼
是否使用swith语句主要看软件设计的架构,与软件代码编写是否容易可读。

菜鸟
2014-10-27 22:04:20     打赏
38楼
我还不知道那么多呢,我只是从我的思考角度去写,个人感觉switch用在此处有点笨笨的,所以就没用

高工
2014-10-28 00:38:27     打赏
39楼

吼吼,循环里面一大堆if else,头晕了


菜鸟
2014-10-28 08:00:35     打赏
40楼
不是吧。。。

共94条 4/10 |‹ 2 3 4 5 6 7 ›| 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]