⑴ 51單片機顯示八位數碼管的C語言程序
1、最開始,我們先打開keil。
⑵ 求用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
⑶ 試編寫程序:8位數碼管動態顯示數字AbcdEFgH
這是參考程序,把dofly_DuanMa[]裡面的值改成a、b、c、d、e、f、g、h的對應段碼值就行,然後位選信號看下你的連接電路是怎麼接的。希望採納,有疑問請追問。
#include<消中reg52.h>
#define DataPort P0 //定義數據埠 程序中遇到DataPort 則用P0 替換 sbit LATCH1=P2^2;//定義鎖存差橋兄使能埠 段鎖存
sbit LATCH2=P2^3;// 位鎖存
unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 顯示段碼值01234567
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分別對應相應的數碼管點亮,即位碼
void Delay(unsigned int t); //函數聲明
/*------------主函數-----------------*/
main() {
unsigned char i=0;
while(1)
{ DataPort=dofly_WeiMa[i]; //取位碼
LATCH2=1; //位鎖存
LATCH2=0;
DataPort=dofly_DuanMa[i]; //取顯示數據,段碼
LATCH1=1; //段鎖存
LATCH1=0;
Delay(600); // 掃描間隙延時,時間太長會閃爍,太短會造成重影,
i++;
if(8==i) //檢測8位掃描完全結束?如掃描完成則從第一個
i=0; }
}
/*------------------- 延時函數,含有輸入參數 unsigned int t,無返回值 unsigned int 是虛襲定義無符號整形變數,其值的范圍是 0~65535 ----------------*/
void Delay(unsigned int t)
{ while(--t); }
⑷ 用verilog編寫程序表示8位數碼掃描顯示電路
我這里有六位的
mole time_display(clk_100,hour,minute,second,led_light,sm_seg);
input clk_100;
input [4:0] hour;
input [5:0] minute;
input [5:0] second;
output [5:0] led_light;
output [7:0] sm_seg;//假設這里用的是念高8段數碼管
reg [5:0] led_light;
reg [7:0] sm_seg;
reg [3:0] led;
reg [2:0] led_count;
always @ (posedge clk_100)
begin
if(led_count==5)
led_count<=3'b0;
else
led_count<=led_count+3'b001;
case(led_count)
3'b000:
begin
led_light<=6'b00_0001;
led<=second%10;
end
3'b001:
begin
led_light<碰岩=6'b00_0010;
led<=second/10;
end
3'b010:
begin
led_light<=6'b00_0100;
led<=minute%10;
end
3'b011:
begin
led_light<=6'b00_1000;
led<=minute/10;
end
3'b100:
begin
led_light<=6'b01_0000;
led<=hour%10;
end
3'b101:
begin
led_light<=6'b10_0000;
led<=hour/10;
end
endcase
end
always @ (led_light)
begin
case(led)
4'h0:sm_seg=8'hc0;//"0"
4'h1:sm_seg=8'hf9;//"1"
4'h2:sm_seg=8'ha4;//"2"
4'h3:sm_seg=8'hb0;//"3"
4'h4:sm_seg=8'h99;//"4"
4'h5:sm_seg=8'h92;//"5"
4'h6:sm_seg=8'h82;//"仔吵尺6"
4'h7:sm_seg=8'hf8;//"7"
4'h8:sm_seg=8'h80;//"8"
4'h9:sm_seg=8'h90;//"9"
default:sm_seg=8'hc0;//"0"
endcase
end
endmole