stm32的每一个引脚都有始终控制,这样在不用的时候可以关闭时钟来达到节能的目的,所以,如果要使用外设,必须先打开时钟,否则没有办法进行 *** 作的。。。
具体函数是 RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph,FunctionalState NewState)
RCC_APB2Periph是你要打开或者关闭的外设,NewState是enable或者disable为打开或者关闭…………
这个是与编程思想有关,你按键用的消抖方式是延时消抖,不是用状态机的编程方式,所以会如此
参考一下电路及代码
#include<reg51h>#include<INTRINSH>
#define Key_State_0 0
#define Key_State_1 1
#define Key_State_2 2
#define unlock 0
#define lock 1
#define Init_DATA 999
unsigned char key1_state;
bit key1_debounce_flag;
bit key1_debounce;
sbit Key_1 = P1^0;
sbit seg1 = P1^7;
sbit seg2 = P1^6;
sbit seg3 = P1^5;
sbit seg4 = P1^4;
unsigned char time_1ms_flag,display_flag;
unsigned int add_data;
unsigned char key1_debounce_C;
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void MCU_init(void)
{
TMOD = 0x01;
TH0 = 0xFC;
TL0 = 0x18;
EA = 1;
ET0 = 1;
TR0 = 1;
add_data = Init_DATA;
}
void MCU_clock(void)
{
if(time_1ms_flag==1)
{
time_1ms_flag = 0;
display_flag++;
if(display_flag == 4)
{
display_flag = 0;
}
if(key1_debounce_flag==unlock)
{
key1_debounce_C++;
if(key1_debounce_C==20)
{
key1_debounce_C = 0;
key1_debounce_flag = lock;
key1_debounce = 1;
}
}
}
}
void display(void)
{
switch(display_flag)
{
case 0:
seg4 = 0;
P2=table[add_data/1000];
seg1 = 1;
break;
case 1:
seg1 = 0;
P2=table[add_data%1000/100];
seg2 = 1;
break;
case 2:
seg2 = 0;
P2=table[add_data%100/10];
seg3 = 1;
break;
case 3:
seg3 = 0;
P2=table[add_data%10];
seg4 = 1;
break;
}
}
void Key_1_Scan (void)
{
bit key_press;
key_press = Key_1;
switch(key1_state)
{
case Key_State_0:
if(!key_press)
{
key1_state = Key_State_1;
key1_debounce_flag = unlock;
}
break;
case Key_State_1:
if(key1_debounce==1)
{
key1_debounce = 0;
if(!key_press)
{
key1_state = Key_State_2;
}
else
{
key1_state = Key_State_0;
}
}
break;
case Key_State_2:
if(key_press)
{
key1_state = Key_State_0;
add_data++;
if(add_data==10000)
{
add_data = 0;
}
}
break;
}
}
void main (void)
{
MCU_init();
while (1)
{
MCU_clock();
Key_1_Scan();
display();
}
}
void Timer0Interrupt(void) interrupt 1
{
TH0 = 0xFC;
TL0 = 0x18;
time_1ms_flag = 1;
}
#include<reg51h>
unsigned char seven_seg[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};
unsigned char flash,mode=0;
char min=50,hour=12,hour_rom,min_rom,sec=25;
unsigned char j,k;
unsigned int i;
unsigned char key_set_s,key_up_s,key_down_s,key_reset_s;
sbit P0_7=P0^7;
sbit key_set=P3^4;
sbit key_up=P3^5;
sbit key_down=P3^6;
sbit key_reset=P3^7;
sbit buzzer=P1^0;
bit dop,bb; //声明
void delay(unsigned int x) //延时
{
while(x--);
}
void timer0_isr(void) interrupt 1 //中断服务函数
{
TH0=0xf8; //为65535-2000=63535转化为16进制取高八位
TL0=0x2f; //取低八位
i++;
bb=!bb;
if(i>=250) //半秒,五百一秒
{
i=0;
k++;
flash=~flash;
dop=!dop;
}
if(k>=2) //大于二归零
{
k=0;
sec++;
}
if(sec>=60) //秒
{
sec=0;
min++;
}
if(min>=60) //分
{
min=0;
hour++;
}
if(hour>=24) //小时
hour=0;
P0=0xff; //P0初始化为全1 11111111
if(mode==0) //正常显示
{
switch(j) //控制语句
{
case 0:P0=seven_seg[sec%10];P2=0xfe;break; //秒个位
case 1:P0=seven_seg[sec/10];P2=0xfd;break; //秒十位
case 2:P0=seven_seg[min%10];P0_7=dop;P2=0xfb;break;
case 3:P0=seven_seg[min/10];P2=0xf7;break;
case 4:P0=seven_seg[hour%10];P0_7=dop;P2=0xef;break; //dop为小数点
case 5:P0=seven_seg[hour/10];P2=0xdf;break;
}
}
////////////////////
if(mode==1) //模式一 C1状态
{
switch(j)
{
case 0:P0=seven_seg[min%10];P2=0xfe;break;
case 1:P0=seven_seg[min/10];P2=0xfd;break;
case 2:P0=seven_seg[hour%10]| flash;P2=0xfb;break; //flash为闪烁
case 3:P0=seven_seg[hour/10]| flash;P2=0xf7;break;
case 4:P0=seven_seg[1];P2=0xef;break; //1为C1状态
case 5:P0=0xc6;P2=0xdf;break; //0xc6为显示C
}
}
////////////////////
if(mode==2) //模式二 C1状态
{
switch(j)
{
case 0:P0=seven_seg[min%10]| flash;P2=0xfe;break;
case 1:P0=seven_seg[min/10]| flash;P2=0xfd;break;
case 2:P0=seven_seg[hour%10];P2=0xfb;break;
case 3:P0=seven_seg[hour/10];P2=0xf7;break;
case 4:P0=seven_seg[1];P2=0xef;break;
case 5:P0=0xc6;P2=0xdf;break;
}
}
////////////////////
if(mode==3) //模式三 C2状态
{
switch(j)
{
case 0:P0=seven_seg[min_rom%10];P2=0xfe;break;
case 1:P0=seven_seg[min_rom/10];P2=0xfd;break;
case 2:P0=seven_seg[hour_rom%10]| flash;P2=0xfb;break;
case 3:P0=seven_seg[hour_rom/10]| flash;P2=0xf7;break;
case 4:P0=seven_seg[2];P2=0xef;break;
case 5:P0=0xc6;P2=0xdf;break;
}
}
////////////////////
if(mode==4) //模式四 C2状态
{
switch(j)
{
case 0:P0=seven_seg[min_rom%10]| flash;P2=0xfe;break;
case 1:P0=seven_seg[min_rom/10]| flash;P2=0xfd;break;
case 2:P0=seven_seg[hour_rom%10];P2=0xfb;break;
case 3:P0=seven_seg[hour_rom/10];P2=0xf7;break;
case 4:P0=seven_seg[2];P2=0xef;break;
case 5:P0=0xc6;P2=0xdf;break;
}
}
j++;
if(j>=6)
j=0;
}
void key(void) //调用开关函数
{
////////////////
if(key_set==0) //设置
{
delay(300);
if(key_set==0)
key_set_s=1;
}
if(key_set==1&&key_set_s==1)
{
mode++;
if(mode>=5)
mode=1;
key_set_s=0;
}
////// ///
if(key_up==0) //上调
{
delay(300);
if(key_up==0)
key_up_s=1;
}
if(key_up==1&&key_up_s==1)
{
if(mode==1)hour++;
if(mode==2)min++;
if(mode==3)hour_rom++;if(hour_rom>=24)hour_rom=0;
if(mode==4)min_rom++;if(min_rom>=60)min_rom=0;
key_up_s=0;
}
/////////////////
if(key_down==0) //下调
{
delay(300);
if(key_down==0)
key_down_s=1;
}
if(key_down==1&&key_down_s==1)
{
if(mode==1)hour--;if(hour<0)hour=23;
if(mode==2)min--; if(min<0)min=59;
if(mode==3)hour_rom--;if(hour_rom<0)hour_rom=23;
if(mode==4)min_rom--;if(min_rom<0)min_rom=59;
key_down_s=0;
}
/////////////////
if(key_reset==0) //复位
{
delay(300);
if(key_reset==0)
key_reset_s=1;
}
if(key_reset==1&&key_reset_s==1)
{
key_reset_s=0;
mode=0;
}
}
void timer0_init(void) //timero初始化函数
{
TMOD=0x01; //方式1
TH0=0xf8;
TL0=0x2f;
EA=1; //中断开关
ET0=1; //中断小开关
TR0=1; //开始计数
}
void main(void) //主函数
{
timer0_init();
while(1)
key();
{
if(hour==hour_rom&&min==min_rom)
buzzer=bb; //buzzer为蜂鸣器
}
}
你可以按照以下步骤编写STC8G1K08芯片的LED点亮和灭的时间控制程序:
设置芯片的时钟和计数器,以便实现时间控制。例如,可以使用定时器或延时函数来控制时间。
在主函数中编写程序,实现LED点亮和灭的时间控制。可以使用if语句或while语句来判断时间是否达到要求,然后控制LED灯的点亮和灭。
在main函数中添加延时函数,以实现上电后30秒后LED灯开始点亮的要求。
下面是一个简单的示例程序,仅供参考:
#include<reg52h>
sbit LED=P1^0;
void delay(unsigned int i)
{
while(i--);
}
void main()
{
unsigned int count=0; //计数器,用于实现30秒的延时
while(count<30000) //上电后30秒开始执行程序
{
delay(1000); //每次延时1秒
count+=1000;
}
LED=1; //点亮LED
delay(3000); //LED持续3秒
LED=0; //灭掉LED
while(1); //芯片不工作
}
在上述程序中,使用了一个计数器来实现上电后30秒的延时,然后LED点亮并持续3秒后灭掉,最后芯片不工作。需要注意的是,示例程序仅供参考,具体实现方式需要根据实际情况进行调整和优化。
手工打造的摇摆led时钟日期:2009-11-13 00:38:16点击:383这个小制作原材料易找,一两分钟就可以搞定,可以让身边的小朋友试试手脚具有过流保护的直流可调稳压电源 本电源的主要器件是通用稳压集成块lm723,内部 <a href=">
以上就是关于点亮LED灯的STM32程序中为什么要首先设置外设时钟使能函数#define RCC_GPIO_LED RCC_APB2Periph_GPIOD全部的内容,包括:点亮LED灯的STM32程序中为什么要首先设置外设时钟使能函数#define RCC_GPIO_LED RCC_APB2Periph_GPIOD、单片机时钟程序时钟设置问题、谁有proteus LED点阵时钟仿真,最好proteus图形,单片机是c51的哦,程序是c语言的哦急急急!!!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)