1. 用單片機控制2位數碼管,不用鎖存器能顯示動態掃描碼比如說從0到99。如果能程序怎麼寫
編寫一個程序來使用單片機控制2位數碼管顯示動態掃描碼,比如從0到99,確實不需要使用鎖存器。下面是一個簡單的示常式序:
我們首先定義一個數組來存儲每個數字的段碼:
char code anxuan[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}
接下來定義一些變數:
char i, j, x; int y;
定義一個函數用於延時:
void yanshi(char shu) { while(shu--) for(x=0; x<110; x++); }
在主函數中,我們設置延時變數:
void main() { y = 30000; while(y--) { for(i = 0; i < 9; i++) { P21 = 1; //如果你用的數碼管是共陽極的話,就置1. P0 = anxuan[i]; yanshi(5); P0 = 0x00; } for(j = 0; j < 9; j++) { P20 = 1; P0 = anxuan[j]; yanshi(5); P0 = 0x00; } }}
這個程序使用了動態掃描技術,通過控制P21和P20引腳的狀態來切換數碼管的顯示。每個數字在P0引腳上顯示5毫秒。
你可以根據自己的需求調整延時時間和顯示的數字范圍。希望這個示例對你有所幫助。
請記住,不同的數碼管類型(共陽極或共陰極)需要調整相應的引腳設置。如果使用共陰極數碼管,P21和P20應該設置為低電平。
如果你對這個方法感興趣,不妨嘗試編寫更多的示常式序,以加深對單片機控制數碼管的理解。
2. 求用一片74hc595加單片機驅動一個4位數碼管的動態掃描程序!!!
下面是595的程序,給你參考一下,根據這個程序來寫數碼管顯示就很簡單了。
#define u8 unsigned char
#define u16 unsigned int
sbit MR=P1^6; //寄存器清0,避免數據錯位
sbit RCK=P1^5; //並行輸出時鍾
sbit DS=P1^4; //數據線
sbit CLK=P1^3; //移位輸入時鍾
void writ_595(u8 dat)
{
u8 i;
MR=0; //寄存器清0,避免數據錯位
MR=1;
for(i=0;i<8;i++)
{
CLK=0;
if((dat&0x80) == 0x80)
DS = 1; //串列數據輸出
else DS = 0;
CLK=1; //移位輸入時鍾,上升沿輸入
dat<<=1;
}
RCK=0; //並行輸出時鍾
RCK=1;
} 該子函數可以直接調用,比如writ_595(0xfe);Q0-Q7腳則輸出對應的二進制碼
3. 求用52單片機實驗板實現4*4鍵盤及數碼管動態掃描顯示的程序
#include <reg52.h>
#define uchar unsigned char
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
sbit la=P2^6;
sbit wela=P2^7;
uchar keyscan();
uchar num,temp,num1;
void delay(uchar z)
{
int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
num=17;
la=1;
P0=0;
la=0;
wela=1;
P0=0xc0;
wela=0;
while(1)//每次按下都是 所以while循環
{
num1=keyscan();
la=1;
P0=table[num1-1];
la=0;
}
}
uchar keyscan()
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0); //必須用if啊
{
delay(5);//消抖再判斷
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0) //必須用if啊
{
temp=P3;
switch(temp)
{
case 0xee:num=1;break;
case 0xde:num=2;break;
case 0xbe:num=3;break;
case 0x7e:num=4;break;
}
while(temp!=0xf0)// 鬆手檢測 鬆手數字才變化 必須用while 不鬆手不顯示 不鬆手下一排鍵盤沒用 一直在while內循環 放在第二個if內
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0);
{
delay(5);//消抖再判斷
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0);
{
temp=P3;
switch(temp)
{
case 0xed:num=5;break;
case 0xdd:num=6;break;
case 0xbd:num=7;break;
case 0x7d:num=8;break;
}
while(temp!=0xf0)//鬆手檢測 鬆手數字才變化 必須用while
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0);
{
delay(5);//消抖再判斷
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0);
{
temp=P3;
switch(temp)
{
case 0xeb:num=9;break;
case 0xdb:num=10;break;
case 0xbb:num=11;break;
case 0x7b:num=12;break;
}
while(temp!=0xf0)//鬆手檢測 鬆手數字才變化 必須用while
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0);
{
delay(5);//消抖再判斷
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0);
{
temp=P3;
switch(temp)
{
case 0xe7:num=13;break;
case 0xd7:num=14;break;
case 0xb7:num=15;break;
case 0x77:num=16;break;
}
while(temp!=0xf0)//鬆手檢測 鬆手數字才變化 必須用while
{
temp=P3;
temp=temp&0xf0;
}
}
}
return num;
}
4. 單片機矩陣鍵盤按鍵行列逐級掃描法
unsigned char KeyScan(void) //鍵盤掃描函數,使用行列逐級掃描法{ unsigned char Val; KeyPort=0xf0;//這句其實就是整體看看是否有鍵按下,四行全送0,有鍵按下,高四位肯定不為全1 if(KeyPort!=0xf0)//表示有按鍵按下 { DelayMs(10); //去抖 if(KeyPort!=0xf0) { //表示有按鍵按下 KeyPort=0xfe; //檢測第一行 if(KeyPort!=0xfe) { Val=KeyPort&0xf0; Val+=0x0e; //相當於檢測到第一行有鍵按下,鍵值=列(高四位)+行(低四位) while(KeyPort!=0xfe); DelayMs(10); //去抖 while(KeyPort!=0xfe); return Val; }
5. 單片機2×2按鍵掃描程序
單片機2×2按鍵掃描程序的實現方法如下:
以上代碼實現了一個簡單的2×2矩陣鍵盤掃描程序,通過掃描行線和列線的狀態來確定哪個按鍵被按下,並返回相應的按鍵值。