?? main.c
字號:
#include <absacc.h>
#include <reg52.h>
/*////////////////////////////*/
/*/ 常量定義 /*/
/*////////////////////////////*/
/* 定義T2MOD */
sfr T2MOD=0xC9;
/* 定時器初值 */
#define V_T1 0xfd /*SCOM 9600 baud, ! notice: crystal 11.0592MHz */
#define V_TH0 0xee /* ~ 5ms , ! notice: crystal 11.0592MHz */
#define V_TL0 0x00
#define V_TH1 0xfc /* ~ 5ms , ! notice: crystal 11.0592MHz */
#define V_TL1 0x66
/* 數碼管段驅動寄存器地址 */
#define ADDR_8SEG XBYTE[0x2000]
/* 數碼管位驅動和指示燈驅動寄存器地址 */
#define ADDR_SEL XBYTE[0x4000]
/* 波形的輸出端口*/
sbit out= P1^4;
sbit out1= P1^5;
/* 按鍵 */
sbit KEY1= P1^0;
sbit KEY2= P1^1;
sbit KEY3= P1^2;
sbit KEY4= P1^3;
/*////////////////////////////*/
/*/ 變量定義 /*/
/*////////////////////////////*/
unsigned char bdata output_sel;
sbit led_1 = output_sel^5;
sbit led_2 = output_sel^6;
sbit led_3 = output_sel^7;
sbit led_4 = output_sel^4;
/* 數碼管掃描驅動指針,為測試外部存儲器(U3 6264),特使用xdata類型 */
unsigned char xdata digi_scaner;
/* 測試用計數器,為測試外部存儲器(U3 6264),特使用xdata類型 */
unsigned int xdata test_counter;
/* 測試用計數值十進制表示,為測試外部存儲器(U3 6264),特使用xdata類型 */
unsigned char xdata digi[4];
//自定義數據
int delaytime=0;
int index=0;
int pianyi;
int m=0;
int n=3;
int x=0;
int y=0;
int period=7;
int temp;
int index;
int yiweiqi[8]={1,1,1,1,1,1,1,1};
unsigned char xdata c[27]={0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,1,1,0};
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
/*////////////////////////////*/
/*/ 函數定義 /*/
/*////////////////////////////*/
/**** 7段數碼顯示譯碼
參數:
DATA: 需要顯示的數字或符號;
返回值: 7段譯碼結果 ( D7~0 = PGFEDCBA )
*****/
unsigned char NUMTOSEG7(unsigned char DATA)
{ unsigned char AA;
switch (DATA)
{ case 0: AA=0xc0;break; /* '0'*/
case 1: AA=0xf9;break; /* '1'*/
case 2: AA=0xa4;break; /* '2'*/
case 3: AA=0xb0;break; /* '3'*/
case 4: AA=0x99;break; /* '4'*/
case 5: AA=0x92;break; /* '5'*/
case 6: AA=0x82;break; /* '6'*/
case 7: AA=0xf8;break; /* '7'*/
case 8: AA=0x80;break; /* '8'*/
case 9: AA=0x90;break; /* '9'*/
// case 10: AA=0x40;break; /* '0.'*/
case 10: AA=0x7f;break; /* ' .'*/
case 11: AA=0x79;break; /* '1.'*/
case 12: AA=0x24;break; /* '2.'*/
case 13: AA=0x30;break; /* '3.'*/
case 14: AA=0x19;break; /* '4.'*/
case 15: AA=0x12;break; /* '5.'*/
case 16: AA=0x02;break; /* '6.'*/
case 17: AA=0x78;break; /* '7.'*/
case 18: AA=0x00;break; /* '8.'*/
case 19: AA=0x10;break; /* '9.'*/
case '-':AA=0xbf;break; /* 破折號,此處原誤為0xdf,系04級王資凱同學指正*/
case '_':AA=0xf7;break; /* 下劃線*/
case ' ':AA=0xff;break; /* 消隱*/
default: AA=0xff;
}
return(AA);
}
int exp(int DATA)
{ int AA;
switch (DATA)
{ case 3: AA=7;break; /* '3'*/
case 4: AA=15;break; /* '4'*/
case 5: AA=31;break; /* '5'*/
case 6: AA=63;break; /* '6'*/
case 7: AA=127;break; /* '7'*/
case 8: AA=255;break; /* '8'*/
default: AA=0;
}
return(AA);
}
/**** T0時鐘中斷服務程序
在本例中,每5ms被執行一次
*****/
timer0() interrupt 1 using 0
{
// EA=0; /*關中斷*/
/* 重新對計數器賦初值,并啟動定時計數 */
TH0=V_TH0;
TL0=V_TL0;
TR0=1;
index++;
if(index==period)index=0;
if(!index)out1=1;
else out1=0;
out=yiweiqi[0];
temp=yiweiqi[0];
for(m=1;m<n;m++)
temp=(c[pianyi+m-1]*yiweiqi[m]+temp)%2;
for(y=0;y<(n-1);y++)
yiweiqi[y]=yiweiqi[y+1];
yiweiqi[n-1]=temp;
output_sel = 0xf0; /*初值,令數碼管驅動位無效,指示燈全滅*/
/* 檢測到按鍵被按下(0)時,相應的指示燈亮(0) */
/* 數碼管掃描驅動指針值從1到4重復變換,每5ms間隔對一個數碼管進行驅動,20ms一個輪回 */
if (++digi_scaner>=5) digi_scaner = 1;
switch (digi_scaner)
{
case 1: /* 驅動第一個數碼管 */
output_sel |= 0x01;
ADDR_8SEG = NUMTOSEG7(digi[0]); /*輸出到鎖存器U5(在電路圖中找)*/
break;
case 2: /* 驅動第二個數碼管 */
output_sel |= 0x02;
ADDR_8SEG = NUMTOSEG7(digi[1]); /*輸出到鎖存器U5*/
break;
case 3: /* 驅動第三個數碼管 */
output_sel |= 0x04;
ADDR_8SEG = NUMTOSEG7(digi[2]); /*輸出到鎖存器U5*/
break;
case 4: /* 驅動第四個數碼管 */
output_sel |= 0x08;
ADDR_8SEG = NUMTOSEG7(digi[3]); /*輸出到鎖存器U5*/
break;
}
ADDR_SEL = output_sel; /*輸出到鎖存器U6(在電路圖中找)*/
}
/**
* FUNCTION_PURPOSE: timer2 interrupt
* FUNCTION_INPUTS: void
* FUNCTION_OUTPUTS: void
*/
/**** 主程序
*****/
main()
{
/* 單片機系統初始化 */
P1=0XFF;
P3=0XEF;
/** 中斷工作寄存器初始化 **/
IE=0X80;
IP=0;
IT0=0;
IT1=0;
/** 定時器工作寄存器初始化 **/
TMOD=0X11;
TH1=V_TH1;
TL1=V_TL1;
TH0=V_TH0;
TL0=V_TL0;
/** 串行通信口工作初始化 ,注:本例中雖未使用到串行通信口,但本段程序無妨保留**/
SM0=0; /*SCOM MODE 1 (8BIT UART VARBR)*/
SM1=1;
SM2=0;
REN=1;
TI=1;
/** 全局變量賦初值 **/
digi_scaner=1;
/** 開定時器,定時器0中斷允許 **/
TR0=1;
TR1=0;
ET0=1;
out1=0;
/* 主循環,本例中,在T0中斷服務程序未被執行的空余時間里,處理機在以下程序中不斷循環 */
while(1){
if(KEY1==0){
delaytime=30000;
while(--delaytime);
if(KEY1==0){
index=0;
n=(n+1)%9;
if(n==0)n=3;
period=exp(n);
pianyi=0;
for(m=3;m<n;m++)
pianyi=pianyi+m-1;
x=0;
while(x<n){yiweiqi[x]=1;x++;}
}
}
digi[0]=n;
digi[1]=pianyi;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -