用VHDL语言编写的数字钟程序5篇

时间:2019-05-12 07:07:02下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《用VHDL语言编写的数字钟程序》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《用VHDL语言编写的数字钟程序》。

第一篇:用VHDL语言编写的数字钟程序

永州职业技术学院

课 程 设 计

课程名称: EDA技术实用教程 题 目:基于FPGA的数字钟设计 系、专业: 电子技术系应用电子 年级、班级: 07级电子大专 学生姓名: 冯 苗 指导老师: 龙 安 国 时 间: 2008年12月

目 录

一、系统设计………………………………………………………..1.1设计要求…………………………………………………… 1.1.1任务………………………………………………..1.1.2要求……………………………………………….1.1.3题目分析………………………………………… 二.方案论证与比较…………………………………

2.1方案一 …………………………………………

2.2 方案二 ………………………………………… 2.3 方案三 …………………………………………

三、设计思路……………………………………………………

3.1硬件模块……………………………………………… 3.2软件模块………………………………………………….四、调试情况………………………………………………….五、系统调试…………………………………………………

六、心得体会……………………………………………………...附:参考文献……………………………………………………..用VHDL语言编写的数字钟程序

摘要:本设计要求一个12进制或24进制的具有时、分、秒计时功能的数字钟,并要求能进行时、分、秒调整,每逢时有报时功能。数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。本设计基于FPGA芯片的数字钟的设计,通过多功能数字钟的设计思路,详细叙述了整个系统的硬件、软件实现过程,实现了时间的显示和修改功能、报时功能等,并尽可能的减少误差,使得系统可以达到实际数字钟的允许误差范围内。

关键词:FBGA、数码管、按键

一、系统设计

1.1 设计要求 1.1.1 任务

设计并制作一个数字钟,通过设计,掌握电子设计的一般思路,学习电子设计的一般方法。

1.1.2要求

(1)基本要求

①计时功能:这是数字钟的基本功能,每隔一秒钟计时一次,并在显示屏上显示当前时间。

②校时功能:能设置实时时间作为数字钟的当前时间,具有小时、分钟的手动校准时间功能。

(2)发挥部分

①计时进制的选择功能:十二小时制或二十四小时制可选择控制; ②整点报警功能:每逢整点自动报警; ③其他创新功能。二.方案论证与比较

2.1、方案一:采用74LS163和CD4046设计数字钟

图1.1.1 方案一电路图

晶体振荡器电路给数字钟提供一个频率稳定准确的32768Hz的方波信号,可保证数字钟的走时准确及稳定。不管是指针式的电子钟还是数字显示的电子钟都使用了晶体振荡器电路。由CD4046组成的分频器电路将32768Hz的高频方波信号经32768(2次分频后得到2Hz的方波信号经过D触发器二分频得到秒信号供秒计数器进行计数。分频器实际上也就是计数器。时间计数电路由秒个位和秒十位计数器、分个位和分十位计数器及时个位和时十位计数器电路构成,其中秒个位和秒十位计数器、分个位和分十位计数器为60进制计数器,而根据设计要求,时个位和时十位计数器为12进制计数器。时间计数器由74LS163组成.译码驱动电路将计数器输出的8421BCD码转换为数码管需要的逻辑状态,并且为保证数码管正常工作提供足够的工作电流。数码管通常有发光二极管(LED)数码管和液晶(LCD)数码管,本设计提供的为LED数码管。

14)

2、方案二:采用AT89C52单片机、数码管设计数字钟

图1.1.2 方案二电路图

本方案采用AT89C52单片机,单片机的P1口接数码管显示电路,P0口接键控制数码管的显示,P2.0口接入整点报时电路,RESET接入复位和晶振电路。该电路能否成功,关键在于程序的编写而对元器件的要求不太高。用汇编编写得数字钟电路,采用分支结构编写,利用跳转指令与大量的中断指令.当没有按键扫描没有按键按下时,程序正常计数,当检测到有键按下时,程序运转到相应中断程序进行响应处理.从而实现了分支程序的处理.方案三:采用FPGA制成的数字钟

图1.1.3 方案三电路图

市电经过降压电路为FPGA芯片提供3.3V的直流电压,12MHZ的晶振信号加入到FPGA芯片的内定义PORT,切换键、调时键,输出的8个四位的BCD码,经过数据选择器使得某一位信号的BCD码被选中,被选中的信号经过3/8译码电路,送到数码管的进行段码显示.而数码管的位选端也有内部软件编程实现位选.而由时、分,信号为蜂鸣器提供闹钟信号.并口端为程序输入端.三.设计思路

3.1硬件模块

采用ALTER公司的ACE×1K系列的EP1K10TC100-3芯片,通过Quartus软件编译各个管脚的功能及特性.接入12MHZ时钟信号,经过内部软件分频.得到1HZ和1000HZ信号,得到的1HZ时钟信号作为内部秒个位计数模块的时钟信号,秒个位进行十进制计数,到9进位,为秒十位提供6进制时钟信号,当秒为59时,为分钟提供时钟信号.当秒进位信号作为低位十进制分计数器时钟.分钟计数器为59时,为小时计数器的个位提供时钟信号,当小时计数器、分钟计数器输出信号与闹钟预设信号一样时,扬声器发声.输出信号经过数据选择器选择1位BCD码输出到译码电路,译码后送到数码管显示.位选择信号为数码管显示提供条件.而分频得到的1KHZ的时钟频率作为位选计数器的时钟信号.由于该方案简单而且可靠性高,故采用此种方案.该数字钟可以实现3个功能:计时功能、整点报时功能和重置时间功能,因此有3个子模块:计时、报时(alarm1)、重置时间(s1、m1、h1、d1)。其中计时模块有4部分构成:秒计时器(second1)、分计时器(minute1)、时计时器(hour1)和星期计时器(day1)。

该数字钟可以实现3个功能:计时功能、整点报时功能和重置时间功能,因此有3个子模块:计时、报时(alarm1)、重置时间(s1、m1、h1、d1)。其中计时模块有4部分构成:秒计时器(second1)、分计时器(minute1)、时计时器(hour1)和星期计时器(day1)。

3.2软件模块 1)、分频器模块

其实是一个计数器,外加信号频率为12MHZ时,在内部定义了一个信号从0到11999999的整数型计数信号count1,当内部信号计数为11999999时,count1计数为0,产生进位信号CLK1为1,其余时间计数器正常计数.CLK为0,从而实现了12000000次分频.得到1HZ的时钟信号.内部定义了一个从0到11999的整数性信号countf,当内部信号计数为11999时,countf计数为0,产生进位信号CLK1为1,其余时间计数器正常计数.CLK为0,从而实现了12000次分频.得到1KHZ的时钟信号的位选信号.2)、秒计数模块

内部定义时钟其余时刻均为为秒计时器(second1)是由一个60进制的计数器构成的,具有清0、置数和计数功能。其中reset为清0信号,当reset为0时,秒计时器清0;set 为置数信号,当set为0时,秒计时器置数,置s1的值。clk为驱动秒计时器的时钟,sec为秒计时器的输出,ensec为秒计时器的进位信号,作为下一级的时钟输入信号。

3)、分计时器(minute1)是由一个60进制的计数器构成的,具有清0、置数和计数功能。其中reset为清0信号,当reset为0时,分计时器清0;set 为置数信号,当set为0时,分计时器置数,置m1的值。clkm为驱动分计时器工作的时钟,与ensec相连接;min为分计时器的输出;enmin为分计时器的进位信号,作为下一级的时钟输入信号。4)、时计时器(hour1)模块

是由一个24进制的计数器构成的,具有清0、置数和计数功能。其中reset为清0信号,当reset为0时,时计时器清0;set 为置数信号,当set为0时,时计时器置数,置h1的值。clkh为驱动时计时器工作的时钟,与enmin相连接;hour为时计时器的输出;enhour为时计时器的进位信号,作为下一级的时钟输入信号。

图7

5)、报时模块(alarm1)的功能是当整点(将min作为该模块的输入信号,min=00)时,alarm输出高电平,并且持续1分钟。清0端(reset)前面一小段(200ns)为低电平,后面均为高电平;设置min的值,使其分别为……58分、59分、00分、01分、02分、03分……,保存波形图,进行仿真,产生如下波形: 7

见由上述波形可以清楚的看到:alarm在0分时输出高电平,并且持续至1min不为0。

6)、去抖模块

定义变量fb范围0到29999,当外部时钟信号来临时候,fp计数,只有当FP为29999时,fp赋值为0.内部5ms信号反向输出.输出5ms时钟信号,该信号送到内部的D触发器中,只有按键按下且5ms时钟信号来临时,按键信号才被送到触发器.从而实现了去抖.7)、系统总调试(topclock)(Endtime为10us

在秒计时器的clk输入一个周期为5ns的时钟信号;清0端(reset)前面一小段(40ns)为低电平,后面均为高电平;置数端(set)前面一小段(60ns)为低电平,后面均为高电平;秒重置端(s1)可设置数值为50秒,分重置端(m1)可设置数值为57分, 时重置端(h1)可设置数值为23时, 星期重置端(d1)可设置数值为6(星期六);保存波形图,进行仿真,产生如下波形”

图8

由上述波形可以清楚的看到:当reset为0时,数字钟清0;当set为1时,数字钟置数

图9由上述波形可以清楚的看到:秒计时器开始计时,当到达59秒后,秒计时器sec又从0开始计时,同时分钟min加了1,为58分。

由上述波形可以清楚的看到:分计时器开始计时,当到达59分后,分计时器min又从0开始计时,同时小时hour加了1,为24时,即时计时器hour也又从0开始计时,而此时星期计时器day也由6加1后回0,又从0开始计时。当分计时器min为0时,alarm输出一个高电平,持续直到分计时器min的值为1。

图10

8)、用经过5ms去抖程序后,使得keyout输出一个脉冲,将此信号作为按键代码计数电路.为每一种按键代码赋已一定功能.从而实现一键控制.

程序流程图如下:

详细程序见附录。程序控制过程如下说明:

四、产品调试与结果分析 1)书写遗漏

错误提示在305行和307行附近有一个错误,没有加IF.查看后发现由于自己的疏忽,在结束时,没有加END IF.将307行中加入一行结束语句,问题解决.2)数码管显示时有闪烁

检查扫描信号时钟时,发现扫描信号时钟为100HZ,扫描频率过低,引起闪烁.检查分频部分程序,发现扫描信号频率设为100HZ,将扫描信号频率改为1000KHZ.然后发现无闪烁.修改有效.3)数码管秒个位显示时无2、8字符

检查后发现秒个位译码部分字符书写错误.将秒个位字符2、8赋值错误修改观察,有显示.五、心得体会

转眼一学期就要悄悄走远,感觉这些天是我学的最多的.通过这次设计,进一步加深了对EDA的了解,让我对它有了更加浓厚的兴趣。特别是当每一个子模块编写调试成功时,心里特别的开心。但是在编写顶层文件的程序时,遇到了不少问题,特别是各元件之间的连接,以及信号的定义,总是有错误,在细心的检查下,终于找出了错误和警告,排除困难后,程序编译就通过了,心里终于舒了一口气。在波形仿真时,也遇到了一点困难,想要的结果不能在波形上得到正确的显示:在设定输入的时钟信号后,数字钟开始计数,但是始终看不到小时、星期的循环计数。后来,在数十次的调试之后,才发现是因为输入的时钟信号对于小时、星期来说太短了。经过屡次调试,终于找到了比较合适的输入数值:分钟的初始值可以设为57(58、59都可以),小时的初始值可以设为23,星期的初始值可以设为6,这样,仿真之后,就能清楚的看出分钟、小时的循环计数。另外,Endtime的值需要设置的长一点:10us左右,输入的时钟周期值要设置的短一点:5ns左右。

总的来说,这次设计的数字钟还是比较成功的,有点小小的成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识,同时,对未来有了更多的信心。

附:参考文献

1、黄仁欣主编《EDA技术实训教程》,清华大学出版社,2006年第2版。

2、杨志忠主编《数字电子技术》,北京高等教育出版社,2003年12第2版。

3、潘松、黄继业主编《单片机实训教程》,科学出版社,2005年5月第2版。

附件程序:

library ieee;use ieee.std_logic_1164.all;

use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity clock is

port(clk:in std_logic;--12M时钟

keyin:in std_logic;

speak:out std_logic;--蜂鸣器

dout:out std_logic_vector(7 downto 0);--段码

selout:out std_logic_vector(2 downto 0));--位选 end clock;architecture one of clock is

signal count:integer range 0 to 11999999;--1HZ秒信号

signal counf:integer range 0 to 11999;--1000HZ

SIGNAL CP_5ms : STD_LOGIC;

SIGNAL Q1,Q2,Q3: STD_LOGIC;

SIGNAL keyout : STD_LOGIC;

SIGNAL CJ:STD_LOGIC_VECTOR(2 DOWNTO 0);

signal sel:std_logic_vector(2 downto 0);--位选

signal hou1:std_logic_vector(3 downto 0);--计数中小时的十位

signal hou2:std_logic_vector(3 downto 0);--小时的个位

signal min1:std_logic_vector(3 downto 0);--分钟的十位

signal min2:std_logic_vector(3 downto 0);--分钟的个位

signal sec1:std_logic_vector(3 downto 0);--秒的十位

signal sec2:std_logic_vector(3 downto 0);--秒的个位

signal seth1:std_logic_vector(3 downto 0);--设时中小时的十位

signal seth2:std_logic_vector(3 downto 0);--小时的个位

signal setm1:std_logic_vector(3 downto 0);--分钟的十位

signal setm2:std_logic_vector(3 downto 0);--分钟的个位

signal h1:std_logic_vector(3 downto 0);---显示小时十位

signal h2:std_logic_vector(3 downto 0);---小时的个位

signal m1:std_logic_vector(3 downto 0);--分钟的十位

signal m2:std_logic_vector(3 downto 0);--分钟的个位

signal s1:std_logic_vector(3 downto 0);--秒的十位

signal s2:std_logic_vector(3 downto 0);--秒的个位

signal clk1,clkk,beep:std_logic;

begin-----------------分频 fp:process(clk)

begin

if rising_edge(clk)then

count<=count+1;

counf<=counf+1;

if count=11999999 then clk1<='1';---1Hz

count<=0;

beep<='1';

elsif count>5999999 then beep<='0';---2Hz

else clk1<='0';

end if;

if counf=11999 then clkk<='1';--1000HZ

counf<=0;

else clkk<='0';

end if;

end if;end process fp;---------------位扫描 choice:process(clkk)---位选

扫描

begin

if rising_edge(clkk)then

if sel=“111” then

sel<=“000”;

else

sel<=sel+1;

end if;

end if;end process choice;-------------秒个位 s220:process(clk1,cj)

begin

if clk1'event and clk1='1' then

if sec2=“1001” then

---其中sec2是秒的个位

sec2<=“0000”;

elsif cj=“010” then

sec2<=sec2;

else sec2<=sec2+1;

end if;

end if;if cj=“001” then sec2<=“0000”;---秒个位复位

end if;end process s220;--------------秒十位 s110:process(clk1,cj)

begin

if clk1'event and clk1='1' then

if(sec1=“0101” and sec2=“1001”)then---其中sec1是秒钟的十位

sec1<=“0000”;

elsif cj=“010” then

sec1<=sec1;

else if sec2=“1001”then

sec1<=sec1+1;

end if;

end if;end if;if cj=“001” then sec1<=“0000”;---秒十位复位

end if;end process s110;---------------分钟个位 m220:process(clk1,sec1,sec2,cj)

begin

if clk1'event and clk1='1' then

if min2=“1001”and(sec1=“0101” and sec2=“1001”)then----其中min2是分钟的个位

min2<=“0000”;

elsif min2=“1001”and(cj=“011” and cj=“100”)then---

min2<=“0000”;

else if(sec1=“0101” and sec2=“1001”)or(cj=“011” and cj=“100”)then

min2<=min2+1;

end if;

end if;end if;if cj=“001” then min2<=“0000”;

end if;

end process m220;----------------分钟十位 m110:process(clk1,min2,sec1,sec2,cj)

begin

if clk1'event and clk1='1' then

if(min1=“0101” and min2=“1001”)and(sec1=“0101” and sec2=“1001”)then

min1<=“0000”;

elsif min1=“0101”and min2=“1001”and(cj=“011” and cj=100)then

min1<=“0000”;

elsif(min2=“1001”and(sec1=“0101” and sec2=“1001”))or(min2=“1001”and cj=“011” and cj=“100”)then

min1<=min1+1;

end if;

end if;--end if;if cj=“001” then min1<=“0000”;

end if;end process m110;----------------小时个位

h220:process(clk1,min1,min2,sec1,sec2,cj,hou1)

begin

if clk1'event and clk1='1' then

if(hou1=“0010” and hou2=“0011”)and(min1=“0101” and min2=“1001”)and(sec1=“0101” and sec2=“1001”)then

hou2<=“0000”;

elsif hou2=“1001”and(min1=“0101” and min2=“1001”)and(sec1=“0101” and sec2=“1001”)then

hou2<=“0000”;

elsif(hou2=“1001”and cj=“110”)or(hou1=“0010”and hou2=“0011”and cj=“110”)then

hou2<=“0000”;--md<='1';

elsif((min1=“0101” and min2=“1001”)and(sec1=“0101” and sec2=“1001”))or(cj=“110”)then

hou2<=hou2+1;--speak<=clk;

end if;

end if;if cj=“001” then hou2<=“0000”;

end if;end process h220;----------------小时十位 h110:process(clk1,hou2,min1,min2,sec1,sec2,cj)

begin

if clk1'event and clk1='1' then

if(hou1=“0010” and hou2=“0011”)and(min1=“0101” and min2=“1001”)and(sec1=“0101” and sec2=“1001”)then

hou1<=“0000”;

elsif hou1=“0010”and hou2=“0011”and cj=“110” then--当时间为23点且处于校时状态时

hou1<=“0000”;

elsif(hou2=“1001”and(min1=“0101” and min2=“1001”)and(sec1=“0101” and sec2=“1001”))or(hou2=“1001”and cj=“110”)then

hou1<=hou1+1;

end if;

end if;if cj=“001” then hou1<=“0000”;

end if;end process h110;------------时间设置小时部分 sethour1:process(clk1,seth1,seth2,cj)

begin

if clk1'event and clk1='1' then

if seth1=“0010”and seth2=“0011” then

seth1<=“0000”;

elsif seth2=“1001” then

seth1<=seth1+1;

end if;

end if;if cj=“001” then seth1<=“0000”;end if;end process sethour1;------------sethour2:process(clk1,seth1,cj)

begin

if clk1'event and clk1='1' then

if(seth1=“0010”and seth2=“0011”)or seth2=“1001” then

---其中seth1,seth2分别是调时的小时部位的十位与个位

seth2<=“0000”;

elsif cj=“111” then

seth2<=seth2+1;

end if;

end if;if cj=“001” then seth2<=“0000”;

end if;end process sethour2;------------时间设置分钟部分 setmin1:process(clk1,setm2,cj)

begin

if clk1'event and clk1='1' then

if setm1=“0101”and setm2=“1001” then

setm1<=“0000”;

elsif setm2=“1001” then

setm1<=setm1+1;

end if;

end if;if cj=“001” then setm1<=“0000”;

end if;end process setmin1;---------------setmin2:process(clk1,cj)

begin

if clk1'event and clk1='1' then

if setm2=“1001” then

setm2<=“0000”;

elsif cj=“101” then

setm2<=setm2+1;

end if;

end if;if cj=“001” then setm2<=“0000”;

end if;end process setmin2;-------------闹铃

speaker:process(clkk,hou1,hou2,min1,min2,cj)

begin

if clkk'event and clkk='1'then

if seth1=hou1 and seth2=hou2 and setm1=min1 and setm2=min2 then

speak<=beep;

else speak<='0';

end if;

end if;if cj=“001” then speak<='0';

end if;end process speaker;------------disp:process(sel,cj,hou1,hou2,min1,min2,sec1,sec2,seth1,seth2,setm1,setm2)---显示

begin

if sel=“010” then

selout<=“010”;--位选

case h1 is

---显示小时的十位

when “0000”=>dout<=“00111111”;---0

when “0001”=>dout<=“00000110”;---1

when “0010”=>dout<=“01011011”;---2

when others =>dout<=“00000000”;---不显示

end case;

elsif sel=“011” then

selout<=“011”;

case h2 is

---显示小时的个位

when “0000”=>dout<=“10111111”;---0

when “0001”=>dout<=“10000110”;---1

when “0010”=>dout<=“11011011”;---2

when “0011”=>dout<=“11001111”;---3

when “0100”=>dout<=“11100110”;---4

when “0101”=>dout<=“11101101”;---5

when “0110”=>dout<=“11111101”;---6

when “0111”=>dout<=“10000111”;---7

when “1000”=>dout<=“11111111”;---8

when “1001”=>dout<=“11101111”;---9

when others=>dout<=“10000000”;---不显示

end case;

elsif sel=“100” then

selout<=“100”;

case m1 is

---显示分钟的十位

when “0000”=>dout<=“00111111”;

when “0001”=>dout<=“00000110”;

when “0010”=>dout<=“01011011”;

when “0011”=>dout<=“01001111”;

when “0100”=>dout<=“01100110”;

when “0101”=>dout<=“01101101”;

when others=>dout<=“00000000”;

end case;

elsif sel=“101” then

selout<=“101”;

case m2 is

---显示分钟的个位

when “0000”=>dout<=“10111111”;

when “0001”=>dout<=“10000110”;

when “0010”=>dout<=“11011011”;

when “0011”=>dout<=“11001111”;

when “0100”=>dout<=“11100110”;

when “0101”=>dout<=“11101101”;

when “0110”=>dout<=“11111101”;

when “0111”=>dout<=“10000111”;

when “1000”=>dout<=“11111111”;

when “1001”=>dout<=“11101111”;

when others=>dout<=“10000000”;

end case;

elsif sel=“110” then

selout<=“110”;

case s1 is

---显示秒的十位

when “0000”=>dout<=“00111111”;

when “0001”=>dout<=“00000110”;

when “0010”=>dout<=“01011011”;

when “0011”=>dout<=“01001111”;

when “0100”=>dout<=“01100110”;

when “0101”=>dout<=“01101101”;

when others=>dout<=“00000000”;

end case;

elsif sel=“111” then

selout<=“111”;

case s2 is

---显示秒的个位

when “0000”=>dout<=“00111111”;

when “0001”=>dout<=“10000110”;

when “0010”=>dout<=“01011011”;

when “0011”=>dout<=“11001111”;

when “0100”=>dout<=“01100110”;

when “0101”=>dout<=“11101101”;

when “0110”=>dout<=“01111101”;

when “0111”=>dout<=“10000111”;

when “1000”=>dout<=“01111111”;

when “1001”=>dout<=“11101111”;

when others=>dout<=“00000000”;

end case;

end if;

if cj=“011” then---------------计时时间显示和设置模式

h1<=hou1;h2<=hou2;

m1<=min1;m2<=min2;

s1<=sec1;s2<=sec2;

else

-----------闹铃时间现实和设置模式

h1<=seth1;h2<=seth2;

m1<=setm1;m2<=setm2;

s1<=“1111”;s2<=“1111”;

end if;end process disp;--------------------------yanshi:process(clk)variable fp:integer range 0 to 29999;begin if clk'event and clk='1' then if fp=29999 then fp:=0;

CP_5ms<= not CP_5ms;else

fp:=fp+1;end if;end if;end process;------------------quout:process(CP_5ms,keyin)begin if CP_5ms'event and CP_5ms='1' then Q1<=keyin;Q2<=Q1;Q3<=Q2;end if;end process;-------------------process(Q1,Q2,Q3)begin if(Q1='0' and Q2='0' and Q3='0')then keyout<='0';else keyout<='1';end if;end process;process(keyout,CJ)begin if Rising_edge(keyout)then if cj=“111” then cj<=“000”;

else CJ<=CJ+1;end if;end if;end process;end

one;

第二篇:多功能数字钟课程设计VHDL代码书上程序改

library ieee;use ieee.std_logic_1164.all;entity clock is port(clk1hz:in std_logic;--1hz脉冲--clk100:in std_logic;--100hz脉冲--weekclk:in std_logic;--星期调整脉冲--start_stop:in std_logic;--秒表启动/停止控制--reset:in std_logic;--秒表复位--adclk:in std_logic;--校时脉冲--setselect:in std_logic;--调整位选择脉冲--mode:in std_logic;--功能选择脉冲--showdate:in std_logic;--日期显示--dis:out std_logic_vector(23 downto 0);--显示输出--glisten:out std_logic_vector(5 downto 0);--闪烁指示--weekout:out std_logic_vector(3 downto 0);--星期输出--qh:out std_logic--整点报时--);end clock;architecture arch of clock is component adjust

port(adclk: in std_logic;

data_in: out std_logic_vector(7 downto 0));end component;component control

port(setclk: in std_logic;

setlap: out std_logic_vector(1 downto 0);

mode: in std_logic;

module: out std_logic_vector(2 downto 0));end component;component weekcounter

port(clk: in std_logic;

clk2: in std_logic;

q: out std_logic_vector(3 downto 0));end component;component stopwatch

port(clk: in std_logic;

reset: in std_logic;

start_stop: in std_logic;

centsec: out std_logic_vector(7 downto 0);

sec: out std_logic_vector(7 downto 0);

min: out std_logic_vector(7 downto 0));end component;component h_m_s_count

port(clk: in std_logic;

set: in std_logic;

setlap: in std_logic_vector(1 downto 0);

d:in std_logic_vector(7 downto 0);

sec:out std_logic_vector(7 downto 0);

min:out std_logic_vector(7 downto 0);

hour:out std_logic_vector(7 downto 0);

qh:out std_logic;

qc: out std_logic);end component;component y_m_d_count

port(clk: in std_logic;

set: in std_logic;

setlap: in std_logic_vector(1 downto 0);

data_in: in std_logic_vector(7 downto 0);

day: out std_logic_vector(7 downto 0);

month: out std_logic_vector(7 downto 0);

year: out std_logic_vector(7 downto 0));end component;component display

port(module: in std_logic_vector(2 downto 0);

showdate:in std_logic;

clk:in std_logic;

setlap:in std_logic_vector(1 downto 0);

watch: in std_logic_vector(23 downto 0);

time:in std_logic_vector(23 downto 0);

date:in std_logic_vector(23 downto 0);

dis: out std_logic_vector(23 downto 0);

glisten:out std_logic_vector(5 downto 0));end component;signal data_in,mcentsec,msec,mmin,ssec,smin,shour,sdate,smonth,syear:std_logic_vector(7 downto 0);signal setlap:std_logic_vector(1 downto 0);signal module:std_logic_vector(2 downto 0);signal qc:std_logic;signal watch,time,date:std_logic_vector(23 downto 0);begin u1:adjust port map(adclk,data_in);u2:control port map(setselect,setlap,mode,module);u3:stopwatch port map(clk100,reset,start_stop,mcentsec,msec,mmin);u4:h_m_s_count port map(clk1hz,module(1),setlap,data_in,ssec,smin,shour,qh,qc);u5:y_m_d_count port map(qc,module(2),setlap,data_in,sdate,smonth,syear);u6:display port map(module,showdate,clk1hz,setlap,watch,time,date,dis,glisten);u7:weekcounter port map(qc,weekclk,weekout);watch<=mmin&msec&mcentsec;time<=shour&smin&ssec;date<=syear&smonth&sdate;end arch;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity adjust is

port(adclk: in std_logic;

data_in: out std_logic_vector(7 downto 0));end adjust;architecture arch of adjust is signal temp2,temp1:std_logic_vector(3 downto 0);begin process(adclk)begin if rising_edge(adclk)then if temp1=“1001” then temp2<=temp2+'1';temp1<=“0000”;else

temp1<=temp1+'1';end if;if temp2=“1001” and temp1=“1001” then temp1<=“0000”;temp2<=“0000”;end if;end if;data_in<=temp2&temp1;end process;end arch;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity control is

port(setclk: in std_logic;--调整脉冲--

setlap: out std_logic_vector(1 downto 0);--调整位选择脉冲--

mode: in std_logic;--功能选择脉冲--

module: out std_logic_vector(2 downto 0)--功能输出--);end control;architecture arch of control is signal ssetlap:std_logic_vector(1 downto 0);signal s:std_logic_vector(3 downto 0);begin process(mode,setclk)begin if mode='1'then ssetlap<=“00”;elsif rising_edge(setclk)then if ssetlap=“10”then ssetlap<=“00”;else ssetlap<=ssetlap+'1';end if;end if;end process;setlap<=ssetlap;process(mode)begin if rising_edge(mode)then case s is when“0001”=>s<=“0010”;when“0010”=>s<=“0100”;when“0100”=>s<=“1000”;when“1000”=>s<=“0001”;when others=>s<=“0010”;end case;end if;end process;module<=s(3 downto 1);end arch;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity counter60 is

port(clk: in std_logic;--计数脉冲--

clr: in std_logic;--复位--

q: out std_logic_vector(7 downto 0);--计数值--

qc:out std_logic--进位输出--);end counter60;architecture arch of counter60 is signal temp1,temp2:std_logic_vector(3 downto 0);begin process(clr,clk)begin if clr='1'then temp1<=“0000”;temp2<=“0000”;elsif rising_edge(clk)then if temp1=“1001” then temp2<=temp2+'1';temp1<=“0000”;else temp1<=temp1+'1';end if;if temp2=“0101” and temp1=“1001” then temp1<=“0000”;temp2<=“0000”;qc<='1';else qc<='0';end if;end if;q<=temp2&temp1;end process;end arch;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity counter99 is

port(clk: in std_logic;--100vhz计数脉冲--

en: in std_logic;--计数使能--

clr: in std_logic;--复位--

q: out std_logic_vector(7 downto 0);--计数值--

qc: out std_logic--进位--);end counter99;

architecture arch of counter99 is signal temp1,temp2:std_logic_vector(3 downto 0);begin process(clr,clk)begin if clr='1'then temp1<=“0000”;temp2<=“0000”;elsif rising_edge(clk)then if en='1' then if temp1=“1001” then temp2<=temp2+'1';temp1<=“0000”;else

temp1<=temp1+'1';end if;if temp2=“1001” and temp1=“1001” then temp1<=“0000”;temp2<=“0000”;qc<='1';else qc<='0';end if;end if;end if;q<=temp2&temp1;end process;end arch;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity daycounter is

port(clk: in std_logic;--计数脉冲--

set: in std_logic;--调整信号--

day_in: in std_logic_vector(7 downto 0);--调整输入--

day_out: out std_logic_vector(7 downto 0);--天输出--

qc: out std_logic;--进位--

day28: in std_logic;--该位为1表示该月为28天--

day29: in std_logic;--该位为1表示该月为29天--

day30: in std_logic;--该位为1表示该月为30天--

day31: in std_logic--该位为1表示该月为31天--);end daycounter;architecture arch of daycounter is signal temp1,temp2:std_logic_vector(3 downto 0);signal days:std_logic_vector(7 downto 0);begin days<=“00101000” when day28='1'else

“00101001”when day29='1'else

“00110000”when day30='1'else

“00110001”when day31='1'else

“00000000”;process(clk,set,day_in,days)begin if set='1' then temp2<=day_in(7 downto 4);temp1<=day_in(3 downto 0);elsif rising_edge(clk)then if temp1=“1001” then temp2<=temp2+'1';temp1<=“0000”;else temp1<=temp1+'1';end if;if temp2&temp1=days then temp2<=“0000”;temp1<=“0001”;qc<='1';else qc<='0';end if;end if;end process;day_out<=temp2&temp1;end arch;library ieee;use ieee.std_logic_1164.all;entity days_control is port(month: in std_logic_vector(7 downto 0);--月份--

year2: in std_logic;--年份高位数字bcd码最低位--

year1: in std_logic_vector(1 downto 0);--年份低位数字bcd码末两位--

day28: out std_logic;--该位为1表示该月为28天--day29: out std_logic;--该位为1表示该月为29天--

day30: out std_logic;--该位为1表示该月为30天--

day31: out std_logic--该位为1表示该月为31天--);end days_control;architecture arch of days_control is begin process(month,year2,year1)begin case month is when “00000001”=>day28<='0';day29<='0';day30<='0';day31<='1';when “00000010”=>if(year2='0'and year1=“00”)or(year2='1'and year1=“10”)then

day28<='0';day29<='1';day30<='0';day31<='0';

else

day28<='1';day29<='0';day30<='0';day31<='0';

end if;when “00000011”=>day28<='0';day29<='0';day30<='0';day31<='1';when “00000100”=>day28<='0';day29<='0';day30<='1';day31<='0';when “00000101”=>day28<='0';day29<='0';day30<='0';day31<='1';when “00000110”=>day28<='0';day29<='0';day30<='1';day31<='0';when “00000111”=>day28<='0';day29<='0';day30<='0';day31<='1';when “00001000”=>day28<='0';day29<='0';day30<='0';day31<='1';when “00001001”=>day28<='0';day29<='0';day30<='1';day31<='0';when “00010000”=>day28<='0';day29<='0';day30<='0';day31<='1';when “00010001”=>day28<='0';day29<='0';day30<='1';day31<='0';when “00010010”=>day28<='0';day29<='0';day30<='0';day31<='1';when others=>day28<='0';day29<='0';day30<='0';day31<='1';end case;end process;end arch;library ieee;use ieee.std_logic_1164.all;entity display is

port(module: in std_logic_vector(2 downto 0);--功能选择--

showdate:in std_logic;--显示日期--

clk:in std_logic;--闪烁脉冲--

setlap:in std_logic_vector(1 downto 0);--闪烁位选择--

watch: in std_logic_vector(23 downto 0);--秒表计数值输入--

time:in std_logic_vector(23 downto 0);--时分秒计数值输入--date:in std_logic_vector(23 downto 0);--年月日计数值输入--

dis: out std_logic_vector(23 downto 0);--显示输出--

glisten:out std_logic_vector(5 downto 0)--闪烁输出--);end display;architecture arch of display is begin process(module,showdate,watch,time,date)begin if showdate='1'then dis<=date;else case module is when“001”=>dis<=watch;when“010”=>dis<=time;when“100”=>dis<=date;when others=>dis<=time;end case;end if;end process;process(clk,module,setlap)begin if module=“010”or module=“100”then case setlap is when“00”=>glisten(1 downto 0)<=clk&clk;

glisten(5 downto 2)<=“0000”;when“01”=>glisten(3 downto 2)<=clk&clk;

glisten(5 downto 4)<=“00”;

glisten(1 downto 0)<=“00”;when“10”=>glisten(5 downto 4)<=clk&clk;

glisten(3 downto 0)<=“0000”;when others=>glisten<=“000000”;end case;else glisten<=“000000”;end if;end process;end arch;library ieee;use ieee.std_logic_1164.all;entity dmux is

port(set:in std_logic;--调整信号--

setlap: in std_logic_vector(1 downto 0);--调整位选择--

d: in std_logic_vector(7 downto 0);--调整输入--

set1:out std_logic;

set2:out std_logic;

set3:out std_logic;

q1: out std_logic_vector(7 downto 0);

q2: out std_logic_vector(7 downto 0);

q3: out std_logic_vector(7 downto 0));end dmux;architecture arch of dmux is begin process(set,setlap,d)begin if set='1' then case setlap is when“00”=>set1<='1';set2<='0';set3<='0';

q1<=d;when“01”=>set1<='0';set2<='1';set3<='0';

q2<=d;when“10”=>set1<='0';set2<='0';set3<='1';

q3<=d;when others=>set1<='0';set2<='0';set3<='0';end case;else set1<='0';set2<='0';set3<='0';end if;end process;end arch;library ieee;use ieee.std_logic_1164.all;entity h_m_s_count is

port(clk: in std_logic;--1hz脉冲--

set: in std_logic;--调整信号--

setlap: in std_logic_vector(1 downto 0);--调整位选择--

d:in std_logic_vector(7 downto 0);--调整输入--

sec:out std_logic_vector(7 downto 0);--秒输出--

min:out std_logic_vector(7 downto 0);--分输出--

hour:out std_logic_vector(7 downto 0);--小时输出--

qh:out std_logic;--整点报时--

qc: out std_logic--进位--);end h_m_s_count;architecture arch of h_m_s_count is component sec_mincounter

port(clk: in std_logic;

set:in std_logic;

d:in std_logic_vector(7 downto 0);

q:out std_logic_vector(7 downto 0);

qc:out std_logic);end component;component hourcounter port(clk: in std_logic;

set:in std_logic;

d:in std_logic_vector(7 downto 0);

q: out std_logic_vector(7 downto 0);

qc:out std_logic);end component;component dmux

port(set:in std_logic;

setlap: in std_logic_vector(1 downto 0);

d: in std_logic_vector(7 downto 0);

set1:out std_logic;

set2:out std_logic;

set3:out std_logic;

q1: out std_logic_vector(7 downto 0);

q2: out std_logic_vector(7 downto 0);

q3: out std_logic_vector(7 downto 0));end component;signal secset,minset,hourset: std_logic;signal secin,minin,hourin:std_logic_vector(7 downto 0);signal qcsec,qcmin,qchour: std_logic;begin u1:dmux port map(set,setlap,d,secset,minset,hourset,secin,minin,hourin);u2:sec_mincounter port map(clk,secset,secin,sec,qcsec);u3:sec_mincounter port map(qcsec,minset,minin,min,qcmin);u4:hourcounter port map(qcmin,hourset,hourin,hour,qchour);qh<=qcmin;qc<=qchour;end arch;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity hourcounter is

port(clk: in std_logic;--计数脉冲--

set:in std_logic;--调整信号--

d:in std_logic_vector(7 downto 0);--调整时间--

q: out std_logic_vector(7 downto 0);--小时输出--

qc:out std_logic--进位--);end hourcounter;architecture arch of hourcounter is signal temp1,temp2:std_logic_vector(3 downto 0);begin process(clk,set)begin if set='1'then temp2<=d(7 downto 4);temp1<=d(3 downto 0);elsif rising_edge(clk)then if temp1=“1001” then temp2<=temp2+'1';temp1<=“0000”;else

temp1<=temp1+'1';end if;if temp2=“0010” and temp1=“0100” then temp1<=“0000”;temp2<=“0000”;qc<='1';else qc<='0';end if;end if;end process;q<=temp2&temp1;end arch;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity monthcounter is

port(clk: in std_logic;--计数脉冲--

set: in std_logic;--调整信号--

month_in: in std_logic_vector(7 downto 0);--调整输入--

month_out: out std_logic_vector(7 downto 0);--月输出--

qc: out std_logic--进位--);end monthcounter;architecture arch of monthcounter is signal temp1,temp2:std_logic_vector(3 downto 0);begin process(clk,set,month_in)begin if set='1' then temp2<=month_in(7 downto 4);temp1<=month_in(3 downto 0);elsif rising_edge(clk)then if temp1=“1001” then temp2<=temp2+'1';temp1<=“0000”;else

temp1<=temp1+'1';end if;if temp2=“0001”and temp1=“0010” then temp2<=“0000”;temp1<=“0001”;qc<='1';else qc<='0';end if;end if;end process;month_out<=temp2&temp1;end arch;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity sec_mincounter is port(clk: in std_logic;--计数脉冲--

set:in std_logic;--调整信号--

d:in std_logic_vector(7 downto 0);--调整时间输入--

q:out std_logic_vector(7 downto 0);--分和秒输出--

qc:out std_logic--进位--);end sec_mincounter;architecture arch of sec_mincounter is signal temp1,temp2:std_logic_vector(3 downto 0);begin process(clk,set)begin if set='1'then temp2<=d(7 downto 4);temp1<=d(3 downto 0);elsif rising_edge(clk)then if temp1=“1001” then temp2<=temp2+'1';temp1<=“0000”;else

temp1<=temp1+'1';end if;if temp2=“0101” and temp1=“1001” then temp1<=“0000”;temp2<=“0000”;qc<='1';else qc<='0';end if;end if;end process;q<=temp2&temp1;end arch;library ieee;use ieee.std_logic_1164.all;entity stopwatch is port(clk: in std_logic;--100hz脉冲--

reset: in std_logic;--复位--

start_stop: in std_logic;--启动/停止--

centsec: out std_logic_vector(7 downto 0);--百分秒输出,当超过60分转为秒--

sec: out std_logic_vector(7 downto 0);--秒输出,当超过60分转为分--

min: out std_logic_vector(7 downto 0)--分输出,当超过60分转为小时--);end stopwatch;architecture arch of stopwatch is component counter99 port(clk: in std_logic;

en: in std_logic;

clr: in std_logic;

q: out std_logic_vector(7 downto 0);

qc: out std_logic);end component;component counter60 port(clk: in std_logic;

clr: in std_logic;

q: out std_logic_vector(7 downto 0);

qc: out std_logic);end component;signal qc1,qc2,qc3,qc4,flag:std_logic;signal tcentsec,tsec,tmin,thour:std_logic_vector(7 downto 0);begin u1:counter99 port map(clk,start_stop,reset,tcentsec,qc1);u2:counter60 port map(qc1,reset,tsec,qc2);u3:counter60 port map(qc2,reset,tmin,qc3);u4:counter60 port map(qc3,reset,thour,qc4);process(qc3)begin if rising_edge(qc3)then flag<='1';end if;if flag='1' then centsec<=tsec;sec<=tmin;min<=thour;else centsec<=tcentsec;sec<=tsec;min<=tmin;end if;end process;end arch;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity weekcounter is

port(clk: in std_logic;--天脉冲--

clk2: in std_logic;--外部星期调整脉冲--

q: out std_logic_vector(3 downto 0)--星期输出--);end weekcounter;architecture arch of weekcounter is signal temp:std_logic_vector(3 downto 0);signal cp:std_logic;begin cp<=clk or clk2;process begin wait until rising_edge(cp);if temp=“0111” then temp<=“0001”;else

temp<=temp+'1';end if;q<=temp;end process;end arch;library ieee;use ieee.std_logic_1164.all;entity y_m_d_count is

port(clk: in std_logic;--计数脉冲--

set: in std_logic;--调整信号--

setlap: in std_logic_vector(1 downto 0);--调整位选择--

data_in: in std_logic_vector(7 downto 0);--调整输入--

day: out std_logic_vector(7 downto 0);--日输出--

month: out std_logic_vector(7 downto 0);--月输出--

year: out std_logic_vector(7 downto 0)--年输出--);end y_m_d_count;architecture arch of y_m_d_count is component daycounter

port(clk: in std_logic;

set: in std_logic;

day_in: in std_logic_vector(7 downto 0);

day_out: out std_logic_vector(7 downto 0);

qc: out std_logic;

day28: in std_logic;

day29: in std_logic;

day30: in std_logic;

day31: in std_logic);end component;component monthcounter

port(clk: in std_logic;

set: in std_logic;

month_in: in std_logic_vector(7 downto 0);

month_out: out std_logic_vector(7 downto 0);

qc: out std_logic);end component;component yearcounter

port(clk: in std_logic;

set: in std_logic;

year_in: in std_logic_vector(7 downto 0);

year_out: out std_logic_vector(7 downto 0));end component;component dmux

port(set:in std_logic;

setlap: in std_logic_vector(1 downto 0);

d: in std_logic_vector(7 downto 0);

set1:out std_logic;

set2:out std_logic;

set3:out std_logic;

q1: out std_logic_vector(7 downto 0);

q2: out std_logic_vector(7 downto 0);

q3: out std_logic_vector(7 downto 0));end component;component days_control

port(month: in std_logic_vector(7 downto 0);

year2: in std_logic;

year1: in std_logic_vector(1 downto 0);

day28: out std_logic;

day29: out std_logic;

day30: out std_logic;

day31: out std_logic);end component;signal dayset,monthset,yearset: std_logic;signal qcday,qcmonth: std_logic;signal dayin,monthin,yearin: std_logic_vector(7 downto 0);signal smonth,syear:std_logic_vector(7 downto 0);signal day28,day29,day30,day31:std_logic;begin u1:dmux port map(set,setlap,data_in,dayset,monthset,yearset,dayin,monthin,yearin);u2:daycounter port map(clk,dayset,dayin,day,qcday,day28,day29,day30,day31);u3:monthcounter port map(qcday,monthset,monthin,smonth,qcmonth);u4:yearcounter port map(qcmonth,yearset,yearin,syear);u8:days_control port map(smonth,syear(4),syear(1 downto 0),day28,day29,day30,day31);month<=smonth;year<=syear;

end arch;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity yearcounter is

port(clk: in std_logic;--计数脉冲--

set: in std_logic;--调整信号--

year_in: in std_logic_vector(7 downto 0);--调整输入--

year_out: out std_logic_vector(7 downto 0)--年输出--);end yearcounter;architecture arch of yearcounter is signal temp1,temp2:std_logic_vector(3 downto 0);begin process(clk,set,year_in)begin if set='1' then temp2<=year_in(7 downto 4);temp1<=year_in(3 downto 0);elsif rising_edge(clk)then if temp1=“1001” then temp2<=temp2+'1';temp1<=“0000”;else

temp1<=temp1+'1';end if;if temp2=“1001” and temp1=“1001” then temp1<=“0000”;temp2<=“0000”;end if;end if;end process;year_out<=temp2&temp1;end arch;

第三篇:C语言课程设计数字钟程序

C语言数字钟程序

#include“stdio.h” void clock(int t);void main(){ int t,i,j,n;for(t=0;t<10;t++){ clock(t);sound(590);for(n=0;n<4;n++){ delay(100000000);} nosound();for(n=0;n<6;n++){ delay(100000000);} for(j=8;j<=18;j++){ for(i=1;i<=80;i++){ gotoxy(i,j);putchar(0);} } } } void clock(int t){ int i,j;textcolor(11);if(t==0){ for(i=0;i<11;i++){ gotoxy(60,8+i);cprintf(“%c”,14);} for(i=0;i<11;i++){ gotoxy(51,8+i);cprintf(“%c”,14);} for(j=0;j<11;j+=10){ for(i=0;i<8;i++){ gotoxy(59-i,8+j);cprintf(“%c”,14);} } } if(t==1){ for(i=0;i<11;i++){ gotoxy(60,8+i);cprintf(“%c”,14);} } if(t==2){ for(j=0;j<2;j++){ for(i=0;i<6;i++){ gotoxy(60-j*8,8+i+j*5);cprintf(“%c”,14);} } for(j=0;j<11;j+=5){ for(i=0;i<9;i++){ gotoxy(60-i,8+j);cprintf(“%c”,14);} } } if(t==3){ for(i=0;i<11;i++){ gotoxy(60,8+i);cprintf(“%c”,14);} for(j=0;j<11;j+=5){ for(i=0;i<8;i++){ gotoxy(59-i,8+j);cprintf(“%c”,14);} } } if(t==4){ for(i=0;i<11;i++){ gotoxy(60,8+i);cprintf(“%c”,14);} for(i=0;i<6;i++){ gotoxy(52,8+i);cprintf(“%c”,14);} for(i=0;i<8;i++){ gotoxy(59-i,13);cprintf(“%c”,14);} } if(t==5){ for(j=0;j<2;j++){ for(i=0;i<6;i++){ gotoxy(52+j*8,8+i+j*5);cprintf(“%c”,14);} } for(j=0;j<11;j+=5){ for(i=0;i<9;i++){ gotoxy(60-i,8+j);cprintf(“%c”,14);} } } if(t==6){ for(j=0;j<2;j++){ for(i=0;i<6;i++){ gotoxy(52+j*8,8+i+j*5);cprintf(“%c”,14);} } for(i=0;i<6;i++){ gotoxy(52,13+i);cprintf(“%c”,14);} for(j=0;j<11;j+=5){ for(i=0;i<9;i++){ gotoxy(60-i,8+j);cprintf(“%c”,14);} } } if(t==7){ for(i=0;i<11;i++){ gotoxy(60,8+i);cprintf(“%c”,14);} for(i=0;i<8;i++){ gotoxy(59-i,8);cprintf(“%c”,14);} } if(t==8){ for(i=0;i<11;i++){ gotoxy(60,8+i);cprintf(“%c”,14);} for(i=0;i<11;i++){ gotoxy(52,8+i);cprintf(“%c”,14);} for(j=0;j<11;j+=5){ for(i=0;i<8;i++){ gotoxy(59-i,8+j);cprintf(“%c”,14);} } } if(t==9){ for(i=0;i<11;i++){ gotoxy(60,8+i);cprintf(“%c”,14);} for(i=0;i<6;i++){ gotoxy(52,8+i);cprintf(“%c”,14);} for(j=0;j<2;j++){ for(i=0;i<8;i++){ gotoxy(59-i,8+j*5);cprintf(“%c”,14);} } } }

第四篇:数字钟程序-c语言课程设计

#include“stdio.h” void clock(int t);void main(){ int t,i,j,n;for(t=0;t<10;t++){ clock(t);sound(590);for(n=0;n<4;n++){ delay(100000000);} nosound();for(n=0;n<6;n++){ delay(100000000);} for(j=8;j<=18;j++){ for(i=1;i<=80;i++){ gotoxy(i,j);putchar(0);} } } } void clock(int t){ int i,j;textcolor(11);if(t==0){ for(i=0;i<11;i++){ gotoxy(60,8+i);cprintf(“%c”,14);} for(i=0;i<11;i++){ gotoxy(51,8+i);cprintf(“%c”,14);} for(j=0;j<11;j+=10){ for(i=0;i<8;i++){ gotoxy(59-i,8+j);cprintf(“%c”,14);} } } if(t==1){ for(i=0;i<11;i++){ gotoxy(60,8+i);cprintf(“%c”,14);} } if(t==2){ for(j=0;j<2;j++){ for(i=0;i<6;i++){ gotoxy(60-j*8,8+i+j*5);cprintf(“%c”,14);} } for(j=0;j<11;j+=5){ for(i=0;i<9;i++){ gotoxy(60-i,8+j);cprintf(“%c”,14);} } } if(t==3){ for(i=0;i<11;i++){ gotoxy(60,8+i);cprintf(“%c”,14);} for(j=0;j<11;j+=5){ for(i=0;i<8;i++){ gotoxy(59-i,8+j);cprintf(“%c”,14);} } } if(t==4){ for(i=0;i<11;i++){ gotoxy(60,8+i);cprintf(“%c”,14);} for(i=0;i<6;i++){ gotoxy(52,8+i);cprintf(“%c”,14);} for(i=0;i<8;i++){ gotoxy(59-i,13);cprintf(“%c”,14);} } if(t==5){ for(j=0;j<2;j++){ for(i=0;i<6;i++){ gotoxy(52+j*8,8+i+j*5);cprintf(“%c”,14);} } for(j=0;j<11;j+=5){ for(i=0;i<9;i++){ gotoxy(60-i,8+j);cprintf(“%c”,14);} } } if(t==6){ for(j=0;j<2;j++){ for(i=0;i<6;i++){ gotoxy(52+j*8,8+i+j*5);cprintf(“%c”,14);} } for(i=0;i<6;i++){ gotoxy(52,13+i);cprintf(“%c”,14);} for(j=0;j<11;j+=5){ for(i=0;i<9;i++){ gotoxy(60-i,8+j);cprintf(“%c”,14);} } } if(t==7){ for(i=0;i<11;i++){ gotoxy(60,8+i);cprintf(“%c”,14);} for(i=0;i<8;i++){ gotoxy(59-i,8);cprintf(“%c”,14);} } if(t==8){ for(i=0;i<11;i++){ gotoxy(60,8+i);cprintf(“%c”,14);} for(i=0;i<11;i++){ gotoxy(52,8+i);cprintf(“%c”,14);} for(j=0;j<11;j+=5){ for(i=0;i<8;i++){ gotoxy(59-i,8+j);cprintf(“%c”,14);} } } if(t==9){ for(i=0;i<11;i++){ gotoxy(60,8+i);cprintf(“%c”,14);} for(i=0;i<6;i++){ gotoxy(52,8+i);cprintf(“%c”,14);} for(j=0;j<2;j++){ for(i=0;i<8;i++){ gotoxy(59-i,8+j*5);cprintf(“%c”,14);} } } }

第五篇:如何编写和语言程序解读

如何编写和汇编语言程序

可以用普通文本编辑器编辑汇编语言源程序。常用的有 MS-DOS 下的 EDIT 文本编辑程序,Windows 下的写字板(WORDPAD.EXE)等。用户通过屏幕编辑程序键入源程序,检查无误,可将源程序存到汇编系统盘上,该程序的扩展名为· ASM。软件运行基本环境

运行汇编程序必备的软件环境: DOS 操作系统;汇编系统。汇编系统盘应包含如下文件: MASM 宏汇编程序文件 LISK 连接程序文件

CRFF 索引程序文件(也可不用)汇编源程序编写)源程序的书写格式

当 CPU 访问内存时,是把存储器分成若干个段,通过 4 个段寄存器中存放的地址对内存储器访问,因此在编源程序时必须按段的结构来编制程序。由于每个段的物理空间为≤ 64KB,所以程序中各段可以分别为一个或几个。源程序的书写一般有如下形式:

逻辑堆栈段 堆栈段名 SEGMENT STACK 用变量定义预置的堆栈空间 · ·

堆栈段名 ENDS 逻辑数据段 数据段名 SEGMENT 用变量定义预置的数据空间 · ·

数据段名 ENDS 逻辑代码段 代码段名 SEGMENT ASSUME 定义各段寻址关系 过程名 PROC … 程序 · ·

过程名 ENDP 代码段名 ENDS END 过程名或起始标号

在源程序中最少要有一个代码段,数据段根据需要可有可无,也可以增设附加段。对于堆栈段也可以根据需要可有可无,但在连接(LINK)时计算机将显示警告性的错误: Warning : N STACK segment There was 1 error detected.在程序中如果没有用到堆栈时,该错误提示不影响程序的运行,如果程序中用到堆栈时必须设置堆栈段。其中: SEGMENT、ASSUME、PROC … ENDP 为伪指令,伪指令是发给汇编程序 ASM 的,而不和微处理器打交道,在汇编时不产生目标代码,只是把源程序中各段的设置情况告诉汇编程序。)段寄存器的段地址的装入

Assume 伪指令语句只是建立了当前段与段寄存器的联系,但不能把各段的段地址装入相应的段寄存器中,段寄存器的段地址的装入是在程序中完成的。(1)DS、ES、SS 的装入

由于段寄存器不能用立即数寻址方式直接传送,所以段地址装入可通过通用寄存器传送给段寄存器。MOV AX,逻辑段名 MOV 段寄存器,AX 其中逻辑段名为程序中定义各逻辑段的名字,(不包括代码段),段寄存器是指与各逻辑段相对应的各段寄存器(DS、ES、SS)。(2)CS 的装入

代码段寄存器是装当前执行目标代码的段地址,IP 是提供下一条要执行的目标代码的偏移量,为了保证程序的正确执行,CS 和 IP 装入新值时是一起完成的。对 CS 和 IP 的装入有如下几种情况:

①根据用户程序中的伪指令 END 后的标号为 CS 和 IP 提供代码段的段地址和目标代码的偏移地址。

②在程序运行过程中,当执行某些指令和操作时,CPU 自动修改 CS 和 IP 的值,使它们指向新的代码段。)程序中的数据与变量

在汇编源程序中的数据除了立即数,由指令产生的数和通过键盘输入的数以外,还胡大量的数据是通过伪指令语句进行预置和分配的,也就是在某逻辑段中(除代码段),将所需的数据以某种形式存放起来,在程序中可任意调用。在数据定义的同时还可以定义变量,将变量与数据结合在一起。可以为某个变量分配存储空间以便在程序执行过程中存放中间结果和最终结果,使用起来极为方便。

(1)变量与数据的定义

变量与数据的定义可以通过符号定义伪指令 EQU、=和数据定义伪指令 DB 或 DW 或 DD 来实现。EQU 和=可以出现在程序的逻辑段内也可出现在逻辑段外。

(2)汇编程序中数据的提供方法 ①用数据定义伪指令提供数据

如果程序要求原始数据为一批数据时,用数据定义伪指令 DB、DW 和 DD 来提供较为方便。②用立即数的形式提供数据

当原始数据只有几个时,一般用立即数的方法来提供。当然,用立即数的方法只是将一个数据传送到通用寄存器中,它只是通过通用寄存器传送数据。③用编程的方法提供数据

假如原始数据是一组有规律的数据项,则用编程序的方法形成这一组数据,不用专门为这组数据分配存储单元,节省了存储空间。④用键盘提供数据

当原始数据为任意数据时,一般用键盘输入方法,调用 DOS 21H 中断。

(3)数据的输出方式 ①在显示器上显示一个字符

调用 02H 号功能调用号,发 21H 号中断,将要显示的字符的 ASCII 码送入 DL,就可在显示器上显示该字符。②在打印机上输出一个字符

调用 05H 号功能调用号,发 21H 号中断,将要打印字符的 ASCII 码送入 DL,就可在打印机上打印出 DL 中的字符。

4)返回 DOS 状态的方法

当执行.EXE 文件时,是在 DOS 状态下进行的,如果希望在执行完.EXE 文件后正常返回 DOS 状态,一般用如下两种方法:采用 DOS 4CH 功能调用和采用返回(RET)断点的方法。

汇编处理 — 执行宏汇编程序 MASM.EXE

用汇编语言编写的源程序必须是一个完整的源程序。宏汇编程序对汇编语言源程序的汇编过程包括语法检查和数据代码汇编两部分,生成目标程序和辅助信息文件。为了完成汇编任务,汇编程序一般采用两遍扫描的方法,第一遍扫描源程序产生符号表、处理伪指令等,第二遍扫描产生机器指令代码、确定数据等。源程序用宏汇编程序翻译(汇编)后,可以得到三个文件:一个是扩展名为.OBJ 的目标文件,在该文件中,将源程序的操作码部分变为机器码,但地址操作数是可浮动的相对地址,而不是实际地址,因此需经 LINK 连接文件进行连接才能形成可执行文件。第二个文件是列表文件,扩展名为.LST,它把源程序和目标程序列表,以供检查程序用。第三个文件是交叉索引文件,扩展名为.CRF,它是一个对源程序所用的各种符号进行前后对照的文件。其中目标文件是必须产生的,而其它两个文件在需要时给予命令就可产生,对连接和执行汇编程序无直接的关系。)汇编操作过程

在 DOS 状态下,键入 MASM ↓则调入宏汇编程序,屏幕显示与操作如下: masm ↓ Microsoft(R)Macro Assemble Version 5.00 Copyright(C)Microsoft Corp 1981-1985,1987,All right reserved.Source filename [.ASM ]: MYFILE ↓ Object filename [MYFILE.OBJ ]: MYFILE ↓ Source listing [NUL.LST ]: MYFILE ↓ Cross-reference [NUL.CRF]: MYFILE ↓ 50678 + 410090 Bytes symbol space free 0 Warning Errors 0 Severe Errors 其中划线部分为用户键入部分,MYFILE 为源程序名(MYFILE.ASM),方括号中是机器规定的默认文件名,如果用户认为方括号内的文件名就是要键入的文件名,则可只在划线部分键入回车符。如果不想要列表文件和交叉索引文件,则可在 [NUL.LST ] 和 [NUL.CRF] 后不键入文件名只键入回车符。

当回答完上述四个询问后,汇编程序就对源程序进行汇编。在汇编过程中,如果发现源程序中有语法错误,则提示出错信息,指出是什么性质的错误,错误类型,最后列出错误的总数。之后可重新进入屏幕编辑状态,调入源程序(MYFILE.ASM)进行修改,修改完毕,再进行汇编,直到汇编通过为止。

如果在汇编时不需要产生列表文件(.LST)和交叉索引文件(.CRF),调用汇编程序时可用分号结束。如果需要产生.OBJ 和.LST 文件,不需要.CRF 文件,则在分号前面加两个逗号即可。如果 4 个文件都需要,用简便的操作方法是在分号前用了 3 个逗号。)列表文件(.LST)

列表文件(.LST)是通过汇编程序(MASM)产生的,可以在 DOS 状态下用 TYPE 命令显示或打印该文件,以便分析调试源程序。如显示 D 盘上已存在的列表文件 MYFILE.LST 操作方法如下: D> TYPE MYFILE.LST ;↓ 列表程序由三部分组成:(1)源程序和目标程序清单

列表程序同时列出源程序和对应的机器语言清单。列表程序的第一列给出每条指令所在行号;第二列给出从段的首地址开始的每条指令存放的偏移地址;接着是数字列,给出对应每条语句的机器码和对应于存放在栈段和数据段的值,在机器码加上“ R ”的指令表示:这条指令在连接时可能产生与列出来的偏移地址不同的地址,因为这些偏移地址可能与其它模块有关;最右边就是用汇编语言编写的源程序。(2)段信息汇总表

在段信息汇总表中列出该程序用了哪几个段,如:代码段 CODE、数据段 DATA 和堆栈段 STACK ;每个段所占存储空间的长度(字节数);每个段的定位类型,包括 PAGE(页)、PARA(节)、WORD(字)和 BYTE(字节),它们表示此段的起始边界要求,即起始边界地址应分别可以被 256、16、2 和 1 除尽。该列表清单 中是以 PARA 为 CODE 段、DATA 段和 STACK 段的起始边界地址。最后一列为段的组合类型;段的组合类型是告诉连接程序,本段与其它段的关系,组合类型有 NONE、PUBLIC、COMMOM、AT 表达式、STACK 和 MEMORY。NONE :表示本段与其它段不发生逻辑关系,即每段都有自己的基本地址。是隐含组合类型。

STACK :表明连接程序首先要把本段与同名同类别的其它段相邻地连接在一起,然后为所有定义为栈段的连接在一起的段,定义一个共同的段基地址,即连接成一个物理段。

在列表程序的源程序中只有一个栈段,在栈段定义中给出了组合类型为 STACK,因此在段信息汇总表中列出了该项,在本程序中它没有任何意义,因为没有其它栈段与它连接,只是为了说明这个问题而设置的。(3)符号汇总表

在列表程序中最后部分列出了符号汇总,是指在源程序中用户定义的符号名、类型、值和所在段。

如果在源程序中存在某些语法错误时,列表文件可提示某条语句有哪些错误,出错提示显示在出错指令行的下面,因此用户可借助列表文件很快地找到错误行,以便调试。另外由于列表文件给出了各条指令的偏移地址,对和程序时设置断点很方便。)交叉索引文件(.CRF)

汇编后产生的交叉索引文件,扩展名为.CRF, 它列出了源程序中定义的符号(包括:标号、变量等)和程序中引用这些符号的情况。如果要查看这个符号表,必须使用 CREF.EXE 的文件,它根据.CRF 文件建立一个扩展名为.REF 的文件,而后再用 DOS 的 TYPE 命令显示,就可以看到这个符号使用情况表。具体操作方法如下: D> CREF ↓

cref filename [.CRF] : MYFILE ↓ list filename [MYFILE.REF] : ↓ D> TYPE MYFILE.REF ↓

目标代码链接程序----LINK.EXE

用汇编语言编写的源程序经过汇编程序(MASM)汇编后产生了目标程序(.OBJ),该文件是将源程序操作码部分变成了机器码,但地址是可浮动的相对地址(逻辑地址),因此必须经过连接程序 LINK 连接后才能运行。连接程序 LINK 是把一个或多个独立的目标程序模块装配成一个可重定位的可执行文件,扩展名为.EXE 文件。此外还可以产生一个内存映象文件,扩展名为.MAP。1)连接程序执行过程

在 DOS 状态下,键入 LINK ↓(或 LINK MYFILE ↓)则系统调入 LINK 程序,屏幕显示操作如下: D> LINK ↓

IBM Personal Computer Linker Version 2.00(C)Copyright IBM Corp 1981,1982,1983 Object Modules [.OBJ] : MYFILE ↓ Run File [MYFILE.EXE] : MYFILE ↓ List File [NUL.MAP] : MYFILE ↓ Libraries [.LIB] : ↓

其中划线部分为用户键入部分,MYFILE 为源程序名,方括号内为机器默认文件名,当用户认为方括号中的文件名就是要键入的文件名时,可在冒号后面只键入回车。

其中 MAP 文件是否需要建立,由用户决定,需要则键入文件名,不需要则直接送入一个回车键。

最后一个询问是问是否在连接时用到库文件,对于连接汇编语言源程序的目标文件,通常是不需要的,因此直接键入回车键。

与汇编程序一样,可以在连接时用分号结束后续询问。例如:

D> LINK MYFILE ;↓

IBM Personal Computer Linker Version 2.00(C)Copyright IBM Corp 1981,1982,1983 连接后只产生 MYFILE.EXE 文件。如果除 MYFILE.EXE 文件外还要产生 MYFILE.MAP 文件,则在分号前加两个逗号。D> LINK MYFILE,;↓ IBM Personal Computer Linker Version 2.00(C)Copyright IBM Corp 1981,1982,1983 2)内存映象文件(.MAP)

由连接程序 LINK 产生的扩展名为.MAP 文件,它实际上是连接程序的列表文件,它给出了每个段的地址分配情况及长度。

在 DOS 状态下,用 TYPE 命令显示打印出来。例如: D> TYPE MYFILE.MAP ↓ Start Stop Length Name Class 00000H 0000FH 0010H DATA 00010H 0004FH 0040H STACK 00050H 0005FH 0010H CODE Origin Group Program entry point at 0005:0000 从中可以看到,源程序 MYFILE 中定义了三个段:数据段(DATA)起始地址为 00000H,终止地址为 0000FH,长度为 0010H 个字节;堆栈段(STACK)起始地址为 00010H,终止地址为 0004FH,长度为 0040H 个字节;代码段(CODE)起始地址为 00050H,终止地址为 0005FH,长度为 0010H 个字节。

应用程序执行

当用连接程序 LINK 将目标程序(.OBJ)连接定位后,可产生可执行的应用程序文件(.EXE),可以在 DOS 状态下执行该程序。执行操作如下: D> MYFILE ↓ 或 D> MYFILE.EXE ↓

在源程序 MYFILE 中如果有显示结果的指令,则在执行程序后可以看到执行结果;如需要动态调试应用程序 MYFILE.EXE,则可以借助动态调试程序 DEBUG.COM 来进行调试、运行,DEBUG 是一种支持命令行方式的汇编语言编程调试工具。

动态调试程序 DEBUG.COM 在编写和运行汇编程序的过程中,会遇到一些错误和问题,需要对程序进行分析和调试,调试程序 DEBUG 就是专为汇编语言设计的一种调试工具。它在调试汇编语言程序时有很强的功能,能使程序设计者接触到机器内部,能观察和修改寄存器和存储单元内容,并能监视目标程序的执行情况,使用户真正接触到 CPU 内部,与计算机产生最紧密的工作联系。

动态和程序 DEBUG 的主要特点 DEBUG 的执行 DEBUG 命令格式 主要 DEBUG 命令

动态和程序 DEBUG 的主要特点)能够在最小环境下运行汇编程序

在 DOS 状态下运行汇编程序,必须将程序经过 MASM 汇编程序,而后还要经过 LINK 连接程序产生可执行程序,才能最终运行,比较麻烦。在 DEBUG 状态下,为用户提供了调试、控制测试的环境,可以在此环境下进行编程、调试、监督、执行用户编写的汇编程序。因此调试周期短,为用户提供了极大的方便。2)提供极简单的修改手段

DEBUG 提供了修改命令,可以修改内存单元内容,修改寄存器的内容,为调试程序、修改程序带来了方便。3)提供用户与计算机内部联系的窗口

DEBUG 具有显示命令,它既可以使用户看到某内存单元或某一块单元内容,也可以看到 CPU 内部各寄存器的内容。用单步执行命令实现跟踪执行,每执行一步都使用户看到各寄存器的内容的变化,以便分析和调整程序。4)可装入、修改或显示任何文件

当然在 DEBUG 状态下运行汇编程序也具有一定局限性。在 DEBUG 状态下运行的程序不能使用宏汇编程序中的宏指令,大部分伪指令也不能使用,因此只能把程序分段调试。此外,不能调试太长的程序,只能分块进行中程序设计。在 DEBUG 状态下调试好的程序不能形成可执行文件(.EXE),因此调试好的程序只能记下,到编辑环境下重新键入调试好的程序,通过汇编程序(如 MASM),再通过连接程序(LINK)形成可执行文件(.EXE)。

DEBUG 的执行

在操作系统(DOS 或 WIndows)命令行方式下,直接调入 DEBUG 程序,键入命令的格式如下: D>DEBUG [d:][Path][filename[.ext]][Parm1][Parm2] 其中 [] 的内容为可选项,可以有也可以缺省。

[d:] 为驱动器号,指要调入 DEBUG 状态的可执行文件在哪个驱动器中,如 A:、B:、C: 等。[Path] 为路径,指要调入 DEBUG 状态的可执行文件是在哪个目录下或子目录下。

[filename[.ext]],指要调入 DEBUG 状态下的可执行文件的文件名,该文件可以是通过编辑、汇编、连接后产生的可执行文件,也可以是在 DEBUG 状态下汇编的程序 段,通过写盘命令 W 写入磁盘的文件。[Parm1][Parm2] 为任选参数,是给定文件的说明参数。

在启动 DEBUG 时,如果输入 filename(文件名),则 DEBUG 程序把指定文件装入内存,用户可以通过 DEBUG 的命令对指定文件进行修改、显示或执行。如果没有文件名,则是以当前内存的内容工作,或者用命名命令或装入命令把需要的文件装入内存,然后再通过 DEBUG 命令进行修改、显示或执行。当启动 DEBUG 程序后,屏幕上出现“—”,说明系统已进入 DEBUG 状态。DEBUG 命令格式(1)DEBUG 命令都是一个英文字母,后面跟着一个或多个有关参数。多个操作参数之间用“ , ”或空格隔开。(2)DEBUG 命令必须接着按 ENTER 键,命令才有效。

(3)参数中不论是地址还是数据,均用十六进制数表示,但十六进制数据后面不要用“ H ”。(4)可以用 Ctrl 和 Break 键来停止一个命令的执行,返回到 DEBUG 的提示符“—”下。(5)用 Ctrl - Num Lock 键中止正在上卷的输出行,再通过按任意键继续输出信息。主要 DEBUG 命令

(1)汇编命令 A

格式: a.A [ 段寄存器名 ]:[ 偏移地址 ] b.A [ 段地址 ]:[ 偏移地址 ] c.A [ 偏移地址 ] d.A 功能:用该命令可以将汇编语言程序直接汇编进入内存。

当键入 A 命令后,显示段地址和偏移地址等待用户键入汇编指令,每键入一条汇编指令回车后,自动显示下一条指令的段地址和偏移地址,再键入下一条汇编指令,直到汇编语言程序全部键入,又显示下一地址时可直接键入回车返回到提示符“-”为止。

其中 a 的段地址在段地址寄存器中,因此在使用该命令时必须将段地址寄存器送入段地址,c 的地址在 CS 中,d 的段地址在 CS 中,偏移地址为 100H。

(2)显示内存命令 D 格式: a.D [ 地址 ] b.D [ 地址范围 ] c.D 功能:显示指定内存范围的内容。

显示的内容为两种形式:一种为十六进制内容,一种为与十六进制相对应的 ASCII 码字符,对不可见字符以“·”代替。

对于 a、c 每次显示 128 个字节内容,b 显示的字节数由地址范围来决定。

若命令中有地址,则显示的内容从指定地址开始,若中中无地址(如 c)则从上一个 D 命令所显示的最后一个单元的下一个单元开始。若以前没有使用过 D 命令,则以 DEBUG 初始化的段寄存器的内容为起始段地址,起始偏移地址为 100H,即 CS:100。

对于 a 中的地址为偏移地址,段地址为 CS 的内容,对 b 中的地址范围,可以指定段地址和起始偏移地址和终止偏移地址。

(3)修改存储单元内容命令 E 格式: a · E [ 地址 ] [ 内容表 ] b · E [ 地址 ] 功能: a ·用命令所给定的内容表去代替指定地址范围的内存单元内容。b ·一个单元一个单元地连续修改单元内容。

其中:内容表为一个十六进制数,也可以是用单引号括起的一串字符。

(4)填充内存命令 F

格式: F [ 范围 ][ 单元内容表 ] 功能:将单元内容表中的内容重复装入内存的指定范围内。

(5)内存搬家命令 M

格式: M [ 源地址范围 ][ 目标起始地址 ] 其中源地址范围和目的起始地址为偏移地址,段地址为 DS 的内容。功能:把源地址范围的内容搬至以目标起始地址开始的存储单元中。

(6)比较命令 C

格式: C [ 源地址范围 ],[ 目标地址 ] 其中源地址范围是由起始地址和终止地址指出的一片连续的存储单元,目标地址为与源地址所指单元对比的目标地址起始地址。功能:从源地址范围是由起始的地址单元开始逐个与目标起始地址往后的单元顺序比较每个单元内容,比较到源终止地址为止。比较结果如果一致则不显示任何信息,如果不一致,则以 [ 源地址 ][ 源内容 ][ 目的内容 ][ 目的地址 ] 的形式显示失败单元地址及内容。

(7)搜索指定内容命令 S 格式: S [ 地址范围 ][ 表 ] 功能:在指定地址范围内搜索表中内容,搜索到就显示表中元素所在地址。

(8)检查和修改寄存器内容命令 R 格式: a · R b · R [ 寄存器名 ] 功能: a ·显示 CPU 内部所有寄存器的内容和全部标志位的状态。b ·显示和修改一个指定寄定器的内容和标志位的状态。

其中对状态标志寄存器 FLAG 以位的形式显示,显示时,8 个状态标志的显示次序和符号如表 B - 1 所示。表 B - 1 状态标志显示形式

标 志 位 溢出标志 OF 方向标志 DF 中断标志 IF 符号标志 SF 零标志 ZF 辅助进位 AF 奇偶标志 PF 进位标志 CF

(9)跟踪与显示命令 T

格式: a · T[ =地址 ] 或 T [ 地址 ] b · T[ =地址 ][ 条数 ] 或 T [ 地址 ][ 条数 ] 功能: a ·执行一条指定地址处的指令,停下来,显示 CPU 所有寄存器内容和全部标志位的状态,以及下一条指令的地址和内容。

b ·为多条跟踪命令,从指定地址开始;若命令中用 [ 地址 ] 给定了起始地址,则从起始地址开始,若未给定,则从当前地址(CS:IP)开始,执行命令中的 [ 条数 ] 决定一共跟踪几条指令后返回 DEBUG 状态。

(10)反汇编命令 U 格式: a · U [ 地址 ] b · U [ 地址范围 ] 功能:将指定范围内的代码以汇编 语言形式显示,同时显示该代码位于内存的地址和机器。

若在命令中没有指定地址则以上一个 U 命令的最后一条指令地址的下一个单元作为起始地址;若没有输入过 U 命令,则以 DEBUG 初始化段寄存器的值作为段地址,以 0100H 作为偏移地址。

(11)命名命令 N 格式: N 文件名

功能:在调用 DEBUG 时,没有文件名,则需要用 N 命令将要调用的文件名格式化到 CS:5CH 的文件控制块中,才能用 L 命令把它调入内存进行调试(其它形式参考 DOS 手册)。

(12)读盘命令 L

格式: a · L [ 地址 ][ 驱动器号 ][ 起始扇区号 ][ 所读扇区个数 ] b · L [ 地址 ] c · L 功能: a ·把指定驱动器和指定扇区范围的内容读到内存的指定区域中。其中地址是读入内存的起始地址,当输入时没有给定地址,则隐含地址为 CS:100H。起始扇区号指逻辑扇区号的起始位置。所读扇区个数是指从起始扇区号开始读到内存几个扇区的内容。驱动器号为 0 或 1,0 表示 A 盘,1 表示 B 盘。

b ·读入已在 CS:5CH 中格式化的文件控制块所指定的文件。在使用该命令前用 N 命令命名即可将要读入的文件名格式化到 CS:5CH 的文件控制块中,其中地址为内存地址。

状 态 有 / 无 增 / 减 开 / 关 负 / 正 零 / 非 有 / 无 偶 / 奇 有 / 无

显示形式(置位 / 复位)

OV/NV DN/UP EI/DI NG/PL ZR/NZ AC/NA PE/PO CY/NC c ·同 b ·地址隐含在 CS : 100H 中。

当读入的文件有扩展名.COM 或.EXE,则始终装入 CS:100H 中,命令中指定了地址也没用。其中 BX 和 CX 中存放所读文件的字节数。

(13)写盘命令 W

格式: a · W[ 地址 ][ 驱动器号 ][ 起始扇区号 ][ 所写扇区个数 ] b · W[ 地址 ] c · W 功能: a · 把在 DEBUGU 状态下调试的程序或数据写入指定的驱动器中 , 起始扇区号 , 所写扇区个数为要占盘中几个扇区。

写盘指定扇区的操作应十分小心,如有差错将会破坏盘上的原有内容。如果在命令行中的地址只包含偏移地址,W 命令认为段地址在 CS 中。

b ·当键入不带参数的写盘命令时,(或只键入地址参数的写盘命令),写盘命令把文件写到软盘上。该文件在用 W 命令之前用命名命令 N 将文件格式化在 CS:5CH 的文件控制块中。c ·只有 W 命令以前而没有任何参数时,与 N 配合使用进行写盘操作。在用 W 命令以前在 BX 和 CX 中应写入文件的字节数。

(15)输出命令 O

格式: O[ 端口地址 ] [ 字节值 ] 功能:向指定端口地址输出一个字节。

(16)运行命令 G

格式: G [ =地址 ][ 地址 [ 地址… ]] 功能:执行用户正在调试的程序。

其中地址为执行的起始地址,以 CS 中内容作为段地址,以等号后面的地址为偏移地址。再后面的地址为断点地址。在命令行中只有起始地址,没有断点地址,则程序在执行时不中断。DEBUG 规定最多设置 10 个断点地址。设置多个断点用于调试较大的程序,即程序中有多个模块、多个通路时用,比较方便,在执行时不论走哪条通路,程序都可以在断点处停下来,以便调整程序。

断点地址为程序中断处的偏移地址,段地址在 CS 中。

当执行在 DEBUG 状态下汇编的小段程序时,只用 G 命令即可。

(17)十六进制运算命令 H 格式: H 数据 1 数据 2 其中数据 1 和数据 2 为十六进制数据。

功能:将两个十六进制数进行相加、减,结果显示在屏幕上。(18)结束 DEBUG 返回到 DOS 命令 Q 格式: Q 功能:程序调试完退出 DEBUG 状态,返回到 DOS 状态下。

Q 命令不能把内存的文件存盘,要想存盘必须在退出 DEBUG 之前用 W 命令写盘

读书的好处

1、行万里路,读万卷书。

2、书山有路勤为径,学海无涯苦作舟。

3、读书破万卷,下笔如有神。

4、我所学到的任何有价值的知识都是由自学中得来的。——达尔文

5、少壮不努力,老大徒悲伤。

6、黑发不知勤学早,白首方悔读书迟。——颜真卿

7、宝剑锋从磨砺出,梅花香自苦寒来。

8、读书要三到:心到、眼到、口到

9、玉不琢、不成器,人不学、不知义。

10、一日无书,百事荒废。——陈寿

11、书是人类进步的阶梯。

12、一日不读口生,一日不写手生。

13、我扑在书上,就像饥饿的人扑在面包上。——高尔基

14、书到用时方恨少、事非经过不知难。——陆游

15、读一本好书,就如同和一个高尚的人在交谈——歌德

16、读一切好书,就是和许多高尚的人谈话。——笛卡儿

17、学习永远不晚。——高尔基

18、少而好学,如日出之阳;壮而好学,如日中之光;志而好学,如炳烛之光。——刘向

19、学而不思则惘,思而不学则殆。——孔子

20、读书给人以快乐、给人以光彩、给人以才干。——培根

下载用VHDL语言编写的数字钟程序5篇word格式文档
下载用VHDL语言编写的数字钟程序5篇.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    VHDL实现数字钟课设报告[推荐]

    东北大学信息学院 课程设计报告 课程设计题目:用VHDL语言实现数字钟的设计 班 级:电子1001班 学 号:20102594 姓 名:刘云飞 指导老师:李世平、李宁设计时间:2012年12月1 东北大......

    基于VHDL的多功能数字钟设计报告

    基于VHDL的多功能数字钟 设计报告 021215班 卫时章 02121451 一、设计要求 1、具有以二十四小时制计时、显示、整点报时、时间设置和闹钟的功能。 2、设计精度要求为1秒。......

    用状态机实现的EDA多功能数字钟课程设计VHDL代码

    设计并实现具有一定功能的数字钟 1、该数字钟可以实现3个功能:计时功能、整点报时功能和重置时间功能,因此有3个功能:计时、重置时间、复位。 2、对所有设计的小系统能够正确分......

    eda数字钟程序

    LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY clock IS PORT (EN :IN STD_LOGIC;数码管使能 CL......

    数字电路课程设计——用VHDL语言设计交通灯(五篇)

    数字电路课程设计报告 院系: 电气信息工程学院 班级: 08测控2班 学号: 08314237 姓名: 董 亮 合作: 虞 波 指导教师: 翟 丽 芳 2010年12月10日 第 0 页 共 17 页 目 录 引言··......

    数字钟课程设计程序(精选5篇)

    #includevoid chuanshu(void); void shuchu(void); void saomiao(void); void delay (void);unsigned int t; unsigned char m; unsigned char shi,fen,miao;unsigned char......

    第2章用c语言编写简单程序实训综合练习

    第2章用c语言编写简单程序实训综合练习实验目的 1) 使用if语句计算分段函数 2) 熟练掌握for语句和while语句编写简单的循环程序 3) 学习简单的程序调试方法编程题 1. 编写程......

    VHDL语言EDA四人抢答器

    一.EDA技术简介 在计算机技术的推动下,20世纪末,电子技术获得了飞速的发展,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使......