導航:首頁 > 操作系統 > 單片機數碼管顯示9999

單片機數碼管顯示9999

發布時間:2022-08-21 04:32:45

㈠ 四位數碼管顯示0到9999 四個按鍵控制數字加減清零用51單片機C 語言

#include <reg52.h>
//P0是數碼管。P1是LED.P2是按鍵
sbit KEY_OUT_1 = P2^3;
sbit KEY_OUT_2 = P2^2;
sbit KEY_OUT_3 = P2^1;
sbit KEY_OUT_4 = P2^0;

#define uchar unsigned char
#define ulint unsigned long
#define Frequency 10//定時器中斷時間 = f*T
#define Time 1//一個周期1ms
#define TubeNumber 6//數碼管個數
#define KeyLine 4//矩陣按鍵行數
#define KeyColumn 4//矩陣按鍵列數
//數碼管真值表
uchar code LED_Number[]={0x0C,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
//uchar code LED_Alphabet[]={0x88,0x83,0xC6,0xA1,0x86,0x8E,0x89,0xC7,0x8C,0xC1,0x91,0x9C};
/*0~9
A~F (b 、d為小寫) H L P U y o */
uchar LED_Buff[TubeNumber]={0xff,0xff,0xff,0xff,0xff,0xff};
/*數碼管顯示緩沖區,0xff確保初始時都不亮.
不可寫成uchar code LED_Buff[]。code定義變數寫入room,不可修改*/
// 矩陣按鍵編號到標准盤碼的映射表
uchar code KeyCodeMap[4][4] = {
( 0x31, 0x32, 0x33, 0x26 ), // 數字鍵 1、數字鍵 2、數字鍵 3、向上鍵
( 0x34, 0x35, 0x36, 0x25 ), // 數字鍵 4、數字鍵 5、數字鍵 6、向左鍵
( 0x37, 0x38, 0x39, 0x28 ), // 數字鍵 7、數字鍵 8、數字鍵 9、向下鍵
( 0x30, 0x1B, 0x0D, 0x27 )}; // 數字鍵 0、ESC 鍵 、回車鍵 、向右鍵
uchar StaFlag[KeyLine][KeyColumn] ={(1,1,1,1),(1,1,1,1),(1,1,1,1),(1,1,1,1)};//按鍵是否穩定標志
void StartTime0();
void TubeDisplay(ulint sec);
ulint pow(x,y);
void TubeScan();
void KeyAction(uchar keycode);
void KeyDriver();
void KeyScan();
void main ()
{
P1 = 0x08;//使能U3,選擇數碼管。
StartTime0();
while(1)KeyDriver();
}
//定時器0啟動函數
void StartTime0()
{
EA = 1;
ET0 = 1;
TMOD = 0x01;
TH0 = (65536 - Time * 100) / 256;
TL0 = (65536 - Time * 100) % 256;
PT0 = 1;
/*定時器0優先中斷控制位。
IP 這個寄存器的每一位,表示對應中斷的搶占優先順序,每一位的復值都是0,當我們把某一位設置為1的時候,這一位優先順序就比其它位的優先順序高了。
比如我們設置了 PT0位為1後, 當單片機在主循環或其他中斷程序執行時,一旦TO發生中斷,作為更高優先順序,程序馬上執行T0.若在T0程序執行時,
其他中斷程序發生中斷,仍執行TO直到T0中斷結束後再執行其他程序。
*/
}
//中斷服務函數
void To_time0()interrupt 1 using 0
{
static uchar cnt;//記錄TO中斷次數
// static ulint sec;//記錄經過秒速
//判斷是否溢出
if (TF0 == 1)
{
TF0 = 0;
TH0 = (65536 - Time * 100) / 256;
TL0 = (65536 - Time * 100) % 256;
}

if (cnt >= Frequency)
{
cnt = 0;
//sec++;
// Tube_Display(sec);
TubeScan();
KeyScan();
}
}
//數碼管顯示函數
void TubeDisplay(ulint nom)
{
uchar m = 2;//小數部分位數
uchar i;//傳輸索引
//秒速達到上限清零
if (nom > pow(10,TubeNumber - m))nom = 0;
//分別傳輸小數部分和整數部分
for(i=0; i<m; i++)
LED_Buff[i] = LED_Number[nom/pow(10,i)%10];
for(i=0; i<(TubeNumber - m); i++)
LED_Buff[i+m] = LED_Number[nom/pow(10,i)%10];
//點亮小數點
LED_Buff[m] &= 0x7f;
}
//平方運算函數
ulint pow(x,y)//x為底,為冪
{
ulint p,i = 1;
//平方運算
for(i=1; i<=y; i++)
p*=x;
//輸出結果
return p;
}
//數碼管動態函數
void TubeScan()
{
static uchar i = 0;//動態掃描索引
//關閉所有段選位,數碼管消隱
P0 = 0xff;
//for (i=0; i < Tube_number; i++)
P1 = (P1 & 0xf8) | i;//位選索引賦值到P1口低3位
P0 = LED_Buff[i];//緩沖區中的索引位置數據傳輸到P0口
if (++i >= TubeNumber)i=0;//索引遞增循環,遍歷整個緩沖區
}
//矩陣按鍵動作函數
void KeyAction(uchar keycode)
{
static ulint result;
ulint nom = 0;
//輸入數字0~9
if ((keycode >= 0x30) && (keycode <= 39))
{
nom = (nom*10) + (keycode - 0x30);//十進制整體左移,新數進入各位
TubeDisplay(nom);
}
//輸入方向鍵
if ((keycode >= 0x25) && (keycode <= 28))
switch (keycode)
{
case 0x26:result += nom; nom = 0; TubeDisplay(result);
case 0x28:result -= nom; nom = 0; TubeDisplay(result);
case 0x25:result = 1; result *= nom; nom = 0; TubeDisplay(result);
case 0x27:result = 1; result /= nom; nom = 0; TubeDisplay(result);
}
else if (keycode == 0x0d)TubeDisplay(result);//輸入回車鍵,輸出最終結果
else if (keycode == 0x1b)//輸入ESC鍵,清零
{
nom = result = 0;
TubeDisplay(nom);
}
}
//矩陣按鍵驅動函數
void KeyDriver()
{
uchar l,c;
static uchar backup[KeyLine][KeyColumn] = {(1,1,1,1),(1,1,1,1),(1,1,1,1),(1,1,1,1)};//按鍵值備份,保存前一次值
for(l=0; l<KeyLine; l++)
{
for(c=0; c<KeyColumn; c++)
{
if (backup[l][c] != StaFlag[l][c])
{//檢測按鍵動作
if (backup[l][c] == 1)//按鍵按下時執行
KeyAction(KeyCodeMap[l][c]);//調用動作函數
backup[l][c] = StaFlag[l][c];//刷新前一次備份值
}
}
}
}
//矩陣按鍵掃描函數
void KeyScan()
{
uchar l = 0;//矩陣按鍵掃描輸出索引
uchar c = 0;//矩陣按鍵掃描列索引
uchar keybuff [KeyLine][KeyColumn] = {(0xff,0xff,0xff,0xff),(0xff,0xff,0xff,0xff),
(0xff,0xff,0xff,0xff),(0xff,0xff,0xff,0xff)};//矩陣按鍵掃描緩沖區
//將一行的四個按鍵移入緩沖區
for(l=0; l<KeyColumn; l++)
keybuff [l][c] = ((0xfe | (P2 >> (4 + l)) & 0x01));
//按鍵消抖
for(l=0; l <KeyLine; l++)
{
if((keybuff [l][c] & 0x0f) == 0x00)//連續4次掃描都為0,判斷4*4ms內都是按下狀態,可認為按鍵已穩定按下
StaFlag[l][c] = 0;
else if ((keybuff [l][c] & 0x0f) == 0x0f)//連續4次掃描都為1,判斷4*4ms內都是彈起狀態,可認為按鍵已穩定彈起
StaFlag[l][c] = 1;
}
for(c=0; c <KeyColumn; c++)
{
switch (c) // 根據索引,釋放當前輸出腳 拉低下次的根據索引
{
case 0: KEY_OUT_4 = 1; KEY_OUT_1 = 0; break;
case 1: KEY_OUT_1 = 1; KEY_OUT_2 = 0; break;
case 2: KEY_OUT_2 = 1; KEY_OUT_3 = 0; break;
case 3: KEY_OUT_3 = 1; KEY_OUT_4 = 0; break;
default: break;
}
}
}

㈡ 51單片機修改4位9999倒計時,程序如下,哪裡出了錯,為什麼不能正常顯示

void clock()
{
adj_sec++; //秒調整變數自增
if(adj_sec > SECOND) //判斷1秒鍾是否到
{
adj_sec = 0; //到了1秒鍾,秒調整變數清零
sec--; //秒鍾變數減1
if(sec == 255) //判斷99秒是否到完
{
sec = 99; //到完99秒,秒鍾變99秒
min--; //分鍾變數減1
if(min == 255) //判斷99倒計時完
{
min = 99; //倒計時完99分鍾中,分鍾恢復99
}
……
255,就是-1的補碼

㈢ C51單片機:用數碼管顯示0到999的值。求c語言程序和原理圖

#include<reg51.h>

#define uchar unsigned char

uchar temp;

int key1,key,disbuf;// 此表為 LED 的字模 0 1 2 3 4 5 6 7 8 9 a b c d e f

unsigned char code LED7Code[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};

unsigned char ledx[8];

bit s0,s1;

void delay(uchar z)

{

uchar i,j;

for(i=0;i<120;i++)

for(j=0;j<z;j++);

}

void scan() //要是按鍵了,掃描鍵盤編碼值

{

P1=0xF0;

delay(1);

temp=P1;

switch(temp)

{

case 0xe0: key1=0;

break;

case 0xd0: key1=1;

break;

case 0xb0: key1=2;

break;

case 0x70: key1=3;

break;

}

P1=0x0f;

delay(1);

temp=P1;

switch(temp)

{

case 0x0E: key=key1+0;

break;

case 0x0D: key=key1+4;

break;

case 0x0B: key=key1+8;

break;

case 0x07: key=key1+12;

break;

default : key=-1;

}

if((key1+1)&&(key+1)) disbuf=key;

}

void ejjc() //判斷是否按鍵

{

P1=0xF0;

if(P1!=0xF0) { scan();s0=1;}

else { s0=0; s1=1;}

}

void main()

{

uchar i;

while(1)

{

ejjc();

if(s0==1 && s1==1)

{

s0=0;s1=0;

for(i=0;i<8;i++)

{ ledx[i]=ledx[i+1]; ledx[8]=disbuf; }

}

P0=0xff;

P2=LED7Code[ledx[0]];

P0=0xfe;

delay(5);

P0=0xff;

P2=LED7Code[ledx[1]];

P0=0xfd;

delay(5);

P0=0xff;

P2=LED7Code[ledx[2]];

P0=0xfb;

delay(5);

P0=0xff;

P2=LED7Code[ledx[3]];

P0=0xf7;

delay(5);

P0=0xff;

P2=LED7Code[ledx[4]];

P0=0xef;

delay(5);

P0=0xff;

P2=LED7Code[ledx[5]];

P0=0xdf;

delay(5);

P0=0xff;

P2=LED7Code[ledx[6]];

P0=0xbf;

delay(5);

P0=0xff;

P2=LED7Code[ledx[7]];

P0=0x7f;

delay(5);

}

}

㈣ 求AT89S52單片機 9999秒倒計時 asm程序

用AT89S52單片機 做9999秒倒計時,應該四位數碼管顯示,用定時器定時得到1秒,就可以計秒了。 asm程序是匯編程序,不是組合程序。

㈤ 單片機數碼管顯示0到999c語言程序怎麼編

#include<reg51.h>

unsigned char xs_d[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

unsigned int time=0,s,sz;delay(unsigned int k)
{

unsigned int i,j;

for(i=0;i<k;i++)

for(j=0;j<125;j++);

}INT_0()interrupt 0

{ delay(10);

if(INT0==0){sz++;<br> if(sz>2){sz=0;}

}
}

void T0_int()interrupt 1
{

TH0=(65535-50000)/256;//設置初值

TL0=(65535-50000)%256;

s++;
if(s>20){s=0;<br> if(sz==1)time++;<br> if(time>999){time=0;}

if(sz==0){time=0;//清零<br> }



(5)單片機數碼管顯示9999擴展閱讀:

運算器由運算部件——算術邏輯單元(Arithmetic & Logical Unit,簡稱ALU)、累加器和寄存器等幾部分組成。

ALU的作用是把傳來的數據進行算術或邏輯運算,輸入來源為兩個8位數據,分別來自累加器和數據寄存器。ALU能完成對這兩個數據進行加、減、與、或、比較大小等操作,最後將結果存入累加器。

運算器有兩個功能:

(1) 執行各種算術運算。

(2) 執行各種邏輯運算,並進行邏輯測試,如零值測試或兩個值的比較。

運算器所執行全部操作都是由控制器發出的控制信號來指揮的,並且,一個算術操作產生一個運算結果,一個邏輯操作產生一個判決。



㈥ 單片機,使用匯編語言使led數碼管每隔1秒輪流顯示數字0000-9999,這個怎麼樣做呀

這是四位數的秒計數器,用四位一體共陰數碼管顯示,P0口輸出段碼,P2口輸出位碼。用定時器定時器50ms,採用中斷方式,中斷20次為1秒,顯示數字加1。

閱讀全文

與單片機數碼管顯示9999相關的資料

熱點內容
中國台灣一部和蛇有關的電影 瀏覽:834
韓國愛情片中文 瀏覽:352
輪理推理片 瀏覽:313
韓國電影叫個什麼同 瀏覽:670
精選珍藏txt壓縮包 瀏覽:550
現代建國小說 瀏覽:80
穿越到各種影視小說 瀏覽:965
愛情電影網站apdy 瀏覽:716
用什麼看剛出的槍版電影 瀏覽:364
有一本小說女主叫蘇晚 瀏覽:551
韓國大尺度來電 瀏覽:14
朴銀狐妻子的職業電影 瀏覽:821
國產強奸的大尺度電影有哪些 瀏覽:59
歐美愛情電影船戲 瀏覽:924
拍攝指南小說txt百度下載 瀏覽:576
大美記者電視劇 瀏覽:484
男朋友在北京當快遞員的電影 瀏覽:358
電影中有美娜名字的電影叫什麼 瀏覽:833
美劇五十黑2簡介 瀏覽:43
可以在線看的小網址 瀏覽:139