『壹』 一段數碼管動態顯示一行六位數字的程序,求解析所有代碼含義。越詳細越好
;這個程序的基本流程是:
;1.把content中的數字對應的斷碼找出,並依次存放到LEDBuf中
;2.依次送LEDBuf中的斷碼到LED上,LED顯示對應字元
OUTBIT equ 08002h ;將位碼送至此地址,位碼表示顯示哪一位LED管
OUTSEG equ 08004h ;將斷碼送至此地址,斷碼表示在指定的LED管上顯示什麼字元
data segment
Content db 1,2,3,0dh,0eh,0fh ;要顯示的數字
LEDBuf db 6 p(?) ;要顯示的數字對應的斷碼
;LEDMAP給出的是斷碼表,表示16進制數到斷碼的映射。總共16個,分別表示0-f。
;比如第一個3fh就是0的斷碼,斷碼送到LED中,LED會自動顯示0。
LEDMAP:
db 3fh,06h,5bh,4fh,66h,6dh,7dh,,07h
db 7fh,6fh,77h,7ch,39h,5eh, 79h,71h
data ends
code segment
assume cs:code, ds:data
;Delay的目的就是為了讓LED燈上的內容停留,以便看清
Delay proc
push cx
mov cx,100h
loop $ ;這里的循環目的是暫停一段時間,讓LED上的數字停留,以便人看清
pop cx
ret
Delay endp
;DisplayLED做的事:把LEDbuf中內容全部顯示到LED燈上。LEDbuf中6個斷碼,對應6個LED燈。
DisplayLED proc near
mov bx, offset LEDBuf
mov cx, 6 ;總共顯示6個斷碼
mov ah, 00100000b ;位碼,00100000b中1的位置指示了要顯示的數位,當前是1在左起第六個,也就是顯示6號LED燈
;後面有shr指令會將這個00100000b右移,這樣變成00010000,顯示5號LED,以此類推。
DLoop: mov dx, OUTBIT
mov al, 0
out dx,al ;將0送端位碼埠,表示當前不選中任何LED,即關閉LED
mov al, [bx] ;將LEDbuf中的一個斷碼,送入al
mov dx, OUTSEG
out dx,al ;送斷碼,表示要在LED中顯示這個字元
mov dx, OUTBIT
mov al, ah
out dx, al ;送位碼,表示要顯示哪一個LED燈
call Delay ;上面送完斷碼,位碼後,在相應的LED上就顯示相應的字元,Delay可以讓這個字元停留一段時間,視覺滯留。
shr ah, 1 ;位碼右移,顯示下一個LED
inc bx ;bx加1,那麼[bx]就指向LEDbuf中的下一個斷碼
loop Dloop ;這個Dloop循環把LEDbuf中的六個斷碼依次全部送到對應LED上顯示
ret
DisplayLED endp
;Start:程序的入口,從這里開始運行程序
Start proc near
mov ax, data
mov ds, ax
mov cx,6 ;顯示六個字元
mov ah,0 ;ah是content中的偏移量,從0->5,分別找出content中各個位元組內容
mov si,offset ledbuf
redo: mov bx,offset content
mov al,ah ;後面的xlat指令要使用al
xlat ;xlat的作用al<-[bx+al],也就是將bx這個地址(content)起的第al個位元組內容送到al中
mov bx,offset ledmap
xlat ;將此時al中的數字對應的斷碼找出,並放到al中。(數字a對應的斷碼就是ledmap起第a個位元組的數據)
mov [si],al ;將找到的斷碼放到LEDbuf中
inc si ;LEDbuf地址加1,存放下一個斷碼
inc ah ;找content中下一個數字的斷碼
loop redo ;整個redo循環做的事:把content中數字對應的斷碼放到LEDbuf中,循環最後結果是LEDbuf變成:06h,5bh,4fh,5eh,79h,71h
show: call displayled
jmp show ;在LED上一直顯示這6個字元
start endp
code ends
end start
『貳』 51單片機共陰數碼管利用靜態顯示,讓六個數碼管顯示1~6,程序怎麼寫
代碼如下:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define data P0 //P0口宏定義
/* ***************************************************** */
// 數碼管位選數組定義
/* ***************************************************** */
uchar code leddata[] =
{ 0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00, //熄滅
0x00 //自定義};
};
/* ***************************************************** */
// 位定義
/* ***************************************************** */
sbit = P1^7; //段選定義
sbit we = P1^6; //位選定義
/* ***************************************************** */
// 函數名稱:DelayMS()
// 函數功能:毫秒延時
// 入口參數:延時毫秒數(ValMS)
// 出口參數:無
/* ***************************************************** */
void delay(uint z)
{
uint x,y;
for(x = 0; x < z; x++)
for(y = 0; y < 113; y++);
}
/* ***************************************************** */
// 函數名稱:main()
// 函數功能:數碼管靜態顯示
// 入口參數:無
// 出口參數:無
/* ***************************************************** */
void main(void)
{
uchar i;
we = 1;//位選開
data = 0x00;//送入位選數據
we = 0;//位選關
while(1)
{
for(i = 0;i < 16 ; i++)
{
= 1; //段選開
data = leddata[i]; //送入段選數據
= 0; //段選關
delay(500); //延時
}
}
}
(2)六位數碼管程序擴展閱讀
對於74HC573,形象一點,我們只需要將其理解為一扇大門,只不過這扇大門是單向的,其中11引腳(LE)控制著門的開、關狀態,高電平為大門打開,低電平為大門關閉。
D0-D7為輸入,Q0-Q7為輸出,在LE = 1,即輸入高電平時,輸入端=輸出端,輸入是什麼,輸出也就原封不動的輸出;在LE = 0 ,即輸入高電平時,大門關閉,實現鎖存,不再輸出。了解之後,我們按照電路圖,來進行編程,代碼實現。
在實現數碼管的靜態顯示中,用到了兩個鎖存器,兩個I/O口,P1.6和P1.7,分別是位選和段選。
首先定義了個數碼管位選數組,也就是十六進制代碼,這便是後來數碼管顯示數字的核心,接著,用 sbit 定義了位選和段選埠,分別是 P1.6 和 P1.7 ,定義了一個延時函數,其實這一串代碼很有意思,開關開關思想,貫穿始終。
首先把位選打開,送入位選數據後,關閉鎖存器,實現鎖存,進入循環,隨之打開段選鎖存器,送入段選數據後,再次關閉段選。
接下來,這個延時操作對於實際看到數碼管的顯示效果特別重要,因為程序在段選後之後,會馬上消隱,顯示的時間之後幾個微秒,這顯然不太合理,需要在關閉段選後加上延時,這樣一來,才會讓每位數碼管亮度保持均勻。
『叄』 單片機6位數碼管計數器程序問題
#include<reg52.H>//STC頭文件
#defineucharunsignedchar
#defineuintunsignedint
#definetimewe3
sbitwe=P2^7;
sbit=P2^6;
unsignedlongtemp;
uintjsms=0;
ucharcodean[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
ucharcodewei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
voiddelay(uinta)//1ms延時程序(12MHz10倍於51單片機速度時)
{
uinti;
while(--a!=0)
{
for(i=0;i<600;i++);
}
}
uchardisbuf[6];
voiddisplay()
{ ucharcodewei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
staticuchara;
if(a>=6)a=0;
we=1;
P0=0xff;
we=0;
=1;
P0=an[disbuf[a]];
=0;
we=1;
P0=wei[a];
we=0;
a++;
}
/**********************************************/
/*主函數*/
/**********************************************/
voidmain(void)
{
temp=0;
while(1)
{
if(++jsms>=1000){
if(++temp==999999)
temp=0;
}
disbuf[0]=temp/100000;
disbuf[1]=temp%100000/10000;
disbuf[2]=temp%10000/1000;
disbuf[3]=temp%1000/100;
disbuf[4]=temp%100/10;
disbuf[5]=temp%10;
display();
delay(1);
}
}
『肆』 6位數碼管動態顯示,單片機直接片選,先顯示201903,再顯示abcdef,再顯示123456,用C語言編程
8位數碼管動態顯示,單片機直接片選,先顯示201903,再顯示abcdef,再顯示123456,用C語言編程 ,重復循環,模擬試試。
#include<reg51.h>
#define uchar unsigned char
// 此表為 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};
void delay(uchar z)
{
uchar i,j;
for(i=0;i<120;i++)
for(j=0;j<z;j++);
}
void main()
{
uchar k;
while(1)
{
for(k=0;k<50;k++)
{
P0=0xff;
P2=LED7Code[0];
P0=0xfe;
delay(5);
P0=0xff;
P2=LED7Code[0];
P0=0xfd;
delay(5);
P0=0xff;
P2=LED7Code[2];
P0=0xfb;
delay(5);
P0=0xff;
P2=LED7Code[0];
P0=0xf7;
delay(5);
P0=0xff;
P2=LED7Code[1];
P0=0xef;
delay(5);
P0=0xff;
P2=LED7Code[9];
P0=0xdf;
delay(5);
P0=0xff;
P2=LED7Code[0];
P0=0xbf;
delay(5);
P0=0xff;
P2=LED7Code[3];
P0=0x7f;
delay(5);
}
for(k=0;k<50;k++)
{
P0=0xff;
P2=LED7Code[0];
P0=0xfe;
delay(5);
P0=0xff;
P2=LED7Code[0];
P0=0xfd;
delay(5);
P0=0xff;
P2=LED7Code[10];
P0=0xfb;
delay(5);
P0=0xff;
P2=LED7Code[11];
P0=0xf7;
delay(5);
P0=0xff;
P2=LED7Code[12];
P0=0xef;
delay(5);
P0=0xff;
P2=LED7Code[13];
P0=0xdf;
delay(5);
P0=0xff;
P2=LED7Code[14];
P0=0xbf;
delay(5);
P0=0xff;
P2=LED7Code[15];
P0=0x7f;
delay(5);
}
for(k=0;k<50;k++)
{
P0=0xff;
P2=LED7Code[0];
P0=0xfe;
delay(5);
P0=0xff;
P2=LED7Code[0];
P0=0xfd;
delay(5);
P0=0xff;
P2=LED7Code[1];
P0=0xfb;
delay(5);
P0=0xff;
P2=LED7Code[2];
P0=0xf7;
delay(5);
P0=0xff;
P2=LED7Code[3];
P0=0xef;
delay(5);
P0=0xff;
P2=LED7Code[4];
P0=0xdf;
delay(5);
P0=0xff;
P2=LED7Code[5];
P0=0xbf;
delay(5);
P0=0xff;
P2=LED7Code[6];
P0=0x7f;
delay(5);
}
}
}
『伍』 單片機89c51一個6位LED數碼管顯示功能 程序,希望能准確點的程序,只顯示6位數字就好。
#include <reg51.h>
#include <intrins.h>
void delay(unsigned int i); //函數聲名
char DelayCNT;//定義變數
//此表為 LED 的字模, 共陰數碼管 0-9 -
unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //段碼控制
//此表為8個數碼管位選控制, 共陰數碼管 1-8個 -
unsigned char code dispbit[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F}; //位選控制 查表的方法控制
/************主函數**********************/
main()
{
unsigned int i,LedNumVal=1 ; //變數定義
unsigned int LedOut[10]; //變數定義
DelayCNT=0;
while(1)
{
if(++DelayCNT>=20) //控制數字變化速度
{
DelayCNT=0; //20個掃描周期清零一次
++LedNumVal; //每隔20個掃描周期加一次
}
LedOut[0]=Disp_Tab[LedNumVal%10000/1000];
LedOut[1]=Disp_Tab[LedNumVal%1000/100]|0x80;
LedOut[2]=Disp_Tab[LedNumVal%100/10];
LedOut[3]=Disp_Tab[LedNumVal%10];
LedOut[4]=Disp_Tab[LedNumVal%10000/1000]; //千位
LedOut[5]=Disp_Tab[LedNumVal%1000/100]|0x80; //百位帶小數點
LedOut[6]=Disp_Tab[LedNumVal%100/10]; //十位
LedOut[7]=Disp_Tab[LedNumVal%10]; //個位
for( i=0; i<9; i++)
{
P0 = LedOut[i];
P1 = dispbit[i]; //使用查表法進行位選
/* switch(i) //使用switch 語句控制位選
{
case 0:P1 = 0x7F; break;
case 1:P1 = 0xbF; break;
case 2:P1 = 0xdF; break;
case 3:P1 = 0xeF; break;
case 4:P1 = 0xf7; break;
case 5:P1 = 0xfb; break;
case 6:P1 = 0xfd; break;
case 7:P1 = 0xfe; break;
} */
delay(150); //掃描間隔時間 太長會數碼管會有閃爍感
}
}
}
void delay(unsigned int i)
{
char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}