通过编程环境KEIL实现
按键
控制LED状态翻转
要求:按键控制的LED为相同颜色指向或框选的LED
要求需要核心板上的LED灯与开发板上的LED是同步状态
LED1正极接PB0,负极接地(GND)
当pb0这个端口输出高电平led1点亮
怎么做到锁存:端口电平是固定的,while上面的语句就是读取端口状态,然后取反。比如端口原来是高电平,就切换到低电平。
左边全亮
0x0F
右边全亮
0xF0
全亮
0xFF
全灭
0x00
因为需要用到TM1604,所以
hardware->TM1640.c
c/c+±>.\Hardware\Tm1640
int main (void){//主程序
u8 c=0x01;
RCC_Configuration(); //系统时钟初始化
RTC_Config(); //RTC初始化
TM1640_Init(); //TM1640初始化
while(1){
if(RTC_Get()==0){ //读出RTC时间
TM1640_display(0,rday/10); //天
TM1640_display(1,rday%10+10);
TM1640_display(2,rhour/10); //时
TM1640_display(3,rhour%10+10);
TM1640_display(4,rmin/10); //分
TM1640_display(5,rmin%10+10);
TM1640_display(6,rsec/10); //秒
TM1640_display(7,rsec%10);
TM1640_led(c); //与TM1640连接的8个LED全亮
c<<=1; //数据左移 流水灯
if(c==0x00)c=0x01; //8个灯显示完后重新开始
delay_ms(125); //延时
}
}
}
main.c
int main (void){//主程序
//初始化程序
RCC_Configuration(); //时钟设置
LED_Init();//LED初始化
KEY_Init();//按键初始化
TM1640_Init(); //TM1640初始化
//主循环
//初始化起始状态防止乱码产生干扰程序
TM1640_led(0x00);
while(1){
//有锁存 第一次按亮 第二次按灭
//控制核心板上的LED1
if(!GPIO_ReadInputDataBit(KEYPORT,KEY1)){ //读按键接口的电平
delay_ms(20); //延时去抖动
if(!GPIO_ReadInputDataBit(KEYPORT,KEY1)){ //读按键接口的电平
GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1-GPIO_ReadOutputDataBit(LEDPORT,LED1))); //LED取反
//控制开发板上对应的四个小灯与LED1同步
if( GPIO_ReadOutputDataBit(LEDPORT,LED1)==1)
TM1640_led(0x0F);
else
TM1640_led(0x00);
while(!GPIO_ReadInputDataBit(KEYPORT,KEY1)); //等待按键松开 防止程序在按键没有松开的情况下反复运行
}
}
//控制核心板上的LED2
if(!GPIO_ReadInputDataBit(KEYPORT,KEY2)){ //读按键接口的电平
delay_ms(20); //延时去抖动
if(!GPIO_ReadInputDataBit(KEYPORT,KEY2)){ //读按键接口的电平
GPIO_WriteBit(LEDPORT,LED2,(BitAction)(1-GPIO_ReadOutputDataBit(LEDPORT,LED2))); //LED取反
//控制开发板上对应的四个小灯与LED2同步
if( GPIO_ReadOutputDataBit(LEDPORT,LED2)==1)
TM1640_led(0xF0);
else
TM1640_led(0x00);
while(!GPIO_ReadInputDataBit(KEYPORT,KEY2)); //等待按键松开 防止程序在按键没有松开的情况下反复运行
}
}
//以上是分成两个部分解决
// 以下解决整体问题
//两灯同时亮+八个灯同时亮
if( GPIO_ReadOutputDataBit(LEDPORT,LED1)==1&&GPIO_ReadOutputDataBit(LEDPORT,LED2)==1)
TM1640_led(0xFF);
//同时亮的时候LED闪烁,加延时就不会闪了
delay_ms(125); //延时
//分开控制
if( GPIO_ReadOutputDataBit(LEDPORT,LED1)==1)
TM1640_led(0x0F);
if( GPIO_ReadOutputDataBit(LEDPORT,LED2)==1)
TM1640_led(0xF0);
}
}