2019年10月24日 星期四

設計按鈕A_error

/*
1. 設計按鈕A
I. 第1次觸發,七段顯示器由0123456789H上數重複
II. 第2次處發,七段顯示器顯示1,LED做PWM工作週期為10%
III. 第3次觸發,七段顯示器顯示2,LED做PWM工作週期為20%
IV. 第11次觸發時,七段顯示器顯示H,LED進行PWM之工作週期為100%
V. 重複動作I至動作IV。
註:頻率為250hz
2. 設計按鈕B
I. 短按切換250Hz及1KHz頻率,
II. 長按(超過3秒)啟動呼吸燈,週期為4秒
i. 當頻率為250Hz,七段顯示器顯示
ii. 當頻率為1KHz,七段顯示器顯示
*/
#include <at89x52.h>
#define ON 0
#define OFF 1
sbit common=P3^4;
sbit LED=P2^0;
bit release_flag;
bit up_flag;
bit led_flag;
bit change_flag;
bit runpwm_flag;
char P2table[]={0xFE,0XFC,0XF8,0XF0,0XE0,0XC0,0X00,0xc0,0x89};
/*
1111 1110 0xFE a
1111 1100 0XFC ab
1111 1000 0XF8 abc
1111 0000 0XF0 abcd
1110 0000 0XE0 abcde
1100 0000 0XC0 abcdef
1000 0000 0x89 H
*/
char data_7seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x89,0xb6};
//                 0     1    2    3   4    5    6     7    8   9    H    三
int count;
int count1;
int duty_count;
int pwm_count;
int rpt_count;
char function;
char sw_dly=50;
unsigned int timer;
char duty;
void delay_1ms(int k)
{
int i,j;
for(i=0;i<k;i++)
  for(j=0;j<114;j++)
       ;
}
void run()
{
int i;
for(i=0;i<8;i++)
{
P2=P2table[i];
delay_1ms(500);
}
}
void up()
{
count++;
if(count>10)
count=0;
P2=~data_7seg[count];
delay_1ms(100);

}
char sw_scan()
{
char sw_value,temp;
sw_value=0;
temp=~P3&0x03;
if(temp) //不等於0就是有按鍵
{
if(release_flag || rpt_count>50)
{
release_flag=0;
sw_value=temp;
}
else
{
rpt_count++;
}
}
else
{
release_flag=1; //按鍵放開
rpt_count=0;
}
delay_1ms(sw_dly);
return sw_value;
}
main()
{
char temp;
TMOD=0X11;
IE=0X8a;
TH0=(65536-400)/256;
TL0=(65536-400)%256;
TH1=(65536-40000)/256;
TL1=(65536-40000)%256;
TR1=1;
IP=0X02;
common=0;
run();
  while(1)
{
if(up_flag)
up();
temp=sw_scan();
if(temp==1)
{
up_flag=0;
runpwm_flag=0;
TR0=1;
function++;
if(function>11)
{
function=1;
}
if(function==1)
{
up_flag=1;
LED=OFF;
TR0=0;
}
else if(function==2)
{
duty=1;
P2=~data_7seg[duty];
}
else if(function==3)
{
duty=2;
P2=~data_7seg[duty];
}
else if(function==4)
{
duty=3;
P2=~data_7seg[duty];
}
else if(function==5)
{
duty=4;
P2=~data_7seg[duty];
}
else if(function==6)
{
duty=5;
P2=~data_7seg[duty];
}
else if(function==7)
{
duty=6;
P2=~data_7seg[duty];
}
else if(function==8)
{
duty=7;
P2=~data_7seg[duty];
}
else if(function==9)
{
duty=8;
P2=~data_7seg[duty];
}
else if(function==10)
{
duty=9;
P2=~data_7seg[duty];
}
else if(function==11)
{
duty=10;
P2=~data_7seg[duty];
}
}
if(temp==2)
{
change_flag=~change_flag;
if(change_flag)
{
P2=~data_7seg[10];
sw_dly=1;
}
else
{
P2=~data_7seg[11];
sw_dly=30;
}
if(rpt_count>50)
{
runpwm_flag=1;
}
if(runpwm_flag)
TR0=1;
}
}
}
void T0_INT() interrupt 1
{
if(change_flag)
{
TH0=(65536-200)/256;
TL0=(65536-200)%256;
}
else
{
TH0=(65536-400)/256;
TL0=(65536-400)%256;
}
timer++;
if(led_flag)
{
duty_count++;
if(duty_count==duty)
{
if(duty<10)
{
led_flag=0;
LED=OFF;
}
}
}
if(timer%10==0)
{
led_flag=1;
duty_count=0;
LED=ON;
}
}
void T1_INT() interrupt 3
{
TH1=(65536-40000)/256;
TL1=(65536-40000)%256;
pwm_count++;
if(pwm_count%10==0 && runpwm_flag)
{
duty++;
if(duty>10)
duty=0;
}
}

沒有留言:

張貼留言

algorithm

 #include <iostream> #include <string.h> using namespace std; int main(int argc, char** argv)  { for(int j=2;j<=100;j++)//j...