標(biāo)題:
單片機(jī)實(shí)驗(yàn) 數(shù)碼管靜態(tài)顯示實(shí)驗(yàn)
[打印本頁]
作者:
xuelongxl
時間:
2016-11-5 20:58
標(biāo)題:
單片機(jī)實(shí)驗(yàn) 數(shù)碼管靜態(tài)顯示實(shí)驗(yàn)
內(nèi)容:循環(huán)顯示十六進(jìn)制數(shù)0~F
#include "reg52.h"
sbit EnWei =P2^7; //位碼鎖存器使能端
sbit EnSeg =P2^6; //段碼鎖存器使能端
#define DATAPORT (P0) //段/位碼輸出端口
#define WEICODE (0x7f) //位碼初始值
#define OFFCODE (0xff) //定義熄滅碼
#define INCSPEED (10) //顯示內(nèi)容變化速度
unsigned char code SegTab[]={ //定義段碼表(共陰極)
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
unsigned char DispBuf[8]={ //定義顯示緩沖區(qū)
0x00,0xff,0xff,0xff,
0xff,0xff,0xff,0xff
};
//延時函數(shù)
//x為延時時間,范圍1~65535
void xDelay(unsigned int x)
{
unsigned char y;
for(;x>0;x--)
for(y=110;y>0;y--);
}
//數(shù)值分離函數(shù),將要顯示的數(shù)各數(shù)值位分離到DispBuf數(shù)組中
//x為要顯示的數(shù),范圍0~4294967295
void GetDispBufValue(unsigned long x)
{
unsigned char Temp,i;
i=0; //作為DispBuf數(shù)組的下標(biāo)
while(x>0)
{
Temp=x%10; //使x對10求余,取出最低位
x/=10; //更改x的值,為下一輪作準(zhǔn)備
DispBuf[i++]=Temp; //將取出的數(shù)值位存入顯示緩沖
}
while(i<8) //如果x不足8位,將其余的位填上熄滅碼
{
DispBuf[i++]=OFFCODE;
}
}
//顯示函數(shù)
//x要顯示的值,范圍0~4294967295
void Display(unsigned long x)
{
unsigned char WeiCode=WEICODE,i;
GetDispBufValue(x); //先將顯示值的數(shù)值位分離出來
for(i=0;i<8;i++) //循環(huán)刷新每一位數(shù)碼管
{
if(DispBuf[i]!=OFFCODE)
{
DATAPORT=SegTab[DispBuf[i]]; //輸出段碼并鎖存
EnSeg=1;
EnSeg=0;
DATAPORT=WeiCode; //輸出位碼并鎖存
EnWei=1;
EnWei=0;
}
WeiCode>>=1; //為下一位數(shù)值準(zhǔn)備位碼
WeiCode|=0x80;
xDelay(5); //延時一會,使剛被點(diǎn)亮的位穩(wěn)定
}
DATAPORT=0x00; //熄滅最后一位被點(diǎn)亮的數(shù)碼管
EnSeg=1;
EnSeg=0;
}
void main(void)
{
unsigned char IncSpeed=INCSPEED;
unsigned long x=76543210;
P2=0x00;
while(1){
Display(x); //調(diào)用顯示函數(shù)
//if(--IncSpeed==0) //減到0時,為顯示數(shù)值加1
//{
// IncSpeed=INCSPEED; //恢復(fù)初值,為下一輪作準(zhǔn)備
//x++; //顯示數(shù)值加1
//}
}
}
復(fù)制代碼
05實(shí)驗(yàn)五 靜態(tài)顯示.zip
2016-11-5 20:58 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
16.67 KB, 下載次數(shù): 9, 下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1