Ⅰ 單片機按鍵控制數碼管顯示
你有原理圖沒?
設置三個標志位,全局變數,需要在倒計時中斷里改變狀態的。
程序流程是:
主程序流程:
上電初始化(設置LED狀態,設置定時器相關寄存器參數,設置三個標志位狀態)--->
死循環(判斷標志位是否容許按鍵有效,然後判斷是否有按鍵按下,轉入響應的子程序處理段)
定時器中斷任務:
判斷是否到15秒,到了就置位標志位。
Ⅱ 51單片機怎麼用按鍵控制一個數碼管,按一下顯示一個數字,順序顯示
1、首先,要把代碼寫好,點亮數碼管。
Ⅲ 能幫我編一個單片機第1個按鍵控制數碼管顯示1,第2個按鍵控制數碼管顯
參考一下這個模擬實例,16個按鍵,按鍵1 顯示1,---按鍵9顯示9,等等
下載 附件 模擬試試。
Ⅳ 匯編語言51單片機怎麼實現用KEY 1控制數碼管上顯示的數字加1 KEY2控制數碼管上顯示數字減1
原有key1為P3.4,添加個key2鍵為P3.5;
1、按你顯示程序的邏輯,對TAB修改如下:
TAB:DB 00H,3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H,00H
即數據的首尾為0(這是個標記而已),中間才是七段碼 0--F 的顯示數據;
2、對CK1、CK2鍵盤按下及松開程序做了修改;
3、顯示程序也進行了修改,唯獨延時程序不用修改;
代碼如下:
MAIN:
MOV DPTR,#TAB
MOV R4,#00H
MOV R5,#01H
CLR A
LCALL DISPLAY
LOOP:
LCALL KEYDOWN
LCALL DISPLAY
SJMP LOOP
KEYDOWN:
JB P3.4,CK11 ;key1沒有按下則轉到key2
LCALL DS1MS ;P3.4=0表示Key1按下
JB P3.4,CK11 ;key1還不能松開
MOV R5,#01H
INC R4;key1按下為加
RET
CK11:
JB P3.5,KEYDOWN ;key2沒有按下則轉到key1
LCALL DS1MS ;P3.5=0表示Key2按下
JB P3.4,KEYDOWN ;key2還不能松開
MOV R5,#10H
DEC R4;key2按下為減
RET
D1::
MOV R4,R5
DISPLAY:
MOV A,R4
MOVC A,@A+DPTR
JZ D1 //累加器(A)=0轉
MOV P0,A
SETB P2.6
CLR P2.6
MOV P0,#0FEH
SETB P2.7
CLR P2.7
LCALL DS1MS ;延時
LCALL KEYUP
RET
KEYUP:
JNB P3.4,KEYUP ;P3.4=0轉
JNB P3.5,KEYUP ;等待松開按鍵
LCALL DS1MS
JNB P3.4,KEYUP
JNB P3.5,KEYUP
RET
TAB:DB 00H,3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H,00H
Ⅳ 51單片機怎樣用鍵盤控制數碼管顯示
51單片機怎樣用鍵盤控制數碼管顯示的方法。
如下參考:
1.首先,編寫代碼並點亮數碼管。
Ⅵ 單片機按鍵控制數碼管顯示
實現方法有挺多種的,下面介紹一種:
1、按鍵子程序:
實現按第一個鍵使鍵值keyvalue=1,第二個鍵使鍵值keyvalue=2,第三個鍵使鍵值keyvalue=3
2、顯示子程序
定義3個位元組的顯示緩存,如dispbuf1,dispbuf2,dispbuf3
使dispbuf1的數字顯示在第一個數碼管上,dispbuf2的數字顯示在第2個數碼管上,dispbuf3的數字顯示在第3個數碼管上
3、主程序:
初始化按鍵次數keycount為0
檢測按鍵,任意一個鍵(比如說是第2個鍵)被按後,keycount
加1,並將keyvalue值(2)送給dispbuf1(則第一個數碼管將會顯示2),再有任意一個按鍵按下後,keycount
加1,並將keyvalue值送給dispbuf2,再有任意一個按鍵按下後,keycount
加1,並將keyvalue值送給dispbuf3
Ⅶ 單片機 按鍵(採用獨立式按鍵)按下一次,讓液晶第一位顯示的數碼加1,顯示範圍0~9
程序清單如下:
#include < reg51.h >// 51單片機頭文件
#define uchar unsigned char // 宏定義,用uchar替代無符號字元型
#define uint unsigned int // 宏定義,用uint 替代無符號整數型
sbit Key = P2 ^ 7;
uchar Count = 0;
uchar code DataChar[10] = // 定義數碼管的段碼 '0'~'9'、'-'、' ' 'P'
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
};//延時N毫秒
void DelayNms( uint N ) // 利用x、y作簡單的自減運算,消耗單片機指令周期,達到延時的目的
{
uint x,y;
for( x=N; x>0; x-- )
for( y=110; y>0; y-- );
}
//數碼管顯示 // 顯示方式為動態掃描,視覺暫留原理
void Display( uchar Num ) // *p指向Main函數中的數組ShowNum的首地址
{
P0 = DataChar[ Num ]; // 向P0賦段碼值
DelayNms(2); // 短暫的延時
P0 = 0x00; // 讓數碼管熄滅,否則會造成數字重疊
}
void main( void )
{
while(1)
{
if( Key == 0 )
{
DelayNms(30);
if( Key == 0 )
{
Count += 1;
Count = (Count>9)? 0 : Count;
}
while( !Key );
}
Display( Count );
}
}
Ⅷ 求救:c51單片機按鍵每按一次同時數碼管顯示數字加一
-
建立一個數組,用於存放 0-9的段碼。
int Shuzu[]={---------};
如果會用指針
int *P;
P=Shuzu; //指針指向數組!
用外部中斷,
每中斷一次,中斷服務程序將數組元素加一P0=Shuzu[ax++](或指針加一:P0=*P++)
以上假設P0口驅動數碼管!
至於數碼管使用的是共陽還是共陰,就把相對的數值存在數組中!
-
外部中斷0的中斷程序入口
void TI_0() interrupt 0
{
--------
}
都提示到這里了,下面自己該會吧?
如果是新手的新手---想要我幫你寫全部程序--
那至少你得把你單片機晶元型號說給我才能幫你!
還有數碼管是用單片機哪個IO口!
數碼管是怎麼連接的?(串/並)
Ⅸ 設計一個單片機輸入顯示系統,要求每按一下按鍵數碼管顯示數據加1(數碼管初始值為0,9加1 後顯示0)。
程序清單如下:
#include < reg51.h >// 51單片機頭文件
#define uchar unsigned char // 宏定義,用uchar替代無符號字元型
#define uint unsigned int // 宏定義,用uint 替代無符號整數型
sbit Key = P2 ^ 7;
uchar Count = 0;
uchar code DataChar[10] = // 定義數碼管的段碼 '0'~'9'、'-'、' ' 'P'
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
};//延時N毫秒
void DelayNms( uint N ) // 利用x、y作簡單的自減運算,消耗單片機指令周期,達到延時的目的
{
uint x,y;
for( x=N; x>0; x-- )
for( y=110; y>0; y-- );
}
//數碼管顯示 // 顯示方式為動態掃描,視覺暫留原理
void Display( uchar Num ) // *p指向Main函數中的數組ShowNum的首地址
{
P0 = DataChar[ Num ]; // 向P0賦段碼值
DelayNms(2); // 短暫的延時
P0 = 0x00; // 讓數碼管熄滅,否則會造成數字重疊
}
void main( void )
{
while(1)
{
if( Key == 0 )
{
DelayNms(30);
if( Key == 0 )
{
Count += 1;
Count = (Count>9)? 0 : Count;
}
while( !Key );
}
Display( Count );
}
}
(9)單片機按下1控制數碼管顯示1擴展閱讀
8051單片機具有如下功能:
8位CPU·4kbytes程序存儲器(ROM) (52為8K)
128bytes的數據存儲器(RAM) (52有256bytes的RAM)
32條I/O口線·111條指令,大部分為單位元組指令
21個專用寄存器
2個可編程定時/計數器·5個中斷源,2個優先順序(52有6個)
一個全雙工串列通信口
外部數據存儲器定址空間為64kB
外部程序存儲器定址空間為64kB
邏輯操作位定址功能·雙列直插40PinDIP封裝
單一+5V電源供電
CPU:由運算和控制邏輯組成,同時還包括中斷系統和部分外部特殊功能寄存器;
RAM:用以存放可以讀寫的數據,如運算的中間結果、最終結果以及欲顯示的數據;
ROM:用以存放程序、一些原始數據和表格;
I/O口:四個8位並行I/O口,既可用作輸入,也可用作輸出
T/C:兩個定時/記數器,既可以工作在定時模式,也可以工作在記數模式;
五個中斷源的中斷控制系統;
一個全雙工UART(通用非同步接收發送器)的串列I/O口,用於實現單片機之間或單片機與微機之間的串列通信;
片內振盪器和時鍾產生電路,石英晶體和微調電容需要外接。最佳振盪頻率為6M—12M。
Ⅹ 求51單片機的C程序,就是鍵盤控制這個一位七段數碼管,按鍵按1按下數碼管上能夠顯示1,按2就能從1變到2。
51單片機的C程序,4*4鍵盤控制這個八位七段數碼管。可以參考一下
#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);
}
}