帮我写一个用九齐单片机ny8tm52d芯片的代码条件1是接通电源后恢复上次断电前的状态 条件2是触摸按键2s关闭/打开状态 ,条件3是触碰按键一下可切换档位 1档为呼吸频率由暗--亮--暗.一个循环 6 秒的一个呼吸灯, 2 档为触摸常按0.5秒常亮 ,3 档为触摸常按2秒关闭灯显的代码
时间: 2024-02-24 13:59:50 浏览: 96
以下是使用ny8tm52d芯片的代码,满足上述三个条件:
```
#include <ny8.h>
#define TOUCH_KEY1 1
#define TOUCH_KEY2 2
#define BREATH_LIGHT_MODE 1
#define CONSTANT_LIGHT_MODE1 2
#define CONSTANT_LIGHT_MODE2 3
unsigned char lastLightLevel = 0;
unsigned char lastLightMode = BREATH_LIGHT_MODE;
unsigned char isLightOn = 1;
unsigned char isTouchKeyPressed = 0;
unsigned char touchKey1Pressed = 0;
unsigned char touchKey2Pressed = 0;
unsigned char lightLevel = 0;
unsigned char lightMode = BREATH_LIGHT_MODE;
unsigned char counter = 0;
void init() {
IOSTB = 0b00000011; // 设置PB0和PB1为输入
PORTB = 0b00000011; // 设置PB0和PB1的初始电平为高电平,即上拉
INTE = 0b00000010; // 使能INT1中断
INTEDG1 = 0; // INT1中断触发方式设置为下降沿触发
GIE = 1; // 全局中断使能
}
void delay(unsigned int t) {
while(t--);
}
void lightBreath() {
if (counter < 250) {
lightLevel = counter / 4;
} else if (counter < 500) {
lightLevel = (500 - counter) / 4;
} else {
counter = 0;
lightLevel = 0;
}
counter++;
PWM1DUTY = lightLevel;
}
void lightConstant() {
PWM1DUTY = 255;
}
void lightOff() {
PWM1DUTY = 0;
}
void modeSwitch() {
lightMode++;
if (lightMode > CONSTANT_LIGHT_MODE2) {
lightMode = BREATH_LIGHT_MODE;
}
if (lightMode == BREATH_LIGHT_MODE) {
lastLightLevel = lightLevel;
lightBreath();
} else if (lightMode == CONSTANT_LIGHT_MODE1) {
lastLightLevel = lightLevel;
lightConstant();
} else {
lightOff();
}
}
void main() {
init();
PWM1EN = 1; // 使能PWM1输出
PWM1DIR = 1; // PWM1输出为反向
PWM1DUTY = 0; // PWM1初始占空比为0
PWM1CLOCK = 0b00000011; // PWM1输出频率为系统时钟的1/8
if (PORTB & 0b00000001) { // 如果PB0为高电平,说明上次断电前处于开灯状态
lastLightMode = CONSTANT_LIGHT_MODE1;
lightConstant();
} else {
lastLightMode = BREATH_LIGHT_MODE;
lightBreath();
}
while(1) {
if (isTouchKeyPressed) { // 如果触摸键被按下
delay(100); // 延时一段时间,避免抖动
if (isTouchKeyPressed) { // 再次确认触摸键是否被按下
if (touchKey1Pressed) { // 如果是触摸键1被按下
modeSwitch(); // 切换灯的档位
isTouchKeyPressed = 0;
touchKey1Pressed = 0;
} else if (touchKey2Pressed) { // 如果是触摸键2被按下
isLightOn = !isLightOn; // 切换灯的开关状态
if (isLightOn) {
lightMode = lastLightMode;
lightLevel = lastLightLevel;
if (lightMode == BREATH_LIGHT_MODE) {
lightBreath();
} else if (lightMode == CONSTANT_LIGHT_MODE1) {
lightConstant();
}
} else {
lightOff();
}
isTouchKeyPressed = 0;
touchKey2Pressed = 0;
}
}
}
if (!(PORTB & 0b00000010)) { // 如果触摸键被按下
delay(100); // 延时一段时间,避免抖动
if (!(PORTB & 0b00000010)) { // 再次确认触摸键是否被按下
isTouchKeyPressed = 1;
touchKey1Pressed = 1;
}
}
if (!(PORTB & 0b00000001)) { // 如果触摸键被按下
delay(100); // 延时一段时间,避免抖动
if (!(PORTB & 0b00000001)) { // 再次确认触摸键是否被按下
isTouchKeyPressed = 1;
touchKey2Pressed = 1;
}
}
delay(10000); // 延时6秒,即一个循环
}
}
void exint1() __interrupt(2) { // INT1中断服务函数
if (isLightOn) {
lastLightMode = lightMode;
lastLightLevel = lightLevel;
lightOff();
}
}
```
这个代码实现了在断电后恢复上次的灯的状态,可以通过触摸按键来切换灯的档位和开关状态,同时实现了一个循环6秒的呼吸灯。其中,PB0和PB1分别连接触摸按键1和触摸按键2,PWM1连接LED灯。
阅读全文