#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;
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 add=1;//因為切換有時不見數字,那就用另外變數表示,因為一開始是1248的1,所以add=1
char str1[]={0,8,1,0,0,0,0,0,2};
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++)
;
}
void int_t0(void) interrupt 1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
num++;
if(blink_flag==1)
{
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)
alternate_flag=~alternate_flag;
P3=~add;//變數別起,就不用跟前面有瓜隔
if(alternate_flag==1)
P0=seg7_table[str2[add]];
else
P0=seg7_table[str1[add]];
add<<=1;
if(add==0x10) add=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;P3=0xff; //P2=0xFF不能關掉,否則會0 7 8 9 暗暗的
}
if(k==1){ flag=0;blink_flag=1; P2= seg7_table[k];P3=0xff;} //七段只要顯示一次不要在中斷每次都顯示
if(k==2){ flag=0;left_move_flag=1;P2= seg7_table[k];P3=0xff;}//右鍵--,四位數燈要OFF,沒辦法寫scan=0, 它會停在最右邊
if(k==3){ flag=0;right_move_flag=1;P2= seg7_table[k];P3=0xff;}
if(k==4){ flag=0;increase1_flag=1; P2= seg7_table[k];P3=0xff;}
if(k==5){ flag=0;increase2_flag=1; P2= seg7_table[k];P3=0xff;}
if(k==6){ flag=0;chang_word_flag=1; P1=0XFF;P2= seg7_table[k];}//沒辦法寫scan=1,因為顯示的數字是錯的
}
}
沒有留言:
張貼留言