2019年10月31日 星期四

107 year


#include <at89x52.h>
char seg7[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
char seg_data[]={0xa4,0xc0,0xf9,0x80};
char seg_data1[]={0xc0,0x82,0xc0,0x90};
char seg_data2[]={0x82,0xf8,0x80,0x90};
char left_move[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
char increase[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};
char increase2[]={0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};
unsigned char scanline=0x80;
sbit sw1=P3^7;//left
sbit sw2=P3^6;//right
int k,x=0;

void delay_1ms(int x)
{
        int i,j;
        for(i=0;i<x;i++)
          for(j=0;j<114;j++)
               ;
}
void debouncer()
{
        int i,j;
        for(i=0;i<20;i++)
          for(j=0;j<114;j++)
               ;
}
void init()
{
        int i;
        for(i=0;i<2;i++)
        {
           P0=0x00;P2=0x00;P1=0XFF;delay_1ms(200);P0=0xFF;P2=0x00;P1=0XFF;delay_1ms(200);              
        }
        for(i=0;i<2;i++)
        {
            P1=0XFF;P2=0xFF;P0=0x0F;delay_1ms(200);P1=0XFF;P2=0x00;P0=0x0F;delay_1ms(200);
        }
        P0=0XFF;
        for(i=0;i<2;i++)
        {
           P1=0x00;P0=0xff;P2=0x00;delay_1ms(200);P1=0xff;P0=0xff;P2=0x00;delay_1ms(200);
        }
        P1=seg7[k];
}
main()
{
         init();
        IE=0x82;
     TMOD=0x01;
     TH0=(65536-20000)/256;
         TL0=(65536-20000)%256;
         TR0=1;
     while(1)
         {
           if (k==1)
                {
                         P2=0x00;
                         P1=seg7[k];
             P0=0x00;delay_1ms(200);
                         P0=0xff;delay_1ms(200);
                   // LED  循環不斷閃爍
                 }
               if (k==2)
               {
         int i;
                 P2=0x00;
                 P1=seg7[k];
                 if(x==0)
                 {
                    for(i=0;i<=7;i++)
                    {
                           P0=~left_move[i];delay_1ms(200);
                    }
                     x=1;
                  }        
                          else if(x==1)
                         {
                                        P0=0xff;
                         }
                 }
         //LED  單顆左移,這種方法叫什麼控制
               if (k==3)
                {
       int i;
                         P2=0x00;
                         P1=seg7[k];
                         if(x==1)
                         {
                           for(i=7;i>=0;i--)
                           {
                                   P0=~left_move[i];delay_1ms(200);
                           }
                                 x=0;
                         }
                         if(x==0)
                         {
                                 P0=0xff;
                         }
                   //LED  單顆右移
                }

                 if(k==4)
                 {
       int i;
                         P2=0x00;
                         P1=seg7[k];
                         if(x==0)
                         {
                          for(i=0;i<=7;i++)
                          {
                                  P0=~increase[i];delay_1ms(200);
                          }
                         x=1;
                         }
       if(x==1)
                         {
                                 P0=0xff;
                         }                            
                   //  LED  左移漸亮(逐一多顆亮)
               }
                 if (k==5)
                {
                   //LED 右移漸亮(逐一多顆亮)
       int i;
                         P2=0x00;
                         P1=seg7[k];
                         if(x==1)
                         {
                          for(i=0;i<=7;i++)
                          {
                                 P0=~increase2[i];delay_1ms(200);
                          }
                                x=0;
                   }
       if(x==0)
       {
                                 P0=0xff;
       }      
                 }
               if (k==6)
                {
                         int i,j;
                         P1=seg7[k];
                         for(j=0;j<=100;j++)
                         {
                          scanline=0x80;
                          for(i=0;i<=3;i++)
                          {
                                 P2=0x00;//要先關掉四位數七段顯示器,否則無法正常顯示
                                 P0=~scanline;
                                 P2=~seg_data[i];delay_1ms(4);
                                 scanline=scanline>>=1 ;
                           }
                          }
                         for(j=0;j<=100;j++)
                         {
                          scanline=0x80;
                          for(i=0;i<=3;i++)
                          {
                                 P2=0x00;//要先關掉四位數七段顯示器,否則無法正常顯示
                                 P0=~scanline;
                                 P2=~seg_data1[i];delay_1ms(4);
                                 scanline=scanline>>=1 ;
                           }
                          }

                                 // 四位七段出現 2018  0609 交替顯示。      
             for(j=0;j<=100;j++)
                         {
                          scanline=0x80;
                          for(i=0;i<=3;i++)
                          {
                                 P2=0x00;//要先關掉四位數七段顯示器,否則無法正常顯示
                                 P0=~scanline;
                                 P2=~seg_data2[i];delay_1ms(4);
                                 scanline=scanline>>=1 ;
                           }
                          }
                        }      
               if (k==0)
               {
                        P1=seg7[k];
      P0=0xFF;P2=0x00;
                        //LED 四位、七段均需熄滅

               }
                if (k==7)
               {
                        P1=seg7[k];
            P0=0xFF;P2=0x00;
                        //LED 四位、七段均需熄滅

               }
                if (k==8)
               {
                        P1=seg7[k];
            P0=0xFF;P2=0x00;
                        //LED 四位、七段均需熄滅

               }
                if (k==9)
               {
                        P1=seg7[k];
      P0=0xFF;P2=0x00;
                        //LED 四位、七段均需熄滅

               }

 }
}
void my_time0(void) interrupt 1
{
        TH0=(65536-20000)/256;
        TL0=(65536-20000)%256;
        if (sw1==0)
        {
               debouncer();
                while(sw1!=1);
                debouncer();
                k=k+1;
                if (k>9) k=0;
        }
        if (sw2==0)
        {
               debouncer();
                while(sw2!=1);
                debouncer();
                k=k-1;
                if (k<0) k=9;
        }
}

2019年10月30日 星期三

107年 8051
































四位數七段顯示器

如果不想要自行接線路,那麼市面上有已經銜接好的二合一、四合一等各種位數的七段顯示器,以四合一的七段顯示器為例,由於每個七段顯示器會需要 8 個腳位控制其上的 LED,再加上各 4 個共陰或共陽腳位,因此基本上會有 12 個腳位,當然,如果還要附帶有「:」控制等腳位的話,就會有 12 個腳位以上。
我手邊這個四位數七段顯示器,就是基本的 12 腳位:
四位數七段顯示器
依上圖來看的話,下方有六個腳位,上方有六個腳位,最左下方的腳位編號是 1,依逆時針依序編號至 6,然後右上方是 7,依逆時針編號至左上方的 12:
四位數七段顯示器
當然,最重要的,是知道這些腳位,分別是控制哪個 LED,以及哪些腳位控制哪個七段顯示器,這在上圖是使用 0 到 3 以及 A 到 H(DP) 表示,0 表示最右邊的七段顯示器, 3 表示最左邊的七段顯示器,例如,當 3 為低電位而 0、1、2 為高電位時,那麼是控制最左邊的七段顯示器,至於 A 到 H(DP),如下圖表示:
四位數七段顯示器C1815 Transistor Details About Pinout, Equivalent, Uses, Features & More

考場已準備 89S52 I/O實驗板 所以不需要再接電路,有附完整電路圖。
Keil  C
安裝  v9.56  uVision5,燒錄器配合 Progisp V1.72 燒錄,有附燒錄設定及步驟。
I/O 連接如下:
八個LED  共陽  接    P0
單顆七段  共陽  接   P1
四位七段  共陰  .g~a   P2  掃描接 P0,4~P0.7  (LED共用)
兩個按鈕開關      P3.7    P3.6
動作要求 (變化時間不要求,以眼睛可識別即可)
 1.  開機及Reset LED 閃爍兩次、  四位七段閃爍兩次、  七段閃爍兩次、 七段停在
2.   左按鈕每按一次:七段數字遞加1,出現範圍  0~9 
3.  右按鈕每按一次:七段數字遞減1,出現範圍  9~0 
4.  七段顯示器出現1 LED  循環不斷閃爍。
5.  七段顯示器出現2 LED  單顆左移。
6.  七段顯示器出現3  LED  單顆右移。
7.  七段顯示器出現4  LED  左移漸亮(逐一多顆亮)
8.   七段顯示器出現5 LED 右移漸亮(逐一多顆亮)
9.  七段顯示器出現6 四位七段出現 2018   0609 交替顯示。
10. 七段顯示器出現  078:不動作,LED、 四位七段、 單顆七段均需熄滅。
1 沒有動作的元件要熄滅
數字出現 LED 或七段就要動作
需防彈跳
已提供共陰七段顯示   0~f 之數字表

106年 pwm


#include <at89x52.h>
char reset_P0table[]={0xFE,  0XFC,  0XF8,  0XF0,  0XE0,  0XC0,  0X00,  0xc0};
/*                    a       ab    abc    abcd   abcde  abcdef
 1111 1110 a
 1111 1100 ab
 1111 1000 abc
 1111 0000 abcd
 1110 0000 abcde
 1100 0000 abcdef
 0000 0000 abcdefg
 1100 0000 abcdef
*/
int add=-1;
char x;
sbit sw1=P1^0;
sbit sw2=P1^1;
sbit output=P2^0;
bit change_flag=0;
bit sw1_flag;
bit sw2_flag;
bit breath_flag;
unsigned int breath_count;
unsigned int rpt_count;
char disp_seg7[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x89,0xc9,0xb6,0xFF};
/*-------------------------------*/
void delay_1ms(int k)
{
 int i,j;
 for(i=0;i<k;i++)
   for(j=0;j<114;j++)   ;
}
/*-------------------------------*/
void cck_run_7seg()//逆時針a ab abc...
{
 int i;
 for(i=0;i<8;i++) {  P0=reset_P0table[i];  delay_1ms(500); }
}
/*-------------------------------*/
void delay_2ms(int k)//約500hz
{
 int i,j;
 for(i=0;i<k;i++)
   for(j=0;j<20;j++)
       ;
}
void delay_1000ms(int k)//約1khz
{
 int i,j;
 for(i=0;i<k;i++)
   for(j=0;j<6;j++)
       ;
}
void delay_4ms(int k)//245~248hz約250hz
{
 int i,j;
 for(i=0;i<k;i++)
   for(j=0;j<40;j++)
       ;
}

main()
{
cck_run_7seg();
while(1)
{
if(breath_flag)
{
breath_count++;
if(breath_count%90==0)
{
add++;
if(add>10) add=0;
}
}
if(sw1==0)
{
sw1_flag=1;
sw2_flag=0;
breath_flag=0;
delay_1ms(20);while(sw1!=1);delay_1ms(20);
add++;
if(add>10) add=0;
}
if(sw2==0)
{
sw1_flag=0;
sw2_flag=1;
change_flag=~change_flag;
if(change_flag==1)
{
P0=disp_seg7[11]; delay_1ms(20);
}
else
{
P0=disp_seg7[12]; delay_1ms(20);
}
rpt_count=0;
breath_flag=0;
output=1;
delay_1ms(20);
while(sw2!=1)
{
rpt_count++;
if(rpt_count>100)
{
breath_flag=1;
output=0;
}
delay_1ms(20);
}

}
/*--------------------------------------------------*/
if(sw1_flag)
{
if(add==0)
{
P0=disp_seg7[0];
x=0;
output=0;delay_4ms(x);
output=1;delay_4ms(10-x);
}
else if(add==1)
{
x=1;
P0=disp_seg7[1];
output=0;delay_4ms(x);
output=1;delay_4ms(10-x);
}
else if(add==2)
{
x=2;
P0=disp_seg7[2];
output=0;delay_4ms(x);
output=1;delay_4ms(10-x);
}
else if(add==3)
{
P0=disp_seg7[3];
x=3;
output=0;delay_4ms(x);
output=1;delay_4ms(10-x);
}
else if(add==4)
{
P0=disp_seg7[4];
x=4;
output=0;delay_4ms(x);
output=1;delay_4ms(10-x);
}
else if(add==5)
{
P0=disp_seg7[5];
x=5;
output=0;delay_4ms(x);
output=1;delay_4ms(10-x);
}
else if(add==6)
{
P0=disp_seg7[6];
x=6;
output=0;delay_4ms(x);
output=1;delay_4ms(10-x);
}
else if(add==7)
{
P0=disp_seg7[7];
x=7;
output=0;delay_4ms(x);
output=1;delay_4ms(10-x);
}
else if(add==8)
{
P0=disp_seg7[8];
x=8;
output=0;delay_4ms(x);
output=1;delay_4ms(10-x);
}
else if(add==9)
{
P0=disp_seg7[9];
x=9;
output=0;delay_4ms(x);
output=1;delay_4ms(10-x);
}
else if(add==10)
{
P0=disp_seg7[10];
x=10;
output=0;delay_4ms(x);
output=1;delay_4ms(10-x);
}
}
//--------------------------------------
if(sw2_flag)
{
if(change_flag)//250hz led會漸亮,但H不會漸亮
{
if(add==0)//頻率需求要更改延遲程式
{
x=0;
output=0;P0=disp_seg7[11];delay_4ms(x);
output=1;P0=disp_seg7[13];delay_4ms(10-x);
}
else if(add==1)
{
x=1;
output=0;P0=disp_seg7[11];delay_4ms(x);
output=1;P0=disp_seg7[13];delay_4ms(10-x);
}
else if(add==2)
{
x=2;
output=0;P0=disp_seg7[11];delay_4ms(x);
output=1;P0=disp_seg7[13];delay_4ms(10-x);
}
else if(add==3)
{
x=3;
output=0;P0=disp_seg7[11];delay_4ms(x);
output=1;P0=disp_seg7[13];delay_4ms(10-x);
}
else if(add==4)
{
x=4;
output=0;P0=disp_seg7[11];delay_4ms(x);
output=1;P0=disp_seg7[13];delay_4ms(10-x);
}
else if(add==5)
{
x=5;
output=0;P0=disp_seg7[11];delay_4ms(x);
output=1;P0=disp_seg7[13];delay_4ms(10-x);
}
else if(add==6)
{
x=6;
output=0;P0=disp_seg7[11];delay_4ms(x);
output=1;P0=disp_seg7[13];delay_4ms(10-x);
}
else if(add==7)
{
x=7;
output=0;P0=disp_seg7[11];delay_4ms(x);
output=1;P0=disp_seg7[13];delay_4ms(10-x);
}
else if(add==8)
{
x=8;
output=0;P0=disp_seg7[11];delay_4ms(x);
output=1;P0=disp_seg7[13];delay_4ms(10-x);
}
else if(add==9)
{
x=9;
output=0;P0=disp_seg7[11];delay_4ms(x);
output=1;P0=disp_seg7[13];delay_4ms(10-x);
}
else if(add==10)
{
x=10;
output=0;P0=disp_seg7[11];delay_4ms(x);
output=1;P0=disp_seg7[13];delay_4ms(10-x);
}
}
else//1khz led 和七段的三不會漸亮
  {
   if(add==0)
{
x=0;
output=0;P0=disp_seg7[12];delay_1000ms(x);
output=1;P0=disp_seg7[13];delay_1000ms(10-x);
}
else if(add==1)
{
x=1;
output=0;P0=disp_seg7[12];delay_1000ms(x);
output=1;P0=disp_seg7[13];delay_1000ms(10-x);
}
else if(add==2)
{
x=2;
output=0;P0=disp_seg7[12];delay_1000ms(x);
output=1;P0=disp_seg7[13];delay_1000ms(10-x);
}
else if(add==3)
{
x=3;
output=0;P0=disp_seg7[12];delay_1000ms(x);
output=1;P0=disp_seg7[13];delay_1000ms(10-x);
}
else if(add==4)
{
x=4;
output=0;P0=disp_seg7[12];delay_1000ms(x);
output=1;P0=disp_seg7[13];delay_1000ms(10-x);
}
else if(add==5)
{
x=5;
output=0;P0=disp_seg7[12];delay_1000ms(x);
output=1;P0=disp_seg7[13];delay_1000ms(10-x);
}
else if(add==6)
{
x=6;
output=0;P0=disp_seg7[12];delay_1000ms(x);
output=1;P0=disp_seg7[13];delay_1000ms(10-x);
}
else if(add==7)
{
x=7;
output=0;P0=disp_seg7[12];delay_1000ms(x);
output=1;P0=disp_seg7[13];delay_1000ms(10-x);
}
else if(add==8)
{
x=8;
output=0;P0=disp_seg7[12];delay_1000ms(x);
output=1;P0=disp_seg7[13];delay_1000ms(10-x);
}
else if(add==9)
{
output=0;P0=disp_seg7[12];delay_1000ms(x);
output=1;P0=disp_seg7[13];delay_1000ms(10-x);
}
else if(add==10)
{
x=10;
output=0;P0=disp_seg7[12];delay_1000ms(x);
output=1;P0=disp_seg7[13];delay_1000ms(10-x);
}
}
}
}
}

algorithm

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