资讯详情

STM32简易交通灯设计(定时可调)

//按键key1 设置红灯时间 按键key2 设置绿灯时间 按键key3设置黄灯时间 #include <stm32f10x_lib.h> #include "sys.h" #include "delay.h" #include "usart.h" #include "stdlib.h" static int G=0,R=0,Y=0; //设置绿,红,黄灯时间变量 #include "lcd.h" #include "key.h" #include "time.h" //----------- 按键函数---------- void scan_key1() { static u8 i,j; if(key1==0) { if(i==0) { j++; if(j>3) { i=1;j=0; R++; if(R>20)R=0; printf("key1 is inputed \r\n"); } } } else { i=j=0; } } void scan_key2() { static u8 i,j; if(key2==0) { if(i==0) { j++; if(j>3) { i=1;j=0; G++; if(G>20)G=0; printf("key2 is inputed. \r\n"); } } } else { i=j=0; } } void scan_key3() { static u8 i,j; if(key3==1) { if(i==0) { j++; if(j>3) { i=1;j=0; Y++; if(Y>20)Y=0; printf("key3 is inputed. \r\n"); } } } else { i=j=0; } } //各指示灯显示秒数函数 void LED_RED(u8 k) { _ShowNum(120,55,k,2,16); } void LED_YELLOW(u8 k) { LCD_ShowNum(120,145,k,2,16); } void LED_GREEN(u8 k) { LCD_ShowNum(120,235,k,2,16); } //-----定时设置函数------- void LED_SET_GREEN(u8 k) { LCD_ShowNum(160,235,k,2,16); } void LED_SET_YELLOW(u8 k) { LCD_ShowNum(160,145,k,2,16); } void LED_SET_RED(u8 k) { LCD_ShowNum(160,55,k,2,16); } //-----定时器中断函数---扫描按键和显示设定值用---- void M3_ QHandler(void) { if(TIM3->SR&0x0001) { scan_key1(); scan_key2(); scan_key3(); LED_SET_RED(R); LED_SET_GREEN(G); LED_SET_YELLOW(Y); } TIM3->SR=~(1<<0); } //------主函数----------- int main(void) { u16 code; //TFT驱动芯片代号 int i; Stm32_Clock_Init(9); delay_init(72); uart_init(72,9600); printf("uart is ok. \r\n"); Timer_init(300,7199); //定时器初始化 设定溢出时间是 30ms printf("time_init is ok. \r\n"); LCD_Init(); //TFT-LCD初始化 printf("lcd_init is ok.\r\n"); key_init(); //按键I/O口设置初始化 printf("key_init is ok.\r\n"); JTAG_Set(JTAG_SWD_DISABLE); //关闭JTAG code=LCD_ReadReg(0x0000); delay_ms(500); printf("deiver code is %ld",code); //读取驱动芯片型号是发送到串口 LCD_Fill(30,200,100,270,BLACK); LCD_Fill(30,110,100,180,BLACK); LCD_Fill(30,20,100,90,BLACK); LCD_ShowString(110,15,"Show"); LCD_ShowString(110,30,"Time"); LCD_ShowString(160,15,"Set "); LCD_ShowString(160,30,"Time"); LED_GREEN(0); LED_YELLOW(0); LED_RED(0); while(1) { for(i=G;i>=0;i--) //绿灯控制 { LED_GREEN(i); LCD_Fill(30,200,100,270,GREEN); delay_ms(1000); LCD_Fill(30,200,100,270,BLACK); delay_ms(1000); } for(i=Y;i>=0;i--) //黄灯控制 { LED_YELLOW(i); LCD_Fill(30,110,100,180,YELLOW); delay_ms(1000); LCD_Fill(30,110,100,180,BLACK); delay_ms(1000); } for(i=R;i>=0;i--) //红灯控制 { LED_RED(i); LCD_Fill(30,20,100,90,RED); delay_ms(1000); LCD_Fill(30,20,100,90,BLACK); delay_ms(1000); } } } //-------各类库函数省略--------- -电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台