Ⅰ EDA課程設計——數字電子鍾
1、基本要求:能利用現有的硬體系統設計一個至少能顯示分、秒的控制電路。分和秒均用兩位數碼管指示,並具有調時、復位功能;
2、擴展要求:能同時顯示小時(兩位數碼管)並能調節小時功能;具有鬧鍾定時功能。
3、設計方法:採用模塊化描述方法,可分為分頻模塊、調時控制模塊、數碼顯示模塊、復位等模塊,每個模塊既可以編輯成獨立的HDL文件或GDF文件,也可以作為HDL程序中的一個進程模塊,最後進行系統模擬加以驗證,在此基礎上下載到硬體上進行現場測試。
4、輸入、輸出埠描述:輸入信號——時鍾信號clk、復位信號clr、時間設置鍵set、時間上調鍵tup、時間下調鍵tdown;輸出信號——掃描式七段數碼管段選輸出端led[7..0]、位選輸出端ctrlbit[3..0]。
我來幫他解答
2011-6-1 17:06
滿意回答
設計原理
計數時鍾由模為60的秒計數器模塊、模為60的分計數模塊、模為24的小時計數器模塊、指示燈與報警器的模塊、分/小時設定模塊及輸出顯示模塊等組成。秒計數器模塊的進位輸出為分計數器模塊的進位輸入,分計數器模塊的進位輸出為小時計數器模塊的進位輸入。其中秒計數器模塊中應有分鍾的設定,分計數器模塊中應有小時的設定。
內容
設計一個計數時鍾,使其具有24小時計數功能。通過「多功能復用按鍵F1-F12」信號接線組「F1_12(T)」的F9~F12的任意引線插孔可設置小時和分鍾的值,並具有整點報時的功能。
電路原理圖
模塊說明:計數時鍾由60秒計數器模塊XSECOND、60分計數器模塊XMINUTE、24小時計數器模塊XHOUR等六個模塊構成。秒計數器模塊的進位輸出為分計數器模塊的進位輸入,分計數器模塊中有小時的設定。通過SW1、SW2、SW3、SW4可設定小時和分鍾衡凳的值,並具有整點報時的功能。
輸入信號:SETMIN為分鍾設置信號;SETHOUR為小時設置信號;RESET為全局復位信號;CLK為全局時鍾信號;CKDSP為數碼管動態掃描信號。
輸出信號:SPEAK為蜂鳴器報時信號;LAMP[2..0]為指示燈信號;A~G為數碼管七個段位信號;SS[2..0]為數碼管段位解碼控制信號。
說明與電路連線
指示燈信號LAMP2~LAMP0為獨立擴展下載板上CPLD器件的第11、10、9腳,內部已連接並已鎖定,無需外接連線。
蜂鳴器報時信號SPEAK為獨立擴展下載板CPLD器件的第31腳,內部已連接並已鎖定,無需外接連線。
撥碼開關SW1~SW7內部已連接並已鎖定,無需外接連線。
數碼管七個段位信號A~G為獨立擴展下載板上CPLD器件的第86、87、88、89、90、92、93腳,應接數碼管段位引線接線組KPL_AH,從左到右依次對應的A、B、C、D、E、禪激F、G引線插孔。
數碼管段位解碼控制信號SS0、SS1、SS2為獨立擴展下載板上CPLD器件的第68、69、70腳,為數碼咐襲旅管的位選掃描信號,分別接信號接線組DS1-8A(T)的SS0、SS1、SS2引線插孔(即在電源引線插孔組GND孔處)。
復位信號RESET為獨立擴展下載板上CPLD器件的第71腳,應接「多功能復用按鍵F1-F12」信號接線組「F1_12(T)」的F9~F12的任意一個插孔。
小時設置信號SETHOUR為獨立擴展下載板CPLD器件的第73腳,應接「多功能復用按鍵F1-F12」信號接線組「F1_12(T)」的F9~F12的任意一個插孔。
分鍾設置信號SETMIN為獨立擴展下載板上CPLD器件的第74腳,應接「多功能復用按鍵F1-F12」信號接線組「F1_12(T)」的F9~F12的任意一個插孔。
時鍾信號CLK為獨立擴展下載板上CPLD器件的183腳(即GCLK2),應接時鍾信號接線組「CLOCK(T)」的「FRQ(21)」引線插孔。
數碼管動態掃描信號CKDSP為獨立擴展下載板上CPLD器件的79腳(即GCLK1),應接時鍾信號接線組「CLOCK(T)」的「FRQ(11)」引線插孔。
參考源程序
library IEEE;
use IEEE.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity xsecond is
port (
clk: in STD_LOGIC;
clkset: in STD_LOGIC;
setmin: in STD_LOGIC;
reset: in STD_LOGIC;
secout: out STD_LOGIC_VECTOR (6 downto 0);
enmin: out STD_LOGIC
);
end xsecond;
architecture xsecond_arch of xsecond is
signal sec : std_logic_vector(6 downto 0);
signal emin : std_logic;
signal sec1 : std_logic;
begin
-- <<enter your statements here>>
process(reset,sec,emin,setmin,clkset)
begin
if reset='0' then
enmin<='0';
secout<="0000000";
sec1<='1';
else
sec1<='0';
secout<=sec;
if clkset='1' and clkset'event then
if setmin='0' then
enmin<='1';
else
enmin<=emin;
end if;
end if;
end if;
end process;
process(clk,sec1)
alias lcount : std_logic_vector(3 downto 0) is sec(3 downto 0);
alias hcount : std_logic_vector(2 downto 0) is sec(6 downto 4);
begin
if sec1='1' then
sec<="0000000";
else
if (clk='1' and clk'event) then
if lcount=9 then
lcount<="0000";
if hcount/=5 then
hcount<=hcount+1;
emin<='0';
else
hcount<="000";
emin<='1';
end if;
else
lcount<=lcount+1;
emin<='0';
end if;
end if;
end if;
end process;
end xsecond_arch;
library IEEE;
use IEEE.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity xminute is
port (
clkmin: in STD_LOGIC;
reset: in STD_LOGIC;
sethour: in STD_LOGIC;
clk: in STD_LOGIC;
minout: out STD_LOGIC_VECTOR (6 downto 0);
enhour: out STD_LOGIC
);
end xminute;
architecture xminute_arch of xminute is
signal min : std_logic_vector(6 downto 0);
signal ehour : std_logic;
signal min1 : std_logic;
begin
-- <<enter your statements here>>
process(reset,clk,sethour,min,ehour)
begin
if reset='0' then
enhour<='0';
minout<="0000000";
min1<='0';
else
min1<='1';
minout<=min;
if clk='1' and clk'event then
if sethour='0' then
enhour<='1';
else
enhour<=ehour;
end if;
end if;
end if;
end process;
process(clkmin,min1)
alias lcountm : std_logic_vector(3 downto 0) is min(3 downto 0);
alias hcountm : std_logic_vector(2 downto 0) is min(6 downto 4);
begin
if min1='0' then
min<="0000000";
else
if (clkmin='1' and clkmin'event) then
if lcountm=9 then
lcountm<="0000";
if hcountm/=5 then
hcountm<=hcountm+1;
ehour<='0';
else
hcountm<="000";
ehour<='1';
end if;
else
lcountm<=lcountm+1;
ehour<='0';
end if;
end if;
end if;
end process;
end xminute_arch;
library IEEE;
use IEEE.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity xhour is
port (
clkhour: in STD_LOGIC;
reset: in STD_LOGIC;
hourout: out STD_LOGIC_VECTOR (5 downto 0)
);
end xhour;
architecture xhour_arch of xhour is
signal hour : std_logic_vector(5 downto 0);
begin
-- <<enter your statements here>>
process(reset,clkhour,hour)
alias lcount : std_logic_vector(3 downto 0) is hour(3 downto 0);
alias hcount : std_logic_vector(1 downto 0) is hour(5 downto 4);
begin
if reset='0' then
hourout<="000000";
hour<="000000";
else
if (clkhour='1' and clkhour'event) then
if lcount=9 then
lcount<="0000";
hcount<=hcount+1;
else
if hour="100011" then
hour<="000000";
else
lcount<=lcount+1;
end if;
end if;
end if;
hourout<=hour;
end if;
end process;
end xhour_arch;
library IEEE;
use IEEE.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity xalert is
port (
clk: in STD_LOGIC;
d_in: in STD_LOGIC_VECTOR (6 downto 0);
speak: out STD_LOGIC;
d_out: out STD_LOGIC_VECTOR (2 downto 0)
);
end xalert;
architecture xalert_arch of xalert is
type state is (s1,s2,s3,s4);
signal next_state,current_state : state;
begin
-- <<enter your statements here>>
process(clk,current_state,d_in)
begin
if d_in/="0000000" then
speak<='0';
next_state<=s1;
current_state<=s1;
d_out<="000";
else
if clk='1' and clk'event then
speak<='1';
current_state<=next_state;
end if;
case current_state is
when s1 =>
d_out<="000";
next_state<=s2;
when s2 =>
d_out<="001";
next_state<=s3;
when s3 =>
d_out<="010";
next_state<=s4;
when s4 =>
d_out<="100";
next_state<=s1;
when others =>
d_out<="000";
null;
end case;
end if;
end process;
end xalert_arch;
library IEEE;
use IEEE.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity xsettime is
port (
hour: in STD_LOGIC_VECTOR (5 downto 0);
min: in STD_LOGIC_VECTOR (6 downto 0);
sec: in STD_LOGIC_VECTOR (6 downto 0);
reset: in STD_LOGIC;
clk: in STD_LOGIC;
sel: out STD_LOGIC_VECTOR (2 downto 0);
d_out: out STD_LOGIC_VECTOR (3 downto 0)
);
end xsettime;
architecture xsettime_arch of xsettime is
signal sel1 : std_logic_vector(2 downto 0);
begin
-- <<enter your statements here>>
process(clk,reset,sel1,hour,min,sec)
begin
if reset='0' then
sel<="000";
d_out<="0000";
sel1<="000";
else
if (clk='1' and clk'event) then
if sel1<5 then
sel1<=sel1+1;
else
sel1<="000";
end if;
end if;
sel<=sel1;
case sel1 is
when "000" =>
d_out(3)<='0';
d_out(2)<='0';
d_out(1)<=hour(5);
d_out(0)<=hour(4);
when "001" =>
d_out<=hour(3 downto 0);
when "010" =>
d_out(3)<='0';
d_out(2)<=min(6);
d_out(1)<=min(5);
d_out(0)<=min(4);
when "011" =>
d_out<=min(3 downto 0);
when "100" =>
d_out(3)<='0';
d_out(2)<=sec(6);
d_out(1)<=sec(5);
d_out(0)<=sec(4);
when "101" =>
d_out<=sec(3 downto 0);
when others =>
null;
end case;
end if;
end process;
end xsettime_arch;
library IEEE;
use IEEE.std_logic_1164.all;
entity xdeled is
port (
d_in: in STD_LOGIC_VECTOR (3 downto 0);
a: out STD_LOGIC;
b: out STD_LOGIC;
c: out STD_LOGIC;
d: out STD_LOGIC;
e: out STD_LOGIC;
f: out STD_LOGIC;
g: out STD_LOGIC
);
end xdeled;
才五分啊,太少了吧
哥剛的
Ⅱ 急求!!後天考試,求eda,數字鍾的設計程序,具體要求在下面。
用Verilog 寫的
/* 信號定義:
clk: 標准時鍾信號,本例中,其頻率為4Hz;
clk_1k: 產生鬧鈴音、報時音的時鍾信號,本例中其頻率為1024Hz;
mode: 功能控制信號;為0:計時功能;
為1:鬧鍾功能;
為2:手動校時功能;
turn: 接按鍵,在手動校時功能時,選擇是調整小時,還是分鍾;
若長時間按住該鍵銷螞,還可使秒信號清零,用於精確調時;
change: 接按鍵,手動調整時,每按一次,計數器加1;
如果長按,則連續快速加1,用於快速調時和定時;
hour,min,sec :此三信號分別輸出並顯示時、分、秒信號,
皆採用BCD碼計數,分別驅動6個數碼管局鋒顯示時間;
alert: 輸出到揚聲器的信號,用於產生鬧鈴音和報時音;
鬧鈴音為持續20秒的急促的"嘀嘀嘀"音,若按住"change"鍵,
則可屏蔽該音;整點報時音為"嘀嘀嘀嘀-嘟"四短一長音;
LD_alert: 接發光二極體,指示是否設置了鬧鍾功能;
LD_hour: 接發光二極體,指示桐斗晌當前調整的是小時信號;
LD_min: 接發光二極體,指示當前調整的是分鍾信號。
*/
mole clock(clk,clk_1k,mode,change,turn,alert,hour,min,sec,
LD_alert,LD_hour,LD_min);
input clk,clk_1k,mode,change,turn;
output alert,LD_alert,LD_hour,LD_min;
output[7:0] hour,min,sec;
reg[7:0] hour,min,sec,hour1,min1,sec1,ahour,amin;
reg[1:0] m,fm,num1,num2,num3,num4;
reg[1:0] loop1,loop2,loop3,loop4,sound;
reg LD_hour,LD_min;
reg clk_1Hz,clk_2Hz,minclk,hclk;
reg alert1,alert2,ear;
reg count1,count2,counta,countb;
wire ct1,ct2,cta,ctb,m_clk,h_clk;
always @(posedge clk)
begin
clk_2Hz<=~clk_2Hz;
if(sound==3) begin sound<=0; ear<=1; end
//ear信號用於產生或屏蔽聲音
else begin sound<=sound+1; ear<=0; end
end
always @(posedge clk_2Hz) //由4Hz 的輸入時鍾產生1Hz的時基信號
clk_1Hz<=~clk_1Hz;
always @(posedge mode) //mode信號控制系統在三種功能間轉換
begin if(m==2) m<=0; else m<=m+1; end
always @(posedge turn)
fm<=~fm;
always //該進程產生count1,count2,counta,countb四個信號
begin
case(m)
2:begin if(fm)
begin count1<=change; {LD_min,LD_hour}<=2; end
else
begin counta<=change; {LD_min,LD_hour}<=1; end
{count2,countb}<=0;
end
1:begin if(fm)
begin count2<=change; {LD_min,LD_hour}<=2; end
else
begin countb<=change; {LD_min,LD_hour}<=1; end
{count1,counta}<=2'b00;
end
default: {count1,count2,counta,countb,LD_min,LD_hour}<=0;
endcase
end
always @(negedge clk)
//如果長時間按下"change"鍵,則生成"num1"信號用於連續快速加1
if(count2) begin
if(loop1==3) num1<=1;
else
begin loop1<=loop1+1; num1<=0; end
end
else begin loop1<=0; num1<=0; end
always @(negedge clk) //產生num2信號
if(countb) begin
if(loop2==3) num2<=1;
else
begin loop2<=loop2+1; num2<=0; end
end
else begin loop2<=0; num2<=0; end
always @(negedge clk)
if(count1) begin
if(loop3==3) num3<=1;
else
begin loop3<=loop3+1; num3<=0; end
end
else begin loop3<=0; num3<=0; end
always @(negedge clk)
if(counta) begin
if(loop4==3) num4<=1;
else
begin loop4<=loop4+1; num4<=0; end
end
else begin loop4<=0; num4<=0; end
assign ct1=(num3&clk)|(!num3&m_clk); //ct1 用於計時、校時中的分鍾計數
assign ct2=(num1&clk)|(!num1&count2); //ct2 用於定時狀態下調整分鍾信號
assign cta=(num4&clk)|(!num4&h_clk); //cta 用於計時、校時中的小時計數
assign ctb=(num2&clk)|(!num2&countb); //ctb 用於定時狀態下調整小時信號
always @(posedge clk_1Hz) //秒計時和秒調整進程
if(!(sec1^8'h59)|turn&(!m))
begin
sec1<=0; if(!(turn&(!m))) minclk<=1;
end
//按住"turn"按鍵一段時間,秒信號可清零,該功能用於手動精確調時
else begin
if(sec1[3:0]==4'b1001)
begin sec1[3:0]<=4'b0000; sec1[7:4]<=sec1[7:4]+1; end
else sec1[3:0]<=sec1[3:0]+1; minclk<=0;
end
assign m_clk=minclk||count1;
always @(posedge ct1) //分計時和分調整進程
begin
if(min1==8'h59) begin min1<=0; hclk<=1; end
else begin
if(min1[3:0]==9)
begin min1[3:0]<=0; min1[7:4]<=min1[7:4]+1; end
else min1[3:0]<=min1[3:0]+1; hclk<=0;
end
end
assign h_clk=hclk||counta;
always @(posedge cta) //小時計時和小時調整進程
if(hour1==8'h23) hour1<=0;
else if(hour1[3:0]==9)
begin hour1[7:4]<=hour1[7:4]+1; hour1[3:0]<=0; end
else hour1[3:0]<=hour1[3:0]+1;
always @(posedge ct2) //鬧鍾定時功能中的分鍾調節進程
if(amin==8'h59) amin<=0;
else if(amin[3:0]==9)
begin amin[3:0]<=0; amin[7:4]<=amin[7:4]+1; end
else amin[3:0]<=amin[3:0]+1;
always @(posedge ctb) //鬧鍾定時功能中的小時調節進程
if(ahour==8'h23) ahour<=0;
else if(ahour[3:0]==9)
begin ahour[3:0]<=0; ahour[7:4]<=ahour[7:4]+1; end
else ahour[3:0]<=ahour[3:0]+1;
always //鬧鈴功能
if((min1==amin)&&(hour1==ahour)&&(amin|ahour)&&(!change))
//若按住"change"鍵不放,可屏蔽鬧鈴音
if(sec1<8'h20) alert1<=1; //控制鬧鈴的時間長短
else alert1<=0;
else alert1<=0;
always //時、分、秒的顯示控制
case(m)
3'b00: begin hour<=hour1; min<=min1; sec<=sec1; end
//計時狀態下的時、分、秒顯示
3'b01: begin hour<=ahour; min<=amin; sec<=8'hzz; end
//定時狀態下的時、分、秒顯示
3'b10: begin hour<=hour1; min<=min1; sec<=8'hzz; end
//校時狀態下的時、分、秒顯示
endcase
assign LD_alert=(ahour|amin)?1:0; //指示是否進行了鬧鈴定時
assign alert=((alert1)?clk_1k&clk:0)|alert2; //產生鬧鈴音或整點報時音
always //產生整點報時信號alert2
begin
if((min1==8'h59)&&(sec1>8'h54)||(!(min1|sec1)))
if(sec1>8'h54) alert2<=ear&clk_1k; // 產生短音
else alert2<=!ear&clk_1k; //產生長音
else alert2<=0;
end
endmole
Ⅲ EDA設計數字時鍾
2. 微秒模塊
採用VHDL語言輸入方式,以時鍾clk,清零信號clr以及暫停信號STOP為進程敏感變數,程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity MINSECONDb is
port(clk,clrm,stop:in std_logic;----時鍾/清零信號
secm1,secm0:out std_logic_vector(3 downto 0);----秒族磨高位/低位
co:out std_logic);-------輸出/進位信號
end MINSECONDb;
architecture SEC of MINSECONDb is
signal clk1,DOUT2:std_logic;
begin
process(clk,clrm)
variable cnt1,cnt0:std_logic_vector(3 downto 0);---計數
VARIABLE COUNT2 :INTEGER RANGE 0 TO 10 ;
begin
IF CLK'EVENT AND CLK='1'THEN
IF COUNT2>=0 AND COUNT2<10 THEN
COUNT2:=COUNT2+1;
ELSE COUNT2:=0;
DOUT2<= NOT DOUT2;
END IF;
END IF;
if clrm='1' then----當clr為1時,高低位均為0
cnt1:="0000";
cnt0:="0000";
elsif clk'event and clk='1' then
if stop='1' then
cnt0:=cnt0;
cnt1:=cnt1;
end if;
if cnt1="1001" and cnt0="1000" then----當記數為98(實際是經過59個記時脈沖塌穗鋒)
co<='1';----進位
cnt0:="1001";----低位為9
elsif cnt0<"1001" then----小於9時
cnt0:=cnt0+1;----計數
--elsif cnt0="1001" then
--clk1<=not clk1;
else
cnt0:="0000";
if cnt1<"1001" then----高位小於9時
cnt1:=cnt1+1;
else
cnt1:="0000";
co<='0';
end if;
end if;
end if;
secm1<=cnt1;
secm0<=cnt0;
end process;
end SEC;
3. 秒模塊程序清單
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity SECOND is
port(clk,clr:in std_logic;----時鍾/清零信號
sec1,sec0:out std_logic_vector(3 downto 0);----秒高位/低位
co:out std_logic);-------輸出/進位信號
end SECOND;
architecture SEC of SECOND is
begin
process(clk,clr)
variable cnt1,cnt0:std_logic_vector(3 downto 0);---計數
begin
if clr='團晌1' then----當ckr為1時,高低位均為0
cnt1:="0000";
cnt0:="0000";
elsif clk'event and clk='1' then
if cnt1="0101" and cnt0="1000" then----當記數為58(實際是經過59個記時脈沖)
co<='1';----進位
cnt0:="1001";----低位為9
elsif cnt0<"1001" then----小於9時
cnt0:=cnt0+1;----計數
else
cnt0:="0000";
if cnt1<"0101" then----高位小於5時
cnt1:=cnt1+1;
else
cnt1:="0000";
co<='0';
end if;
end if;
end if;
sec1<=cnt1;
sec0<=cnt0;
end process;
end SEC;
4. 分模塊程序清單
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity MINUTE is
port(clk,en:in std_logic;
min1,min0:out std_logic_vector(3 downto 0);
co:out std_logic);
end MINUTE;
architecture MIN of MINUTE is
begin
process(clk)
variable cnt1,cnt0:std_logic_vector(3 downto 0);
begin
if clk'event and clk='1' then
if en='1' then
if cnt1="0101" and cnt0="1000" then
co<='1';
cnt0:="1001";
elsif cnt0<"1001" then
cnt0:=cnt0+1;
else
cnt0:="0000";
if cnt1<"0101" then
cnt1:=cnt1+1;
else
cnt1:="0000";
co<='0';
end if;
end if;
end if;
end if;
min1<=cnt1;
min0<=cnt0;
end process;
end MIN;
5. 時模塊程序清單
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity HOUR is
port(clk,en:in std_logic;----輸入時鍾/高電平有效的使能信號
h1,h0:out std_logic_vector(3 downto 0));----時高位/低位
end HOUR;
architecture hour_arc of HOUR is
begin
process(clk)
variable cnt1,cnt0:std_logic_vector(3 downto 0);----記數
begin
if clk'event and clk='1' then---上升沿觸發
if en='1' then---同時「使能」為1
if cnt1="0010" and cnt0="0011" then
cnt1:="0000";----高位/低位同時為0時
cnt0:="0000";
elsif cnt0<"1001" then----低位小於9時,低位記數累加
cnt0:=cnt0+1;
else
cnt0:="0000";
cnt1:=cnt1+1;-----高位記數累加
end if;
end if;
end if;
h1<=cnt1;
h0<=cnt0;
end process;
end hour_arc;
6. 動態掃描模塊
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity SELTIME is
port(
clk:in std_logic;------掃描時鍾
secm1,secm0,sec1,sec0,min1,min0,h1,h0:in std_logic_vector(3 downto 0);-----分別為秒個位/時位;分個位/
ut:out std_logic_vector(3 downto 0);----------------輸出
sel:out std_logic_vector(2 downto 0));-----位選信號
end SELTIME;
architecture fun of SELTIME is
signal count:std_logic_vector(2 downto 0);----計數信號
begin
sel<=count;
process(clk)
begin
if(clk'event and clk='1') then
if(count>="111") then
count<="000";
else
count<=count+1;
end if;
end if;
case count is
when"111"=>ut<= secm0;----秒個位
when"110"=>ut<= secm1;----秒十位
when"101"=>ut<= sec0;----分個位
when"100"=>ut<= sec1;----分十位
when"011"=>ut<=min0; ----時個位
when"010"=>ut<=min1;----時十位
when"001"=>ut<=h0;
when others =>ut<=h1;
end case;
end process;
end fun;
7. 報時模塊
library ieee;
use ieee.std_logic_1164.all;
entity ALERT is
port(m1,m0,s1,s0:in std_logic_vector(3 downto 0);------輸入秒、分高/低位信號
clk:in std_logic;------高頻聲控制
q500,qlk:out std_logic);----低頻聲控制
end ALERT;
architecture sss_arc of ALERT is
begin
process(clk)
begin
if clk'event and clk='1' then
if m1="0101" and m0="1001" and s1="0101" then----當秒高位為5,低位為9時且分高位為5
if s0="0001" or s0="0011" or s0="0101" or s0="0111" then---當分的低位為1或3或5或7時
q500<='1';----低頻輸出為1
else
q500<='0';----否則輸出為0
end if;
end if;
if m1="0101" and m0="1001" and s1="0101" and s0="1001" then---當秒高位為5,低位為9時且分高位為5,----分低位為9時,也就是「59分59秒」的時候「報時」
qlk<='1';-----高頻輸出為1
else
qlk<='0';
end if;
end if;
end process;
end sss_arc;
8. 顯示模塊
library ieee;
use ieee.std_logic_1164.all;
entity DISPLAY is
port(d:in std_logic_vector(3 downto 0);----連接seltime掃描部分d信號
q:out std_logic_vector(6 downto 0));----輸出段選信號(電平)
end DISPLAY;
architecture disp_are of DISPLAY is
begin
process(d)
begin
case d is
when"0000" =>q<="0111111";--顯示0
when"0001" =>q<="0000110";--顯示1
when"0010" =>q<="1011011";--顯示2
when"0011" =>q<="1001111";--顯示3
when"0100" =>q<="1100110";--顯示4
when"0101" =>q<="1101101";--顯示5
when"0110" =>q<="1111101";--顯示6
when"0111" =>q<="0100111";--顯示7
when"1000" =>q<="1111111";--顯示8
when others =>q<="1101111";--顯示9
end case;
end process;
end disp_are;
Ⅳ eda秒錶程序
1.
「分分:秒秒」計數器設計
我們要實現「分分:秒秒」顯示的電子秒錶,需要設計計數頻局畢率為1Hz
的
計數器。因為「分分:秒秒」的結構對應有4個十進制數字(個位的秒,十位的
秒,個位的分,十位的分),如果採用統一計數再分別求出「分分:秒秒」
對應
的4個十進制數字進行解碼顯示,則求解對應的4個十進制數字的過程難於用硬
件實現。在此,我們將每個顯示的值分別進行計數,即分別針對個位的秒、十位
的秒、個位的分、十位的分設計對應的計數器,其中個位的秒計數頻率為1Hz,
其從0到9計數,當從9回到0時,向前進一位,使得十位的秒進行計數加1。
35
十位的秒從0到5計數,當從5回到0時,向前進一位,使得個位的分進行計數
加1。個位的分從0到9計數,當從9回到0
時,向前進一位,使得十位的分進
行計數加1。十位的分則衡臘虛從0
到5計數,計數到5時,又回到0。
2.
掃描顯示技術
因為4位數碼管的段控制輸入是復用的,要分別顯示不同的計數數值,需要
使用動態掃描顯示技術,其電路結構如圖61
所示。首先,以掃描顯示的頻率進
行2比特寬的模4計數,然後由其值從4個數碼管的待顯示值輸入中選擇對應的
一個經解碼後連接到公共的段控制輸入端,同時將計數值經2到4解碼後輸出到
對應數碼管位的公共端,點亮對應的數碼管。雖然各數碼管位是輪流顯示,每個
數碼管位上的數字是斷續的顯示,只要掃描的頻率夠快,由於人眼的視覺殘余效
應,就可以看到各數碼管位上穩定的數字顯示值。這和我們使用的電視咐燃、顯示器
的顯示原理是一樣的。參考液晶顯示器的刷新頻率,經驗證,在每秒鍾掃描60
幀的時候,各數碼管位上即能得到穩定的數字顯示,此時,對應計數時鍾的等效
頻率為240Hz。我們可以參考實驗四的圖47,再做一個等效分頻計數器,通過
產生的後級時鍾使能信號將20MHz的時鍾等效分頻到240Hz。
圖
61
掃描顯示電路結構
3.
冒號點的處理
數碼管中間的時間分隔冒號點(對應為左邊第2個數碼管位的DP點)每秒
鍾閃爍一次,其頻率為1Hz,只需要輸出1Hz,占空比為50%的周期信號即可。
其他數碼管位的點號不需要顯示,對應的DP
點輸出低電平無效信號即可。這4
個信號
所示的顯示切換計數值進行4
選1
選擇後接到數碼管上公共的
DP控制端。
在實驗四中,我們為了得到1Hz的主功能計數頻率,前面利用precnt
進行了等效分頻計數,其一個完整的計數周期即為1s,對應產生的使能信號en
頻率即為1Hz,但我們在此不能直接使用en
的信號,因為其占空比只有
1/20000000,肉眼無法看到其閃爍的效果。為得到占空比為50%的1Hz信號,我
們可以通過對precnt
的計數值進行比較得出,只需要在precnt
計數周期內一半的
時間輸出1,一半的時間輸出0
即可,例如,當precnt>25'd9999999
時輸出0,
否則輸出1,此時即可得到占空比為50%的1Hz信號。
4.
總體設計
總體設計只需要將時鍾電路、復位電路、按鍵電路、數碼管電路等組合起來,
綜合使用時鍾使能的同步設計技術、按鍵處理技術、掃描顯示技術、「分分:秒
秒」計數器設計技術及冒號點的處理技術即可。
Ⅳ eda進行秒錶設計程序
;**** IC=AT89S52 F=12MHz T=1uS *****************************************
;**** WRITER:COCO.LI *************
; 定時器T0、T1溢出周期為50MS(10MS),T0為秒計數用,T1為調整時閃爍用,
;**** P1.0、P1.1、P1.2為調整按鈕,P0口為字元輸出口,採用共陽顯示咐洞禪管。
;********** 中斷程序入口 ****************
ORG 0000H ;程序執行開始地址
LJMP START ;跳到標號START執行
ORG 0003H ;外中斷0中斷程序入口
RETI ;外中斷0中斷返回
ORG 000BH ;定時器T0中斷程序入口
LJMP INTT0 ;跳到標號INTT0執行
ORG 0013H ;外中斷1中斷程序入口
RETI ;外中斷1中斷顫蠢返回
ORG 001BH ;定衡塵時器T1中斷程序入口
LJMP INTT1 ;跳到標號INTT1執行
ORG 0023H ;串列口中斷程序入口
RETI ;串列口中斷程序返回
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 主程序 ;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0030H ;
START:LCALL ST ;上電顯示年月日及班級學號
MOV R0,#70H ;清70H~7AH共11個內存單元
MOV R7,#0BH ;
CLEARDISP:
MOV @R0,#00H
INC R0
DJNZ R7,CLEARDISP
MOV 20H,#00H ;清20H , 標志用
MOV 7AH,#0AH ;放入「熄滅符」數據
MOV TMOD,#11H ;設T0、T1為16位定時器
MOV TL0,#0B0H ;50MS定時初值,T0計時用
MOV TH0,#3CH ;50MS定時初值
MOV TL1,#0B0H ;50MS定時初值,T1閃爍定時用
MOV TH1,#3CH ;50MS定時初值
SETB EA ;總中斷開放
SETB ET0 ;允許T0中斷
SETB TR0 ;開啟T0定時器
MOV R4,#14H ;1 S定時用初值50MS*20
START1:
LCALL DISPLAY ;調用顯示子程序
JNB P3.3,SETMM1 ;P3.3口為0時,轉時間調整程序
JNB P3.4,FUNSS ;秒錶功能,P3.4按鍵調時時作減1操作
JNB P3.5,FUNPT ;STOP,PUSE,CLR
SJMP START1 ;P3.3口為1時跳回START1
SETMM1:
LJMP SETMM ;轉到時間調整程序SETMM
FUNSS:
LCALL DS20MS ;
JB P3.4,START1 ;
WAIT11: ;
JNB P3.4,WAIT11 ;
CPL 03H ;
MOV 70H,#00H ;
MOV 70H,#00H ;
MOV 70H,#00H
MOV 70H,#00H ;
MOV 70H,#00H ;
MOV 70H,#00H ;
AJMP START1 ;
FUNPT: ;
LCALL DS20MS ;
JB P3.5,START1 ;
WAIT22: ;
JNB P3.5,WAIT21 ;
CLR ET0 ;
CLR TR0 ;
WAIT33: ;
JB P3.5,WAIT31 ;
LCALL DS20MS ;
JB P3.5,WAIT33 ;
WAIT66:
JNB P3.5,WAIT61
MOV R0,#70H ;清70H~79H共10個內存單元
MOV R7,#0AH
CLEARP:
MOV @R0,#00H
INC R0
DJNZ R7,CLEARP
WAIT44:
JB P3.5,WAIT41
LCALL DS20MS
JB P3.5,WAIT44
WAIT55:
JNB P3.5,WAIT51
SETB ET0
SETB TR0
AJMP START1
WAIT21:
LCALL DISPLAY
AJMP WAIT22
WAIT31:
LCALL DISPLAY
AJMP WAIT33
WAIT41:
LCALL DISPLAY
AJMP WAIT44
WAIT51:
LCALL DISPLAY
AJMP WAIT55
WAIT61:
LCALL DISPLAY
AJMP WAIT66
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;; 1 s計時程式 ;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; T0中斷服務程序
INTT0:
PUSH ACC ;累加器入棧保護
PUSH PSW ;狀態字入棧保護
CLR ET0 ;關T0中斷允許
CLR TR0 ;關定時器T0
JB 03H,FSS ;標志為1轉秒錶處理程序,,10MS定時
MOV A,#0B7H ;中斷響應時間同步修正
ADD A,TL0 ;低8位初值修正
MOV TL0,A ;重裝初值,,低8位修正值
MOV A,#3CH ;高8位初值修正
ADDC A,TH0
MOV TH0,A ;重裝初值,, 高8位修正值
SETB TR0 ;開啟定時器T0
DJNZ R4,OUTT0;20次中斷未到中斷退出
ADDSS:
MOV R4,#14H ;20次中斷到,重賦初值,,1S
MOV R0,#71H ;指向秒計時單元..71H~72H
ACALL ADD1 ;調用加1程序,,加1S操作.
MOV A,R3 ;秒數據放入A,,R3為2位十進制數組合
CLR C ;清進位標志
CJNE A,#60H,ADDMM
ADDMM:
JC OUTT0 ;短於60S時中斷退出
ACALL CLR0 ;長於或者等於60S時對秒計數單元清0
MOV R0,#77H ;指向分計時單元,,76H~77H
ACALL ADD1 ;分計時單元加1
MOV A,R3 ;分數據放入A
CLR C ;清進位標志
CJNE A,#60H,ADDHH ;秒錶時最大為99
ADDHH:
JC OUTT0 ;短於60min時中斷退出
ACALL CLR0 ;長於或者等於60min時對分計數單元清0
MOV R0,#79H ;指向分計時單元,,78H~79H
ACALL ADD1 ;小時計時單元加1h
MOV A,R3 ;時數據放入A
CLR C ;清進位標志
JB 03H,OUTT0 ;秒錶時最大為99
CJNE A,#24H,HOUR
HOUR:
JC OUTT0 ;短於24h時中斷退出
ACALL CLR0 ;長於或者等於24h時對計時單元清0
OUTT0:
MOV 72H,76H ;中斷退出時將分\時計時單元數據移
MOV 73H,77H ;入對應顯示單元
MOV 74H,78H
MOV 75H,79H
POP PSW ;恢復狀態字出棧
POP ACC ;恢復累加器
SETB ET0 ;開放T0中斷
RETI
;秒錶計時程序(10min加1),低2位為0.1、0.01秒,中間2位為秒,最高2位為分.
;最大計數值為99分59.99秒
FSS: MOV A,#0F7H
ADD A,TL0
MOV TL0,A
MOV A,#0D8H
ADDC A,TH0
MOV TH0,A
SETB TR0
MOV R0,#71H
ACALL ADD1
CLR C
MOV A,R3
JZ FSS1
SETB C
FSS1: AJMP ADDMM
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 閃動調時程式 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; T1中斷服務程序,用作時間調整單元閃爍指示
INTT1: PUSH ACC
PUSH PSW
MOV TL1,#0B0H
MOV TH1,#3CH
DJNZ R2,INTT1OUT
MOV R2,#06H
CPL 02H
JB 02H,FLASH1
MOV 72H,76H
MOV 73H,77H
MOV 74H,78H
MOV 75H,79H
INTT1OUT:
POP PSW
POP ACC
RETI
FLASH1: JB 01H,FLASH2
MOV 72H,76H
MOV 73H,77H
MOV 74H,78H
MOV 75H,79H
AJMP INTT1OUT
FLASH2: MOV 72H,76H
MOV 73H,77H
MOV 74H,78H
MOV 75H,79H
AJMP INTT1OUT
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 加1子程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
ADD1: MOV A,@R0 ;取當前計時單元數據到A
DEC R0 ;指向前一地址
SWAP A ;A中數據高四位與低四位交換
ORL A,@R0 ;前一地址中數據放入A中低四位
ADD A,#01H ;A加1操作
DA A ;十進制調整
MOV R3,A ;移入R3中暫存數據
ANL A,#0FH ;高四位變0
MOV @R0,A ;數據放入當前地址單元中
MOV A,R3 ;返回
INC R0
SWAP A
ANL A,#0FH
MOV @R0,A
RET
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 分減1子程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
SUB1: MOV A,@R0 ;取當前計時單元數據到A
DEC R0 ;指向前一地址
SWAP A ;A中數據高四位與低四位交換
ORL A,@R0 ;前一地址中數據放入A中低四位
JZ SUB11
DEC A ;A減1操作
SUB111: MOV R3,A ;移入R3中暫存數據
ANL A,#0FH ;高四位變0
CLR C ;清進位標志
SUBB A,#0AH
SUB1111:
JC SUB1110
MOV @R0,#09H ;大於等於0AH,為9
SUB110:
MOV A,R3 ;取回R3中暫存數據
INC R0 ;指向當前地址單元
SWAP A ;A中數據高四位與低四位交換
ANL A,#0FH ;高四位變0
MOV @R0,A ;數據放入當前地址單元中
RET ;返回
SUB11: MOV A,#59H
AJMP SUB111
SUB1110:
MOV A,R3 ;移入R3寄存器
ANL A,#0FH
MOV @R0,A
AJMP SUB110
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 時減1子程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
SUBB1: MOV A,@R0 ;取當前計時單元數據到A
DEC R0 ;指向前一地址
SWAP A ;A中數據高四位與低四位交換
ORL A,@R0 ;前一地址中數據放入A中低四位
JZ SUBB11 ;00減1為23H
DEC A ;A減1操作
SUBB111:MOV R3,A ;;移入R3中暫存數據
ANL A,#0FH ;高四位變0
CLR C ;清進位標志
SUBB A,#0AH ;時個位大於9為9
SUBB1111:
JC SUBB1110
MOV @R0,#09H ;大於等於0AH,為9
SUBB110:
MOV A,R3 ;取回R3中暫存數據
INC R0 ;指向當前地址單元
SWAP A ;A中數據高四位與低四位交換
ANL A,#0FH ;高四位變0
MOV @R0,A ;數據放入當前地址單元中
RET ;返回
;
SUBB11:
MOV A,#23H
AJMP SUBB111
SUBB1110:
MOV A,R3 ;時個位小於0A不處理
ANL A,#0FH ;高四位變0
MOV @R0,A ;個位移入
AJMP SUBB110
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 清0程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;對計時單元復0用
CLR0: CLR A ;清累加器
MOV @R0,A ;清當前地址單元
DEC R0 ;指向前一地址
MOV @R0,A ;前一地址單元清0
RET ;子程序返回
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 時鍾調整程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;當調時按鍵按下時進入此程序
SETMM: CLR ET0 ;關定時器T0中斷
CLR TR0 ;關閉定時器T0
LCALL DL1S ;調用1S延時程序
JB P3.3,CLOSEDIS ;鍵按下時間短於1S,關閉顯示,,省電
MOV R2,#06H ;進入調時狀態,賦閃爍定時初值
SETB ET1 ;允許T1中斷
SETB TR1 ;開啟T1定時器
SET2:
JNB P3.3,SET1 ;P3.3口為0時,等待,,鍵未釋放
SETB 00H ;鍵釋放,分調整閃爍標志置1
SET4: ;等待鍵按下
JB P3.3,SET3 ;等待鍵按下
LCALL DL05S ;有鍵按下,延時0.5S
JNB P3.3,SETHH ;按下時間長於0.5S,轉調小時狀態
MOV R0,#77H ;按下時間短於0.5S,加1min操作
LCALL ADD1 ;調用加1子程序
MOV A,R3 ;取調整單元數據
CLR C ;消位標志
CJNE A,#60H,HHH ;調整單元數據與60比較
HHH: JC SET4 ;調整單元數據小於60,轉SET4循環
LCALL CLR0 ;調整單元數據大於或等於60時,清0
CLR C ;清進位0
AJMP SET4 ;跳轉到SET4循環
CLOSEDIS:
SETB ET0 ;省電狀態,開T0中斷,,LED燈不顯示
SETB TR0 ;開啟T0中斷
CLOSE:
JB P3.3,CLOSE ;無鍵按下,等待
LCALL DISPLAY ;有鍵按下,調用顯示子程序延時消抖
JB P3.3,CLOSE ;是干擾,返回CLOSE等待
WAITH:
JNB P3.3,WAITH ;等待鍵釋放
LJMP START1 ;返回主程序,,LED數據顯示亮
SETHH: CLR 00H ;分閃爍標志清除,,進入調小時狀態
SETHH1: JNB P3.3,SET5 ;等待鍵釋放
SETB 01H ;小時調整標志置1
SET6: JB P3.3,SET7 ;等待鍵按下
LCALL DL05S ;有鍵按下,延時0.5S
JNB P3.3,SETOUT ;按下時間長於0.5S,退出時間調整
MOV R0,#79H ;按下時間短於0.5S,加1h操作
LCALL ADD1 ;調用加1子程序
MOV A,R3
CLR C
CJNE A,#24H,HOUU ;計時單元數據與24比較
HOUU: JC SET6 ;小於24,轉SET6循環
LCALL CLR0 ;大於或等於24時,清0操作
AJMP SET6 ;跳到SET6處循環
SETOUT: JNB P3.3,SETOUT1 ;調時退出程序.等待鍵釋放
LCALL DISPLAY ;延時消抖
JNB P3.3,SETOUT ;是抖動,返回SETOUT再等待
CLR 01H ;清調小時標志
CLR 00H ;清調分標志
CLR 02H ;清閃爍標志
CLR TR1 ;關閉定時器T1
CLR ET1 ;關定時器T1中斷
SETB TR0 ;開啟定時器T0
SETB ET0 ;開啟定時器T0中斷,,計時開始
LJMP START1 ;跳回主程序
SET1: LCALL DISPLAY ;鍵釋放等待調時用顯示程序
AJMP SET2 ;防止鍵按下時無時鍾顯示
SET3: LCALL DISPLAY ;等待調分按鍵時時鍾顯示用
JNB P3.3,FUNSUB ;減1分操作
AJMP SET4 ;調分等待
SET5: LCALL DISPLAY ;鍵釋放等待調時用顯示程序
AJMP SETHH1 ;防止鍵按下時無時鍾顯示
SET7: LCALL DISPLAY ;等待調小時按鍵時時鍾顯示用
JNB P3.3,FUNSUBB ;小時減1操作
AJMP SET6 ;調時等待
SETOUT1:LCALL DISPLAY ;退出時鍾整時鍵釋放等待
AJMP SETOUT ;防止鍵按下時無時鍾顯示
;FUNSUB,分減1程序?
FUNSUB: LCALL DISPLAY ;延時消抖
JB P3.3,SET41 ;干擾,返回調分等待
FUNSUB1:JNB P3.3,FUNSUB1 ;等待鍵放開
MOV R0,#77H
LCALL SUB1 ;分減1程序
LJMP SET4 ;返回調分等待
;
SET41: LJMP SET4
;FUNSUB,時減1程序?
FUNSUBB:LCALL DISPLAY ;消抖動
JB P3.4,SET61 ;干擾,返回調時等待
FUNSUBB1:JNB P3.4,FUNSUBB1
MOV R0,#79H
LCALL SUBB1
LJMP SET6
;
SET61: LJMP SET6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 顯示程序 ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;顯示數據在70H~75H單元內,用六位LED共陽數碼管顯示。
;掃描控制,每個LED數碼管亮1mS時間。
DISPLAY:
MOV R1,#70H ;指向顯示數據首址
MOV R5,#0DFH ;掃描控制字初值
PLAY: MOV A,R5 ;掃描字放入A
MOV P2,A ;從P2口輸出
MOV A,@R1 ;取顯示數據到A
MOV DPTR,#TAB ;取段碼表地址
MOVC A,@A+DPTR ;查顯示數據對應段碼
MOV P0,A ;段碼放入P0口
MOV A,R5
JB ACC_1,LOOP5 ;小數點處理
CLR P0.7
LOOP5: JB ACC_3,LOOP6
CLR P0.7
LOOP6: LCALL DL1MS ;顯示1MS
INC R1 ;指向下一地址
MOV A,R5 ;掃描控制字放入A
JNB ACC_0,ENDOUT ;ACC.0=0時,一次顯示結束
RR A ;A中數據循環左移
MOV R5,A ;放回R5內
MOV P0,#0FFH
AJMP PLAY ;跳回:PLAY循環.
ENDOUT: MOV P2,#0FFH ;一次顯示結束,P2口復位
MOV P0,#0FFH ;P0口復位
RET ;子程序返回
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,88H,0BFH
;共陽段碼表 1、 2、 3、 4、 5、 6、 7、 8、 9、不亮、A、—。
;
;SDISPLAY,上電顯示程序
;不帶小數點,有A、— 顯示功能
SDISPLAY:
MOV R5,#0DFH ;掃描控制字初值
SPLAY: MOV A,R5 ;掃描字放入A
MOV P2,A ;從P2口輸出
MOV A,@R1 ;取顯示數據到A
MOV DPTR,#TABS ;取段碼表地址
MOVC A,@A+DPTR ;查顯示數據對應段碼
MOV P0,A ;段碼放入P0口
MOV A,R5
LCALL DL1MS ;顯示1MS
INC R1 ;指向下一地址
MOV A,R5 ;掃描控制字放入A
JNB ACC_0,ENDOUTS ;ACC.0=0時,一次顯示結束
RR A ;A中數據循環左移
MOV R5,A ;放回R5內
AJMP SPLAY ;跳回:PLAY循環.
ENDOUTS:MOV P2,#0FFH ;一次顯示結束,P2口復位
MOV P0,#0FFH ;P0口復位
RET ;子程序返回
TABS: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,88H,0BFH
;STAB表,啟動時顯示2003-12-07、A01-2-28
;
STAB: DB 0AH,0AH,0AH,0AH,0AH,0AH,08H,02H,0CH,02H,0CH,01H,00H,0BH,0AH,0AH
DB 07H,00H,0CH
DB 07H,00H,0CH,02H,01H,0CH,03H,00H,00H,02H,0AH,0AH,0AH,0AH,0AH,0AH
;註:0A不亮,0B顯示「A」,0C顯示「-」
;ST子程序,上電時顯示年月日用,採用移動顯示
ST: MOV R0,#40H ;將顯示內容移入40H~50H單元
MOV R2,#20H
MOV R3,#00H
CLR A
MOV DPTR,#STAB
SLOOP:
MOVC A,@A+DPTR
MOV @R0,A
MOV A,R3
INC A
MOV R3,A
INC R0
DJNZ R2,SLOOP ;移入完畢
MOV R1,#5AH
MOV R3,#1BH ;顯示27個單元
SSLOOP:
MOV R2,#32H ;控制移動速度
SSLOOP1:
LCALL SDISPLAY
DJNZ R2,SSLOOP11
MOV A,R1
SUBB A,#07H ;顯示首址修正為低1個單元
MOV R1,A
DJNZ R3,SSLOOP
RET
SSLOOP11:
MOV A,R1 ;指針修正為原值
SUBB A,#06H
MOV R1,A
AJMP SSLOOP1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;; 延時程序 ;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;1ms延時程序,LED顯示程序用
DL1MS: MOV R6,#14H
DL1: MOV R7,#19H
DL2: DJNZ R7,DL2
DJNZ R6,DL1
RET;20MS延時程序,採用調用顯示子程序,以改善LED的顯示閃爍現象
DS20MS: ACALL DISPLAY
ACALL DISPLAY
ACALL DISPLAY
RET;延時程序,用作按鍵時間的長短判斷
DL1S:
LCALL DL05S
LCALL DL05S
RET
DL05S:
MOV R3,#20H ;8ms*32=0.196s
DL05S1:
LCALL DISPLAY
DJNZ R3,DL05S1
RET;
END ;程序結束
Ⅵ 請大俠幫忙給個eda數字時鍾設計完整程序。謝謝
EDA的數字鍾設計
...........
數字鍾功能介紹.
基本功能要求.
擴展者褲功能要求.
總體方案介紹.
計時方案.
鍵盤/顯示方案.
..........
YOU的
設計世毀方案
程序搜嫌備都有的