Ⅰ 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的
设计世毁方案
程序搜嫌备都有的