久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
多位數碼管動態掃描顯示變化數據,并不停變化數值 大家能幫我解釋一下這原理嗎??
[打印本頁]
作者:
woaidpj
時間:
2014-12-8 22:35
標題:
多位數碼管動態掃描顯示變化數據,并不停變化數值 大家能幫我解釋一下這原理嗎??
這個程序是開發板里面的一個,大家能幫我分析下這個程序的工作原理嗎,先謝謝各位了。。程序如下,我一直都搞不懂.......
/****************************** (C) COPYRIGHT 2013 YQDZ **************************
* 文 件 名 : 999累加.C
* 作 者 : YQDZ
* 版 本 : V1.0
* 日 期 : 2013/07/07
* 主 控 MCU : STC89C52RC
* 主 頻 : 11.0592MHz
* 編 譯 器 : Keil C51 V4.22
* 描 述 : 多位數碼管動態掃描顯示變化數據,并不停變化數值。V573需要用短
* 路帽短接到VCC,不用時需要移除。
*********************************************************************************/
#include"reg52.h" /* 調用頭文件,單片機內部寄存器都定義在此,用的時候需要先調用 */
typedef unsigned char UINT8; /* 給unsigned char重新定義一個別名UINT8,用的時候直接寫UINT8就可以 */
typedef unsigned int UINT16; /* 給unsigned int重新定義一個別名UINT16,用的時候直接寫UINT16就可以 */
/******************************** 引腳定義 **************************************
單片機 74HC573
P00-P07 DB0-DB7
P22 LE1
P23 LE2
V573 VCC
*********************************************************************************/
#define DataPort P0 /* 定義數據端口,程序中遇到DataPort則用P0替換 */
sbit LE1 = P2^2; /* 定義74HC573鎖存使能端口 段鎖存 */
sbit LE2 = P2^3; /* 定義74HC573鎖存使能端口 位鎖存 */
UINT8 code DuanMa[ ] = { 0x3F,0x06,0x5B,0x4F,
0x66,0x6D,0x7D,0x07,
0x7F,0x6F }; /* 段碼值0-9 */
UINT8 code WeiMa[] = { 0xFE,0xFD,0xFB,0xF7,
0xEF,0xDF,0xBF,0x7F }; /* 分別對應相應的數碼管位碼,決定哪個數碼管被點亮 */
UINT8 TempData[8]; /* 存儲顯示值 */
/*******************************************************************************
* 函 數 名 : DelayMs
* 描 述 : 毫秒延時.
* 輸 入 : UINT8 Ms:
* 要延時的Ms時間. Ms值范圍為0-65535,數值越大延時時間越長
* 返 回 : 無.
*******************************************************************************/
void DelayMs( UINT16 Ms )
{
UINT8 i;
while (Ms--)
{
for ( i = 0; i < 114; i++ ); /* 循環114大概是1MS時間 */
}
}
/*******************************************************************************
* 函 數 名 : Display
* 描 述 : 顯示函數,用于動態掃描數碼管
* 輸 入 : UINT8 FirstBit:
* 要顯示的位
* UINT8 Num:
* 要顯示的數碼管的位數
* 返 回 : 無.
********************************************************************************/
void Display( UINT8 FirstBit, UINT8 Num )
{
UINT8 i;
for( i = 0; i < Num; i++ )
{
DataPort=0; /* 清空數據,防止有交替重影 */
LE1 = 1; /* 段鎖存 */
LE1 = 0;
DataPort = WeiMa[ i + FirstBit ]; /* 取位碼 */
LE2 = 1; /* 位鎖存 */
LE2 = 0;
DataPort = TempData[ i ]; /* 取顯示數據,段碼 */
LE1 = 1; /* 段鎖存 */
LE1 = 0;
DelayMs(5); /* 掃描間隙延時,時間太長會閃爍,太短會造成重影 */
}
}
/*******************************************************************************
* 函 數 名 : main
* 描 述 : 主函數
* 輸 入 : 無.
* 返 回 : 無.
********************************************************************************/
void main (void)
{
UINT16 Num;
UINT16 j = 0;
while( 1 )
{
j++; /* 計數次數加1 */
if( j == 5 ) /* 檢測當前數值顯示了一小段時間后,需要顯示的數值加1,實現數據顯示的變化 */
{
j = 0; /* 計數重新開始 */
Num++; /* 顯示數據加 1 */
if( Num == 1000 ) /* 用于顯示0-999 */
Num = 0; /* 重新從0開始顯示 */
}
TempData[ 0 ] = DuanMa[ Num / 100 ]; /* 計算顯示數據對應段碼的數據成員,如要顯示68,則68/10=6 68%10 = 8 */
TempData[ 1 ] = DuanMa[ ( Num % 100 ) / 10 ];
TempData[ 2 ] = DuanMa[ ( Num % 100 ) % 10 ];
Display( 2, 3 ); /* 調用顯示程序 */
}
}
作者:
123456czst
時間:
2020-11-3 20:45
首先你得明白動態掃描的工作原理,這個多位數碼管一般分為兩個東東,一個是數據位,另一是地址位,數據位主要是顯示數字之類的東東的,而地址位是選擇那個位置的led燈亮的
作者:
0711zhao
時間:
2020-11-4 12:30
數碼管顯示的原理是快速的循環掃描顯示數字,利用人眼睛視覺差達到同時顯示的效果,比如顯示268,就是在TempData[ 0 ]顯示數字2,其他數碼管不顯示,延遲5毫秒后,在TempData[ 1 ]顯示數字6,其他數碼管不顯示,延遲5毫秒后,在TempData[ 2]顯示數字8,其他數碼管不顯示,延遲5毫秒后,又回到最開始的TempData[ 0 ]顯示數字2,其他數碼管不顯示上,如此循環,因為顯示刷新的頻率快和人眼的視覺差的原因,你看到的就是268同時顯示。
具體到數碼管的顯示上有分段選和位選,就是8位數碼管顯示那一個數碼管,就是這段代碼
UINT8 code WeiMa[] = { 0xFE,0xFD,0xFB,0xF7,
0xEF,0xDF,0xBF,0x7F }; /* 分別對應相應的數碼管位碼,決定哪個數碼管被點亮 */
比如顯示268,就是在TempData[ 0 ]顯示數字2,這段就是選擇點亮TempData[ 0 ],
UINT8 code DuanMa[ ] = { 0x3F,0x06,0x5B,0x4F,
0x66,0x6D,0x7D,0x07,
0x7F,0x6F }; /* 段碼值0-9 */
這段就是決定在TempData[ 0 ]上顯示的數字是2.
作者:
wulin
時間:
2020-11-4 12:44
把程序簡化一下便于樓主理解
#include"reg52.h" /* 調用頭文件,單片機內部寄存器都定義在此,用的時候需要先調用 */
typedef unsigned char UINT8;/* 給unsigned char重新定義一個別名UINT8,用的時候直接寫UINT8就可以 */
typedef unsigned int UINT16;/* 給unsigned int重新定義一個別名UINT16,用的時候直接寫UINT16就可以 */
sbit LE1 = P2^2; /* 定義74HC573鎖存使能端口 段鎖存 */
sbit LE2 = P2^3; /* 定義74HC573鎖存使能端口 位鎖存 */
UINT8 code DuanMa[ ] = { 0x3F,0x06,0x5B,0x4F,
0x66,0x6D,0x7D,0x07,
0x7F,0x6F }; /* 段碼值0-9 */
UINT8 code WeiMa[] = { 0xFE,0xFD,0xFB,0xF7,
0xEF,0xDF,0xBF,0x7F };/* 分別對應相應的數碼管位碼,決定哪個數碼管被點亮 */
UINT8 TempData[8]; /* 存儲顯示值 */
void DelayMs(UINT16 Ms)
{
UINT8 i;
while (Ms--)
{
for(i=0;i<114;i++);/* 循環114大概是1MS時間 */
}
}
void main (void)
{
UINT16 Num=0,j=0;
UINT8 i=0;
while(1)
{
j++;
if(j==1000)//約1秒
{
j=0;
Num++;
if(Num==1000)
Num = 0;
}//數據按十進制分解后保存在顯示緩存中
TempData[0] = DuanMa[Num/100%10];/* 計算顯示數據對應段碼的數據成員,如要顯示68,則68/10=6 68%10 = 8 */
TempData[1] = DuanMa[Num/10%10];
TempData[2] = DuanMa[Num%10];
P0=0x00;/* 清空數據,防止有交替重影 */
LE1 = 1; /* 段鎖存 */
LE1 = 0;
P0=WeiMa[i];/* 取位碼 */
LE2 = 1;/* 位鎖存 */
LE2 = 0;
P0=TempData[i]; /* 取顯示數據,段碼 */
LE1 = 1; /* 段鎖存 */
LE1 = 0;
i++;
if(i==3)
i=0;
DelayMs(1);//控制主循環周期約1ms
}
}
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
亚洲国产一区视频
|
国产999精品久久久久久绿帽
|
羞羞的视频在线观看
|
日韩视频一区二区
|
二区三区在线观看
|
嫩草国产
|
亚洲一区二区免费电影
|
国产欧美精品一区二区色综合朱莉
|
亚洲综合大片69999
|
亚洲丝袜天堂
|
欧美成人免费在线
|
久久精品一二三影院
|
91久久久久
|
久久se精品一区精品二区
|
欧美亚洲国产一区
|
精品久久久久一区二区国产
|
国产美女在线免费观看
|
99国产精品99久久久久久粉嫩
|
精品国产一区二区国模嫣然
|
啪啪av
|
国产精品久久久久久亚洲调教
|
黄色片在线观看网址
|
激情视频中文字幕
|
久久久久久久久国产
|
日韩a级片
|
成人一区二区三区在线观看
|
断背山在线观看
|
欧美一级黄色片免费观看
|
特黄一级
|
仙人掌旅馆在线观看
|
精品视频久久久久久
|
91福利电影在线观看
|
午夜久久久久久久久久一区二区
|
91中文字幕在线
|
91精品国产综合久久久久久丝袜
|
中文字幕乱码亚洲精品一区
|
国产综合精品一区二区三区
|
精品欧美一区二区三区久久久
|
精品国产乱码久久久久久图片
|
人人爽人人爽人人片av
|
久久青
|