A. proteus鍵盤輸入實現四位數碼管顯示的c語言代碼怎麼寫
#include<reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};//0-f-最後一個空
ucharj=1;
sbitp37=P3^7;
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voiddisplay(ucharshu)
{
P1=table[shu];
delay(5);
}
ucharkeyscan()
{
uchartemp,num;
P2=0xfe;
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{
p37=0;
delay(5);
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case0xee:num=1;break;
case0xde:num=2;break;
case0xbe:num=3;break;
default:break;
}
while(temp!=0xf0)//**********鬆手檢測鬆手後顯示
{
j=0;
temp=P2;
temp=temp&0xf0;
}
}
}p37=1;
P2=0xfd;
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{
p37=0;
delay(5);
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case0xed:num=4;break;
case0xdd:num=5;break;
case0xbd:num=6;break;
}
while(temp!=0xf0)
{
j=0;
temp=P2;
temp=temp&0xf0;
}
}
}p37=1;
P2=0xfb;
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{
p37=0;
delay(5);
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case0xeb:num=7;break;
case0xdb:num=8;break;
case0xbb:num=9;break;
}
while(temp!=0xf0)
{
j=0;
temp=P2;
temp=temp&0xf0;
}
}
}p37=1;
P2=0xf7;
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{
p37=0;
delay(5);
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case0xe7:num=16;break;
case0xd7:num=0;break;
case0xb7:num=16;break;
}
while(temp!=0xf0)
{
j=0;
temp=P2;
temp=temp&0xf0;
}
}
}p37=1;
//if(j==1)num=16;
returnnum;
}
voidmain()
{
p37=1;
while(1)
{
display(keyscan());
//display(7);
}
}
我寫的簡單鍵盤程序並有數碼管顯示模擬結果如圖所示你可以按照圖示實驗有什麼問題可以共同討論
B. 運用51單片機實現4位8段LED數碼管的動態數字顯示,寫出C語言程序
動態顯示的是有固定格式的,賦值,開顯示,延時,關顯示,假設p0口接數據顯示位,p2口低4位接片選,
p2=tab[1];
//賦值
p3_0=0;
//開第一位顯示
for(i=0;i<200:i++);//延時
p3_0=1;
//關第一位顯示
p2=tab[2];
p3_1=0;
//開第二位顯示
for(i=0;i<200:i++);
p3_1=1;
這個程序就是讓兩個數碼管分別顯示1和2,注意程序開頭包含頭文件regx52.h,如果是包含reg52.h編譯不了的
C. 單片機實現4位一體數碼管顯示0000—FFFF的16進制(C語言編程)
/*四個數碼管的動態顯示*/
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit = P2^6;
sbit we = P2^7;
uchar code table[] = {
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uint a;
//---------------------------------------------
void delayms(uint xms)
{
uint i, j;
for(i=xms;i>0;i--) for(j=110;j>0;j--);
}
//---------------------------------------------
void disp()
{
we = 1; P0 = 0xf7; we = 0; //鎖存開啟 個位 鎖存關閉
P0 = table[a % 256 % 16]; delayms(5); //輸出個位數
we = 1; P0 = 0xff; we = 0; //鎖存開啟 消隱 鎖存關閉
we = 1; P0 = 0xfb; we = 0; //鎖存開啟 十位 鎖存關閉
P0 = table[a % 256 / 16]; delayms(5); //輸出十位數
we = 1; P0 = 0xff; we = 0; //鎖存開啟 消隱 鎖存關閉
we = 1; P0 = 0xfd; we = 0; //鎖存開啟 百位 鎖存關閉
P0 = table[a / 256 % 16]; delayms(5); //輸出百位數
we = 1; P0 = 0xff; we = 0; //鎖存開啟 消隱 鎖存關閉
we = 1; P0 = 0xfe; we = 0; //鎖存開啟 千位 鎖存關閉
P0 = table[a / 256 / 16]; delayms(5); //輸出千位數
we = 1; P0 = 0xff; we = 0; //鎖存開啟 消隱 鎖存關閉
}
//---------------------------------------------
void main()
{
char i;
a = 0;
while(1) {
for (i = 0; i < 20; i++) disp();
a++;
}
}
//---------------------------------------------
上述的《千百十個》四個位,實際上,顯示的是16進制數。
程序,是借用了樓主的《單個顯示程序》,但是,和樓主的電路,並不配套。
樓主的電路,並沒有鎖存器。
而程序中,卻是使用鎖存器的編程思路。
未必好用,試試看吧。
D. 51單片機的4位數碼管做簡易秒錶C語言程序
我寫了個六位數碼管的程序,放到這里讓你參考一下,希望對你有用!
/*******************************************************************
數碼管時鍾秒錶篇
功能簡介:該程序有兩個功能:時鍾,秒錶。key1,key2和key3鍵用來調節
時鍾,根據LED的亮閃狀態調節時鍾(當八個LED全亮時為時鍾顯示狀態,第一
個LED亮時為調節小時狀態,第二個LED亮時為調節分鍾狀態,第三個LED亮時為
調節秒鍾狀態),key4鍵為秒錶功能鍵。
實施步驟:第一步:開啟定時器,完成數碼管時鍾走動功能;第二步:完成
數碼管時鍾調節功能;第三步:完成數碼管秒錶顯示功能。
操作提示:功能鍵有四個,第二行第以列按鍵為調節鍵,第二行第二列按鍵
為增加數據鍵,第二行第三列按鍵為減少鍵,第二行第四列按鍵為秒錶功能鍵。
********************************************************************
********************************************************************/
#include <reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit beep=P2^3;
sbit la=P2^6;
sbit wela=P2^7;
uchar code table1[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //數碼管位選編碼
uchar code table2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,
0x79,0x71,0x00};
uchar temp; //temp為按鍵變數
int light,flag; //flag用來控制數碼管顯示的狀態(顯示時鍾或者顯示秒錶),light用來控制時鍾和秒錶的led顯示
uchar shi2,ge2,shi1,ge1; //這四個變數用來分離出實參的十位和個位
uchar num,num1,num2,num3; //num,num1用來計數,num2用來控制調節的時分秒,num3用來改變秒錶狀態下的顯示狀態
int miao,fen,shi; //時鍾變數
uchar mfen,mmiao,mmmiao; //秒錶變數
void delay(uint z)
{
uint i,j;
for(i=0;i<z;i++)
for(j=0;j<110;j++);
}
void timeinit()
{
TMOD=0x11;
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
TH1=(65536-4608)/256;
TL1=(65536-4608)%256;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=0;
}
void timedisplay0() interrupt 1
{
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
num++;
if(num==20)
{
num=0;
miao++; //開啟時鍾功能
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
shi=0;
}
}
}
}
void timedisplay1() interrupt 3
{
TH1=(65536-4608)/256;
TL1=(65536-4608)%256;
num1++;
if(num1==2)
{
num1=0;
mmmiao++;
if(mmmiao==100) //開啟秒錶功能
{
mmmiao=0;
mmiao++;
if(mmiao==60)
{
mmiao=0;
mfen++;
if(mfen==60)
mfen=0;
}
}
}
}
void display(uchar add,uchar date) //數碼管顯示信息函數(帶有小數點)
{
shi2=date/10;
ge2=date%10;
P0=0xff;
wela=1;
P0=table1[add];
wela=0;
P0=0;
la=1;
P0=table2[shi2];
la=0;
delay(1);
P0=0xff;
wela=1;
P0=table1[add+1];
wela=0;
P0=0;
la=1;
P0=table2[ge2]|0x80;
la=0;
delay(1);
}
void display1(uchar add,uchar date) //數碼管顯示數據(不帶有小數點)
{
shi1=date/10;
ge1=date%10;
P0=0xff;
wela=1;
P0=table1[add];
wela=0;
P0=0;
la=1;
P0=table2[shi1];
la=0;
delay(1);
P0=0xff;
wela=1;
P0=table1[add+1];
wela=0;
P0=0;
la=1;
P0=table2[ge1];
la=0;
delay(1);
}
void keyscan()
{
P3=0xfd;
temp=P3; //第二行功能鍵
if(temp!=0xfd)
{
delay(5);
if(temp!=0xfd)
{
beep=0;
switch(temp)
{
case 0xed: num2++; //第一個按鍵用來控制調節時,分,秒
TR0=0;
light=1;
if(num2==4)
{
num2=0;
light=0;
TR0=1;
}
break;
case 0xdd: if(num2==1) //第二鍵用來增加數據
{
shi++;
if(shi==24)
shi=0;
}
if(num2==2)
{
fen++;
if(fen==60)
fen=0;
}
if(num2==3)
{
miao++;
if(miao==60)
miao=0;
}
break;
case 0xbd: if(num2==1) //第三個鍵用來減小數據
{
shi--;
if(shi==-1)
shi=23;
}
if(num2==2)
{
fen--;
if(fen==-1)
fen=59;
}
if(num2==3)
{
miao--;
if(miao==-1)
miao=59;
}
break;
case 0x7d: flag=1; //第四個鍵用來開啟秒錶
num3++;
TR1=1;
if(num3==1)
mfen=mmiao=mmiao=0; //清除上次殘留數據
if(num3==2)
TR1=0; //暫停秒錶
if(num3==3)
{
mfen=mmiao=mmmiao=0; //秒錶清零
TR1=0;
}
if(num3==4) //重新開啟秒錶
TR1=1;
if(num3==5) //暫停秒錶
TR1=0;
if(num3==6) //切換為顯示時鍾狀態
{
flag=0;
num3=0;
}
break;
}
while(temp!=0xfd)
{
temp=P3;
}
beep=1;
}
}
}
int main()
{
timeinit();
beep=1;
while(1)
{
keyscan();
if(light==0)
{
if(miao%2==0) //當數碼管顯示時鍾狀態時,八個led將以亮一秒滅一秒的狀態循環下去
P1=0;
else
P1=0xff;
}
else
{
if(num2==1)
P1=0xfe;
if(num2==2)
P1=0xfd;
if(num2==3)
P1=0xfb;
}
if(flag==0) //顯示時鍾
{
display(1,shi);
display(3,fen);
display1(5,miao);
}
else //顯示秒錶
{
display(1,mfen);
display(3,mmiao);
display1(5,mmmiao);
}
}
return 0;
}
E. 四位一體共陽級數碼管動態顯示c語言編程
//滿意請採納
//這是一個四位數碼管動態顯示c語言程序,每隔一秒加一,直至加到9999為止
//使用時需採用鎖存器
#include<reg52.h>
#include"stdio.h"
unsignedcharcodeLED[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsignedcharLEDbuff[]={0xff,0xff,0xff,0xff};
//定義數碼管的位選段
sbitSEG_bit_1=P0^1;
sbitSEG_bit_2=P0^2;
sbitSEG_bit_3=P0^3;
sbitSEG_bit_4=P0^4;
unsignedintcnt=0;
unsignedintsec=0;
unsignedintmini=0;
unsignedinthour=0;
unsignedchari=0;
/*voiddelay(unsignedintz)
{
unsignedintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
*/
voidinterrupttimer0()interrupt1/*設置中斷函數*/
{
TH0=0xfc;
TL0=0x18;
cnt++;
//P1=0x80;
//delay(1);
switch(i)
{
case0:SEG_bit_1=0;SEG_bit_4=1;P1=LEDbuff[0];i++;break;
case1:SEG_bit_4=0;SEG_bit_3=1;P1=LEDbuff[1];i++;break;
case2:SEG_bit_3=0;SEG_bit_2=1;P1=LEDbuff[2]&;i++;break;
case3:SEG_bit_2=0;SEG_bit_1=1;P1=LEDbuff[3];i=0;break;
default:break;
}
}
/************************************************
voidserial_init()
{
//TMOD=0x20;//定時器T/C1工作方式2
SCON=0x50;//串口工作方式1,允許串口接收(SCON=0x40時禁止串口接收)
TH1=0xF3;//定時器初值高8位設置
TL1=0xF3;//定時器初值低8位設置
PCON=0x80;//波特率倍頻(屏蔽本句波特率為2400)
TR1=1;//定時器啟動
}
**********************************************/
voidmain()
{
//serial_init();//串口初始化
//TMOD=0x21;/*設置定時器*/
TMOD=0x01;
TH0=0xfc;
TL0=0x18;
TR0=1;
EA=1;/*設置中斷*/
ET0=1;
while(1)
{
if(0==TF0)
{
if(cnt>=1000)
{
cnt=0;
sec++;
if(sec>=60){
sec=0;mini++;
if(mini>=60){
mini=0;hour++;
if(hour>=24)hour=0;
}
}
LEDbuff[0]=LED[sec%10];//*設置數碼管顯示位*/
LEDbuff[1]=LED[sec/10%10];
LEDbuff[2]=LED[mini%10];
LEDbuff[3]=LED[mini/10%10];
//TI=1;//使用printf函數前須先將發送標志位TI置1
//printf("%4d%x,%x%x ",sec,LEDbuff[0],LEDbuff[1],LEDbuff[2]);
//TI=0;
}
}
}
}
F. 共陰極數碼管四位0到999的循環在變為0怎麼用c語言編寫啊
#include<reg52.h>
#defineu16unsignedint
#defineu8unsignedchar/*********************************************************/
u8ds[4];//數碼管顯示緩存
codeu8w[]={~0x01,~0x02,~0x04,~0x08}; //位碼
codeu8d[]={~0xc0,~0xf9,~0xa4,~0xb0,~0x99,~0x92,~0x82,~0xf8,~0x80,~0x90,~0xff,};//斷碼
voiddispaly(){//顯示函數
staticu8a;
if(++a>3)a=0;
P0=0x00;
P2=w[a];
P0=d[ds[a]];
}
/****************************************/
voidinit() //初始化函數
{
TMOD=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
EA=1;
ET0=1;
}
u16count=0;
u16js=0;
/***********************************/
voidmain()//主函數
{
init();//系統初始化
TR0=1;//定時器開始計時
while(1){
ds[0]=10;
ds[1]=count/100%10;//計數送到數碼管顯示緩存中
ds[2]=count/10%10;
ds[3]=count%10;
}
}
/****************************/
voidtimer0()interrupt1//1ms定時器
{
TH0=(65536-1000)/256;//重載初值
TL0=(65536-1000)%256;
dispaly();//顯示
if(++js>=1000){1秒加一
js=0;
if(++count>999)count=0;
}
}
G. 四位共陽極數碼管如何設置位選c語言編碼
如果是AT89***或者STC**單片機,如圖依圖完整的控制代碼沒時間弄你可以網路,資源多的是,如果只想知道數碼位的控制方法可以說一下,根據你圖示,只要在三極體的基極加上低電平就可以給相應的數碼位加電,簡單代碼如下:
1.可以分別定義控制埠
sbti WE1=P1^0;//這里假定用P1口控制數碼位
sbti WE2=P1^1;
sbti WE3=P1^2;
sbti WE4=P1^3;
進行上述定義後,在程序中只要有代碼WE1=0;則第一位數碼就通電了,此後會根據段碼數據顯示相應的數字。
2.如果I/O口資源充足,也可以用一個完整I/O口來控制,以P1為例,只要將WE1--4引線分別於P1.0--3連接,在程序中只要有代碼P1=0xfe,就可以點亮WE1位,同理,代碼0xfd;0xfb;0xf7
可以分別點亮WE2,WE3,WE4位。
H. 四位數碼管單片機AT89C52求c語言編程
單片機是AT89C52,這是要模擬吧,那就先畫出模擬圖,確定什麼數碼管,才能寫程序。下圖是用四位一體的共陰數碼管畫的模擬圖,P0口輸出段碼,P2輸出位碼。