求个单片机编程问题,可简化为:用3号键控制1、2灯 按下3号 1、2两灯谁亮灭谁 抬开恢复原先状态 这个怎么编
谁亮灭谁?
这是个歧义句,可以理解为:
1、把亮度较高的灯熄灭。
2、把已被点亮的灯熄灭。
如是后者,3号键就是个灯的电源总开关而已。
给你个参考
假设你的按键子函数为 bit key(uchar key_num);去抖神马的都写好了,key_num是按键号,你不是3号键么,按下的话就返回1,没按返回0。LED1为你控制灯1的单片机口,LED2为你控制灯2的单片机口,我不知道你具体电路怎么样的,这里假设LED1= 1,灯1亮,LED2 = 1,灯2量
不管你前面函数怎么写的,在主函数循环里面加入以下语句
bit LED1_buf,LED2_buf,LED_change_sign;
if((key(3) == 0) && (LED_change_sign == 0)) //在LED1,LED2状态没变的时候存入缓存,LED_change_sign为LED状态变化标志位。
{
LED1_buf = LED1;
LED2_buf = LED2;
}
if(key(3) == 1)
{
if(LED1 == 1)
{
LED1 = 0;
LED_change_sign = 1;
}
if(LED2 == 1)
{
LED2 = 0;
LED_change_sign = 1;
}
}
else
{
LED1 = LED1_buf;
LED2 = LED2_buf;
LED_change_sign = 0;
}
[ 本帖最后由 yipengjiusui 于 2012-7-24 17:21 编辑 ]
定义个变量记录灯的状态。根据记录灯的状态进行按键处理
按下3号 1、2两灯谁亮灭谁
太复杂了,简单点吗。按下3号就是 1、2两灯全灭
回复 沙发 仙猫 的帖子
三号按键的作用是 按下时把已经点亮的灯熄灭 抬手时恢复按前状态
回复 板凳 yipengjiusui 的帖子
这是我编的程序:::
#include
#define uchar unsigned char
#define uint unsigned int
sbit key(1)=P3^0;
sbit key(2)=P3^1;
sbit key(3)=P3^2;
sbit key(4)=P3^3;
sbit key(5)=P3^4;
sbit key(6)=P3^5;
sbit LED1=P1^2;
sbit LED2=P1^3;
sbit LED3=P1^4;
sbit LED4=P1^5;
sbit LED5=P1^6;
sbit LED6=P1^7;
void delayms(uint);
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void main(void)
{
while(1)
{
if(key(1)==1)
{
delayms(10);
if(key(1)==1)
LED1=0; LED3=0; LED2=1;LED4=1;
delayms(250);
}
if(key(2)==1)
{
delayms(10);
if(key(2)==1)
LED=0;LED4=0;LED1=1;LED3=1;
delayms(250);
}
bit LED1_buf,LED2_buf,LED_change_sign;
if((key(3) == 0) && (LED_change_sign == 0)) //在LED1,LED2状态没变的时候存入缓存,LED_change_sign为LED状态变化标志位。
{
LED1_buf = LED1;
LED2_buf = LED2;
}
if(key(3)==1)
{
delayms(10);
if(key(3) == 1)
{
if(LED1 == 0)
{
LED1 = 1;
LED_change_sign = 1;
}
if(LED2 == 0)
{
LED2 = 1;
LED_change_sign = 1;
}
}
else
{
LED1 = LED1_buf;
LED2 = LED2_buf;
LED_change_sign = 0;
}
bit LED3_buf,LED4_buf,LED_change_sign;
if((key(4) == 0) && (LED_change_sign == 0)) //在LED1,LED2状态没变的时候存入缓存,LED_change_sign为LED状态变化标志位。
{
LED1_buf = LED1;
LED2_buf = LED2;
}
if(key(4)==1)
{
delayms(10);
if(key(4) == 1)
{
if(LED3 == 0)
{
LED3 = 1;
LED_change_sign = 1;
}
if(LED4 == 0)
{
LED4 = 1;
LED_change_sign = 1;
}
}
else
{
LED3 = LED3_buf;
LED4 = LED4_buf;
LED_change_sign = 0;
}
if(key(5)==1)
{
delayms(10);
if(key(5)==1)
LED5=~LED5;
while(key(5)==1);
delayms(250);
}
if(key(6)==1)
{
delayms(10);
if(key(6)==1)
LED1=1;LED2=1;LED3=1;LED4=1;
while(key(6)==1);
delayms(250);
}
}
}
}
}
但下面显示:
Build target 'Target 1'
assembling STARTUP.A51...
compiling 12345.c...
12345.C(5): error C141: syntax error near '(', expected '='
12345.C(6): error C141: syntax error near '(', expected '='
12345.C(7): error C141: syntax error near '(', expected '='
12345.C(8): error C141: syntax error near '(', expected '='
12345.C(9): error C141: syntax error near '(', expected '='
12345.C(10): error C141: syntax error near '(', expected '='
Target not created
跪求解答
回复 9楼 kk9101042 的帖子
sbit key(1)=P3^0;
sbit key(2)=P3^1;
sbit key(3)=P3^2;
sbit key(4)=P3^3;
sbit key(5)=P3^4;
sbit key(6)=P3^5;
把他们的括号给我去掉。。。。。。
后面的一样子改掉!
回复 10楼 yipengjiusui 的帖子
这个可以定义成数组吗?