2019年10月24日 星期四

左2上下數 右2順逆




#include "at89x52.h"      /* 含8051所有暫存器宣告 */
unsigned char bdata flag;
sbit up_flag=flag^0;
sbit ccw_flag=flag^3;
sbit sw2=P3^2;
sbit sw3=P3^3;
char i=20;             /* 1 秒=20*50ms */
char di;               /* 七段顯示器位址碼 */
int count=-1;          /* 七段顯示器的計數值 */
char ccw_cnt=-1;
char disp[]={5,1,6,0}; /* 定義兩位數顯示值儲存緩衝區 */
char code act[]={0xFe,0xFd,0xFb,0xF7};
char code P0table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xFF};
//   0      1      2        3       4       5      6        7      8       9      10       11      12      13      14     15    16
//shor_line 1111 1110(a) FE 
//shor_line 1111 1101(b) FD
//shor_line 1111 1011(c) FB
//shor_line 1111 0111(d) F7
//shor_line 1110 1111(e) EF
//shor_line 1101 1111(f) DF
void delay_1ms(unsigned int k)
{
unsigned int i,j;
for(i=0;i<=k;i++)
for(j=0;j<=110;j++)
       ;
}
void T0_int(void) interrupt 1   /* T0中斷函數:顯示器動態掃描 */
{
  TH0=(65536-2000)/256;          /* 重設初值 */
  TL0=(65536-2000)%256;
  P1=act[di];              /* 輸出位址碼 */
  P0=P0table[disp[di]];       /* 輸出所掃描位數的顯示資料 */
di++;                          /* 掃描下一位七段顯示器 */
  if(di==4)                      /* 已掃描至最後一位數? */
    di=0;                        /* 重新掃描第一位七段顯示器 */
} /* T0_int */
void T1_int(void) interrupt  3 /* T1中斷函數:延遲時間1秒 */
{
  TH1=(65536-50000)/256;       /* 重設初值 */
  TL1=(65536-50000)%256;
  i--;
  if(i==0)
{
    i=20;
if(up_flag)
{
count++;
if(count==100)
count=0;
disp[1]=count/10; /* 取出十位數顯示碼 */
disp[0]=count%10;
}
else
{
count--;
if(count==0)
count=99;
disp[1]=count/10; /* 取出十位數顯示碼 */
disp[0]=count%10;
}
if(ccw_flag)
{
ccw_cnt++;
if(ccw_cnt==8) ccw_cnt=0;
}
else
{
ccw_cnt--;
if(ccw_cnt<0) ccw_cnt=8;
}
if(ccw_cnt==0){ disp[3]=16;disp[2]=10;} //暗  a亮
else if(ccw_cnt==1){ disp[3]=10;disp[2]=16;} //a亮 暗
else if(ccw_cnt==2){ disp[3]=15;disp[2]=16;} //f亮 暗
else if(ccw_cnt==3){ disp[3]=14;disp[2]=16;} //e亮 暗
else if(ccw_cnt==4){ disp[3]=13;disp[2]=16;} //d亮 暗
else if(ccw_cnt==5){ disp[3]=16;disp[2]=13;} //暗  d亮
else if(ccw_cnt==6){ disp[3]=16;disp[2]=12;} //暗  c亮
else if(ccw_cnt==7){ disp[3]=16;disp[2]=11;} //暗  b亮
}
}
void init()
{
  IE=0x8A;                    /* 致能計時器0、1中斷 */
TMOD=0x11;                 /* T0:工作模式0,T1:工作模式1 */
TH0=(65536-2000)/256;          /* 設定T0初值,每5ms中斷一次 */
TL0=(65536-2000)%256;
TH1=(65536-50000)/256;        /* 設定T1初值,每50ms中斷一次 */
TL1=(65536-50000)%256;
}

void main()                     /* 主程式 */
{
init();
TR0=1;                       /* 先啟動計時器0 顯示0615*/
delay_1ms(2000);      //停個兩秒
TR1=1;                       /* 再啟動啟動計時器1可以跑順逆時針 */
up_flag=1;
ccw_flag=1;
while(1)                       /* 等待計時器中斷 */
{
if(sw2==0){up_flag=~up_flag;delay_1ms(50);while(sw2!=1);delay_1ms(50);}
if(sw3==0){ccw_flag=~ccw_flag; delay_1ms(50);while(sw3!=1);delay_1ms(50);}
}
}

沒有留言:

張貼留言

algorithm

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