當前位置:首頁 » 編程語言 » 數碼管動態顯示程序c語言

數碼管動態顯示程序c語言

發布時間: 2024-09-29 07:34:57

『壹』 求用c語言寫的八位數碼管動態顯示程序,P0控制段,P2控制位。

#include"reg51.h"
#include "intrins.h" //_nop_();延老拿時函數用
#define uchar unsigned char
#define uint unsigned int
#define SEG_OUT P0 //段碼輸出口
#define BIT_OUT P2 //掃描口
sbit dot=P2^7; //LED小數點控制
uchar code tab[12]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xbf};
/* 共陽LED段碼表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-" */
uchar data dis_buff[8]={1,2,0,0,0,0}; //待顯示單元數據,共6個數據
unsigned long temp;
/*************1毫秒延時程序**************/
delay1ms(int t)
{
int i,j;
for(i=0;i<t;i++)
for(j=0;j<侍虧搭120;j++)
;
}
//
/***********LED顯空友示動態掃描函數**********/
display()
{
char k;
char m=0xfe;
for(k=0;k<8;k++) //8位LED掃描控制
{ BIT_OUT=0xff;
SEG_OUT=tab[dis_buff[k]];
BIT_OUT=m;
delay1ms(3);
m=(m<<1)|0x01;

}
dis_buff[0]=temp/10000000;

dis_buff[1]=(temp%10000000)/1000000;
dis_buff[2]=(temp%1000000)/100000;
dis_buff[3]=(temp%100000)/10000;
dis_buff[4]=(temp%10000)/1000;
dis_buff[5]=(temp%1000)/100;
dis_buff[6]=(temp%100)/10;
dis_buff[7]=temp%10;
}
/**************初始化程序****************/
void initiation()
{
TMOD=0x01;
TH0=-10000/256;
TL0=-10000%256; //10MS定時初值(T0計時用)
ET0=1;
TR0=1;
EA=1;
}

/****************定時器0中斷服務程序*****/
void init_timer0(void) interrupt 1
{
TH0=-10000/256;
TL0=-10000%256; //10MS定時初值(T0計時用)
t10ms++;
if(t10ms==100)
{
t10ms=0;
ts++;
if(ts==60)
{
temp++;
ts=0;
}
}
}
/****************主程序******************/
main()
{
initiation();
while(1)
{
display();
}
}
一秒加1

『貳』 51單片機顯示八位數碼管的C語言程序

1、最開始,我們虛桐先打開keil。

『叄』 四位一體共陽級數碼管動態顯示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;

}
}
}
}

『肆』 用4個動態數碼管顯示,實現0~9999計數功能,延時為1s,用c語言。

/***數顯秒錶,范圍0~9999***/
/***源程序默認硬體環境:52單片機,12MHz晶振,4位共陽數碼管,P0 口段選,P10~P13 高電平位選(NPN三極體驅動),P13為最高位數碼管***/
#include"reg52.h" //包含52頭文件
#define TRUE 1 //定義布爾量'1':真
#define FALSE 0 //定義布爾量'0':假
#define uchar unsigned char //定義 無符號字元型數據 簡稱
#define uint unsigned int //定義 無符號整型數據 簡稱
#define th0 0xfc
#define tl0 0x18 //1ms at 12MHz(定時器工作模式1 狀態)
#define SEG_Num 4 //數碼管位數
#define SEG_Data P0 //數碼管段驅動介面
#define SEG_En P1 //數碼管位驅動介面
#define SEG_AllOff (SEG_En&=0xf0) //關閉所有數碼管(位驅動)
#define DisTimeAt1msCount 4 //單'位'數碼管顯示時間,數碼管刷新頻率f=1/(N×t),其中 N為數碼管位數, t為單'位'數碼管顯示時間
#define T1sAt1msCount 1000 //1秒 計數值漏局(在定時器為1ms 情況下計數)
#define TimesEnd 10000 //顯示內容範圍 0~9999
uchar code SEG_B_List[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共陽數碼管代碼表"0-9"
uint Sec;
uchar bdata Flag=1;
sbit DisplayFlag=Flag^0; //顯示標志位
sbit TimesUpFlag=Flag^1; //時間更新標志位
void Timer0() interrupt 1 //定時器0中斷函數
{
static uchar t1ms; //定義靜態變數 t1ms 定時計數寄存空間
static uint t1ms_sec;
TL0=tl0;
TH0=th0; //重賦 1ms 定時初值
t1ms=++t1ms%DisTimeAt1msCount; //先纖搜殲計數值加1,後對計數范圍進行限制0~(DisTimeAt1msCount-1)
if(!t1ms) DisplayFlag=TRUE; //若定時計數值歸0,則表示計數值曾到達 單'位'顯示時間(DisTimeAt1msCount),顯示標志 置位
t1ms_sec=++t1ms_sec%T1sAt1msCount; //在 T1sAt1msCount(1000) 范圍內加1
if(!t1ms_sec) TimesUpFlag=TRUE; //若 歸0,則1s 時間到,時間更新標志位 置位
}
void SystemInit() //系統初始化函數
{
TMOD=0x01; //關閉定時器1,開啟定時器0,且工作在模式1(16位定時器)
TH0=th0;
TL0=tl0; //裝定時初值(1ms at 12MHz)
TR0=1; //啟動計時
ET0=1; //允許定時器0中斷
EA=1; //開啟系統中斷功能
}

float Pow_Self(float x,uint y)//自編簡易 x 的 y 次方函數,y只能是 非負整數
{
float sum;
if(x==0 && y==0) return; //0 的 0 次方無意義
else if(x==0) sum=0; //可有可無,y!=0的情況已經包含x=0,不加不影響結果,但影響運算速度
else if(y==0) sum=1; //除上述情況毀沖外,任何數的 0 次方均為 1
else if(y==1) sum=x; //任何數的 1 次方 均為 本身
else if(y>1) sum=Pow_Self(x,--y)*x; //遞歸調用,降冪
return sum; //返回計算結果
}
void TimesUpdata() //時間更新 函數
{
if(TimesUpFlag) //若 時間更新標志 為真
{
Sec=++Sec%TimesEnd; //Sec (秒)在 TimesEnd (0~999) 范圍內加1
TimesUpFlag=FALSE; //清 時間更新標志位
}
}
void Display(uint dis_num) //顯示函數,顯示內容為 無符號整型數據 dis_num
{
static uchar dis_loca; //定義靜態變數 顯示位置
if(DisplayFlag) //若顯示標志位為真(單'位'顯示時間結束),則執行以下任務
{
DisplayFlag=FALSE; //清顯示標志位
dis_loca=++dis_loca%SEG_Num; //先對 顯示位置 加1,後對變數范圍進行限制 0~(SEG_Num-1)
SEG_AllOff; //關閉所有數碼管顯示(位驅動)
SEG_Data=SEG_B_List[(dis_num/(uint)(Pow_Self(10,dis_loca)))%10]; //將顯示內容(dis_num) 本次需顯示的位(dis_loca)上的數值轉成代碼,並送到數據埠
SEG_En|=1<<dis_loca; //開啟本次需要顯示的位驅動
}
}
void main() //主函數
{
SystemInit(); //調用 系統初始化函數
while(1) //循環系統
{
TimesUpdata(); //調用 時間更新函數
Display(Sec); //調用 顯示函數 顯示內容為 Sec
}
}

熱點內容
C語言項目案例分析 發布:2024-11-24 17:14:48 瀏覽:977
河內塔演算法 發布:2024-11-24 17:03:05 瀏覽:725
為什麼文件夾只讀 發布:2024-11-24 16:56:02 瀏覽:170
無線監控怎麼存儲 發布:2024-11-24 16:46:43 瀏覽:598
英朗買什麼配置 發布:2024-11-24 16:40:44 瀏覽:346
殺戮解壓法 發布:2024-11-24 16:40:36 瀏覽:945
避孕套存儲箱 發布:2024-11-24 16:25:09 瀏覽:735
如何自己搭建雲伺服器干貨 發布:2024-11-24 16:22:08 瀏覽:371
安卓怎麼返回出廠系統 發布:2024-11-24 16:20:32 瀏覽:447
求生之路sp源碼 發布:2024-11-24 16:06:05 瀏覽:373