2019年11月5日 星期二

ex107


#include <reg51.h>
char code seg7_table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
char code left_move_table[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
char code righ_move_table[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
char increase_RtoL_table[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};
char increase2_LtoR_table[]={0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};
char k=0;//七段要停留在0
int num;
char bdata flag;
sbit blink_flag=flag^0;
sbit left_move_flag=flag^1;
sbit right_move_flag=flag^2;
sbit increase1_flag=flag^3;
sbit increase2_flag=flag^4;
sbit chang_word_flag=flag^5;
bit alternate_flag;
char scan;//預設是0
char str1[]={0,8,1,0,0,0,0,0,2};
//                      1 2   4           8,它是掃瞄1248
//                    個十 百         千
char str2[]={0,9,0,0,6,0,0,0,0};
sbit left_btn=P3^6;//left
sbit right_btn=P3^7;//right
void delay_1ms(int x)
{
int i,j;
for(i=0;i<x;i++)
  for(j=0;j<114;j++)
       ;
}
/*中斷副程式,不要寫delay,再去call, delay也不行,而且你一次跑完是不對的。
中斷進入一次往左跑一次,八個就中斷8次,做一次就離開,看你給他的table決定跑馬燈

*/
void int_t0(void) interrupt 1
{
TH0=(65536-5000)/256;//每5ms中斷一次
TL0=(65536-5000)%256;
num++;
if(blink_flag==1)//程式進去外面的flag成立才可以進去,判斷flag對才進去,不對就不可以進去
       {
if(num%100==0)
{
alternate_flag=~alternate_flag;//交替顯示
if(alternate_flag==1)
P1=0x00;
else
P1=0xFF;
}
}
else if(left_move_flag==1)
{
if(num%100==0)
{
P1=~left_move_table[scan];
                        scan++;
if(scan>7)
scan=0;
}
}
else if(right_move_flag==1)
{
if(num%100==0)
{
P1=~righ_move_table[scan];
scan++;
if(scan>7)
scan=0;
}

}
else if(increase1_flag==1)
{
if(num%40==0)
{
P1=~increase_RtoL_table[scan];
scan++;
if(scan>7)
scan=0;
}
}
else if(increase2_flag==1)
{
if(num%40==0)
{
P1=~increase2_LtoR_table[scan];
scan++;
if(scan>7)
scan=0;
}
  }
else if(chang_word_flag==1)//四位數中斷掃瞄
{
if(num%200==0)//5ms*200=1s進來切換一次2018 0609
alternate_flag=~alternate_flag;
P3=~scan;//0XFE 1111 1110 反相0000 0001//每隔5ms+5ms+5ms+5ms=20ms跑50次再切換另一組文字
if(alternate_flag==1)
P0=seg7_table[str2[scan]];
else
P0=seg7_table[str1[scan]];
scan<<=1;
if(scan==0x10) scan=0x01;
}
}

void init()
{
int i;
IE=0x82;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
for(i=0;i<2;i++)
{
P1=0x00;delay_1ms(200);
P1=0xFF;delay_1ms(200);           
}
for(i=0;i<2;i++)
{
P3=0X00;P0=0x00;delay_1ms(200);
P3=0XFF;P0=0xFF;delay_1ms(200);
}
for(i=0;i<2;i++)
{
P2=0X00;delay_1ms(200);
P2=0XFF;delay_1ms(200);
}
}
main()
{
  init();
  P2=seg7_table[k];
 while(1)
 {
   if (left_btn==0)
  {
delay_1ms(20); while(left_btn!=1);delay_1ms(20);
         k++;
 if (k>9) k=0;
   }
   if (right_btn==0)
   {
  delay_1ms(20); while(right_btn!=1);delay_1ms(20);
   k--;
if (k<0) k=9;
   }
   if(k==0 || k==7 || k==8 || k==9)
   {
  P2=seg7_table[k];
  flag=0;P0=0xFF;P1=0XFF; //P2=0xFF不能關掉,否則會0 7 8 9 暗暗的
    }
  if(k==1){flag=0;P3=0xff;blink_flag=1;P2= seg7_table[k];}
  //七段只要顯示一次不要在中斷每次都顯示
  if(k==2){flag=0;P3=0xff;left_move_flag=1; P2= seg7_table[k];}//右鍵--,四位數燈要OFF
  if(k==3){flag=0;P3=0xff;right_move_flag=1;P2= seg7_table[k];}
  if(k==4){ flag=0;P3=0xff;increase1_flag=1; P2= seg7_table[k];}
  if(k==5){ flag=0;P3=0xff;increase2_flag=1; P2= seg7_table[k];}
   if(k==6){ flag=0;chang_word_flag=1;P2= seg7_table[k];}
  }
}

沒有留言:

張貼留言

algorithm

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