?? t_mini.c
字號(hào):
#include <absacc.h>
#include <reg51.h>
/*////////////////////////////*/
/*/ 常量定義 /*/
/*////////////////////////////*/
/* 定時(shí)器初值 */
#define V_T1 0xfd /*SCOM 9600 baud, ! notice: crystal 11.0592MHz */
#define V_TH0 0xee /* ~ 5ms , ! notice: crystal 11.0592MHz */
#define V_TL0 0x00
/* 1s軟件定時(shí)器溢出值,200個(gè)5ms */
#define V_T1s 200
/* 數(shù)碼管段驅(qū)動(dòng)寄存器地址 */
#define ADDR_8SEG XBYTE[0x2000]
/* 數(shù)碼管位驅(qū)動(dòng)和指示燈驅(qū)動(dòng)寄存器地址 */
#define ADDR_SEL XBYTE[0x4000]
/* 按鍵 */
sbit KEY1= P1^0;
sbit KEY2= P1^1;
sbit KEY3= P1^2;
sbit KEY4= P1^3;
/*////////////////////////////*/
/*/ 變量定義 /*/
/*////////////////////////////*/
/* 1s軟件定時(shí)器計(jì)數(shù) */
unsigned char clock1s;
/* 1s軟件定時(shí)器溢出標(biāo)志,位變量 */
bit clock1s_flag;
/* 數(shù)碼管位驅(qū)動(dòng)和指示燈驅(qū)動(dòng)信號(hào)輸出緩存,定義了一個(gè)可位尋址的變量 */
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;
/* 數(shù)碼管掃描驅(qū)動(dòng)指針,為測試外部存儲(chǔ)器(U3 6264),特使用xdata類型 */
unsigned char xdata digi_scaner;
/* 測試用計(jì)數(shù)器,為測試外部存儲(chǔ)器(U3 6264),特使用xdata類型 */
unsigned int xdata test_counter;
/* 測試用計(jì)數(shù)值十進(jìn)制表示,為測試外部存儲(chǔ)器(U3 6264),特使用xdata類型 */
unsigned char xdata digi[4];
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
/*////////////////////////////*/
/*/ 函數(shù)定義 /*/
/*////////////////////////////*/
/**** 7段數(shù)碼顯示譯碼
參數(shù):
DATA: 需要顯示的數(shù)字或符號(hào);
返回值: 7段譯碼結(jié)果 ( 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=0x88;break; /* ‘A’*/
case 11: AA=0x83;break; /* ‘B’*/
case 12: AA=0xc6;break; /* ‘C’*/
case 13: AA=0xa1;break; /* ‘D’*/
case 14: AA=0x86;break; /* ‘E’*/
case 15: AA=0x8e;break; /* ‘F’*/
case '-':AA=0xbf;break; /* 破折號(hào),此處原誤為0xdf,系04級(jí)王資凱同學(xué)指正*/
case '_':AA=0xf7;break; /* 下劃線*/
case ' ':AA=0xff;break; /* 消隱*/
default: AA=0xff;
}
return(AA);
}
/**** T0時(shí)鐘中斷服務(wù)程序
在本例中,每5ms被執(zhí)行一次
*****/
timer0() interrupt 1 using 0
{
EA=0; /*關(guān)中斷*/
/* 重新對(duì)計(jì)數(shù)器賦初值,并啟動(dòng)定時(shí)計(jì)數(shù) */
TH0=V_TH0;
TL0=V_TL0;
TR0=1;
/* 1秒鐘軟定時(shí)器計(jì)數(shù) */
if (++clock1s>=V_T1s)
{
clock1s_flag = 1; /*當(dāng)1秒到時(shí),溢出標(biāo)志置1 */
clock1s = 0;
}
output_sel = 0xf0; /*初值,令數(shù)碼管驅(qū)動(dòng)位無效,指示燈全滅*/
/* 檢測到按鍵被按下(0)時(shí),相應(yīng)的指示燈亮(0) */
if (KEY1==0) led_1 = 0;
if (KEY2==0) led_2 = 0;
if (KEY3==0) led_3 = 0;
if (KEY4==0) led_4 = 0;
/* 數(shù)碼管掃描驅(qū)動(dòng)指針值從1到4重復(fù)變換,每5ms間隔對(duì)一個(gè)數(shù)碼管進(jìn)行驅(qū)動(dòng),20ms一個(gè)輪回 */
if (++digi_scaner>=5) digi_scaner = 1;
switch (digi_scaner)
{
case 1: /* 驅(qū)動(dòng)第一個(gè)數(shù)碼管 */
output_sel |= 0x01;
ADDR_8SEG = NUMTOSEG7(digi[0]); /*輸出到鎖存器U5(在電路圖中找)*/
break;
case 2: /* 驅(qū)動(dòng)第二個(gè)數(shù)碼管 */
output_sel |= 0x02;
ADDR_8SEG = NUMTOSEG7(digi[1]); /*輸出到鎖存器U5*/
break;
case 3: /* 驅(qū)動(dòng)第三個(gè)數(shù)碼管 */
output_sel |= 0x04;
ADDR_8SEG = NUMTOSEG7(digi[2]); /*輸出到鎖存器U5*/
break;
case 4: /* 驅(qū)動(dòng)第四個(gè)數(shù)碼管 */
output_sel |= 0x08;
ADDR_8SEG = NUMTOSEG7(digi[3]); /*輸出到鎖存器U5*/
break;
}
ADDR_SEL = output_sel; /*輸出到鎖存器U6(在電路圖中找)*/
EA=1; /*開中斷*/
}
/**** 主程序
*****/
main()
{
/* 單片機(jī)系統(tǒng)初始化 */
P1=0XFF;
P3=0XFF;
/** 中斷工作寄存器初始化 **/
IE=0X80;
IP=0;
IT0=0;
IT1=0;
/** 定時(shí)器工作寄存器初始化 **/
TMOD=0X21;
TH1=V_T1;
TL1=V_T1;
TH0=V_TH0;
TL0=V_TL0;
/** 串行通信口工作初始化 ,注:本例中雖未使用到串行通信口,但本段程序無妨保留**/
SM0=0; /*SCOM MODE 1 (8BIT UART VARBR)*/
SM1=1;
SM2=0;
REN=1;
TI=1;
/** 全局變量賦初值 **/
clock1s=0;
clock1s_flag=0;
digi_scaner=1;
test_counter=0;
/** 開定時(shí)器,定時(shí)器0中斷允許 **/
TR0=1;
TR1=1;
ET0=1;
/* 主循環(huán),本例中,在T0中斷服務(wù)程序未被執(zhí)行的空余時(shí)間里,處理機(jī)在以下程序中不斷循環(huán) */
while(1)
{
if (clock1s_flag) /* 檢查1秒定時(shí)是否到 */
{
clock1s_flag=0;
/** 每秒加1的數(shù)碼管十進(jìn)制顯示計(jì)數(shù) **/
if (++test_counter>=10000) test_counter=0;
digi[0] = test_counter/1000; /*計(jì)算千位數(shù)*/
digi[1] = (test_counter-digi[0]*1000)/100; /*計(jì)算百位數(shù)*/
digi[2] = (test_counter-digi[0]*1000-digi[1]*100)/10; /*計(jì)算十位數(shù)*/
digi[3] = (test_counter-digi[0]*1000-digi[1]*100-digi[2]*10); /*計(jì)算個(gè)位數(shù)*/
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -