当前位置:文档之家› 矩阵键盘显示,六位数码管滚动显示

矩阵键盘显示,六位数码管滚动显示

矩阵键盘显示,六位数码管滚动显示
矩阵键盘显示,六位数码管滚动显示

南京邮电大学课程设计报告

设计类别: EDA-VHDL

专业名称: 通信工程

班级学号: B09010504 学生姓名: 张嫣艳

基本题 : 矩阵键盘按键的数码管显示

综合题 : 数码管学号滚动显示

同小组成员:

学号:B09010502

姓名:沈沁芳

指导教师: 王奇、梅中辉、周晓燕、孔凡坤日期:2012年3月5日—3月30日

目录

一矩阵键盘按键的数码管显示

1.实验目的--------------------------------------------------------------------- 3 2.实验所用仪器及元器件----------------------------------------------------3 3.实验任务要求----------------------------------------------------------------3

4. 设计思路-----------------------------------------------------------------------3

5. 模块分析-----------------------------------------------------------------------3

6. 逻辑仿真图及功能分析-----------------------------------------------------4

7. 调试过程与问题--------------------------------------------------------------8

8. 实验总结-----------------------------------------------------------------------8

9. 附录(VHDL源程序)-----------------------------------------------------8

二数码管学号滚动显示

1.实验目的----------------------------------------------------------------------12 2.实验所用仪器及元器件----------------------------------------------------12 3.实验任务要求----------------------------------------------------------------13

4. 设计思路----------------------------------------------------------------------13

5. 模块分析----------------------------------------------------------------------13

6. 逻辑仿真图及功能分析----------------------------------------------------16

7. 调试过程与问题-------------------------------------------------------------18

8. 实验总结----------------------------------------------------------------------18

9. 附录(VHDL源程序)----------------------------------------------------18

一矩阵键盘按键的数码管显示

1.实验目的

(1).使学生全面了解如何应用该硬件描述语言进行高速集成电路设计;

(2).通过软件设计环节与仿真环节使学生熟悉Quartus II设计与仿真环境;

(3).通过对基本题、综合题的设计实践,使学生掌握硬件系统设计方法(自底向上或自顶向下),熟悉VHDL语言三种设计风格,熟悉其芯片硬件实现的过程。

2.实验所用仪器及元器件

(1)PC机

(2)ALtera CPLD硬件实验开发系统

(3)设计软件(Quartus II )

3.实验任务要求

要求学生设计出4*4矩阵键盘对某一按键按下就在数码管显示一个数字。按键从左上角到右下角依次为1,2, (16)

4. 设计思路

首先一个4*4矩阵键盘中有四行四列,先假设键盘自上至下的第一行的四个键分别代表01,02,03,04;第二行四个键分别代表05,06,07,08;第三行四个键分别代表09,10,11,12;第四行分别代表13,14,15,16。

题目的意思是任意按下一个键,输出端会输出相应的数字,而每个键被选中的条件是它的行数和列数被选中,也就是在仿真中可以假设选中的行数和列数是0电平,而其他的行数和列数都是1电平。

所以输入端应是行数与列数,而输出端是两个数码管的显示。

5. 模块分析

(1)输入输出解释

输入: clk ------时钟信号

rst ------清零

row ------行线

column ------列线

输出: dataout1 ------数码管显示数据,个位

dataout2 ------数码管显示数据,十位

en ------数码管显示使能

(2)模块解释

PROCESS(clk,rst)

BEGIN

IF (NOT rst = '1') THEN

key_code <= "0000";

ELSIF(clk'EVENT AND clk='1')THEN --上升沿有效

CASE row IS --检测何处有键按下

WHEN "1110" =>

CASE column IS

WHEN "1110" =>

key_code <= "0000";

WHEN "1101" =>

key_code <= "0001";

WHEN "1011" =>

key_code <= "0010";

WHEN "0111" =>

key_code <= "0011";

WHEN OTHERS =>

NULL;

END CASE;

(……中间省略相同步骤……)

WHEN OTHERS =>

key_code <= "1111";

END CASE;

END IF;

END PROCESS;

(这部分用key_code 这个四位寄存器来代表16个键)

PROCESS(key_code)

BEGIN

CASE key_code IS

WHEN "0000" =>

dataout_tmp1 <= "10011111";

dataout_tmp2 <= "00000011";

WHEN "0001" =>

dataout_tmp1 <= "00100101";

dataout_tmp2 <= "00000011";

(……中间省略相同部分……)

END CASE;

END PROCESS;

(这部分中,对于相应的key_code值输出相应的数值)

6. 逻辑仿真图及功能分析

当选中第一行第一列时,输出端的两个数码管显示是01(00000011 10011111)

当选中第一行第二列时,输出端的两个数码管显示是02(00000011 00100101)

当选中第一行第三列时,输出端的两个数码管显示是03(00000011 00001101)

当选中第一行第四列时,输出端的两个数码管显示是04(00000011 10011001)

当选中第二行第一列时,输出端的两个数码管显示是05(00000011 01001001)

当选中第二行第二列时,输出端的两个数码管显示是06(00000011 01000001)

当选中第二行第三列时,输出端的两个数码管显示是07(00000011 00011111)

当选中第二行第四列时,输出端的两个数码管显示是08(00000011 00000001)

当选中第三行第一列时,输出端的两个数码管显示是09(00000011 00001001)

当选中第三行第二列时,输出端的两个数码管显示是10(00000011 00000011)

当选中第三行第三列时,输出端的两个数码管显示是11(00000011 00000011)

当选中第三行第四列时,输出端的两个数码管显示是12(00000011 00100101)

当选中第四行第一列时,输出端的两个数码管显示是13(00000011 00001101)

当选中第四行第二列时,输出端的两个数码管显示是14(00000011 10011001)

当选中第四行第三列时,输出端的两个数码管显示是15(00000011 01001001)

当选中第四行第四列时,输出端的两个数码管显示是16(00000011 01000001)

7. 调试过程与问题

(1)操作问题:由于我是第一次接触这个软件,在操作时会忘了一些必要的步骤,从而导致系统出现error,不能运行下去,但是多操作几次以后这种问题就可以被解决了。

(2)设计问题:联系实际,矩阵键盘中的row一般设计成输出,然后采用扫描的方法进行数码管的输出。但在功能仿真的时候出现了只能扫描出1,2,3,4的情况,仔细分析问题后发现,在确定column了以后,扫描都会从第一列开始,所以采用这种方法就只能出现1,2,3,4四个数字,为了使其他的数字也可以在功能仿真的出现,所以我在仿真的时候将row 设计成了输入,以确保每一个数字都有出现的机会。

(3)时延问题:在功能仿真的时候,在除了01这个数字的显示外,每个数字的显示都会出现一小段的时延。一开始我留意到这个问题时我没有理解,后来我去查看了源代码,然后发现在键盘上的按键按下之前,两个数码管分别默认输出数字是01,如果是按下的是别的键,那么输出的时候会有一定的时延,而它们在真正跳变之前,第一个数码管会显示0,第二个数码管会显示1。

8. 实验总结

通过这个设计实验,我学习到了很多知识。在做这个矩阵键盘的实验设计的过程中,我通过查阅资料和搜集有关的文献,培养了自学能力。并且由原先的被动的接受知识转化为主动的寻求知识,这可以说是学习方法上的一个很大的突破。虽然我之前从来没有用过这个软件,也没有接触过VHDL语言,但是我依然可以通过自学,查阅资料和与同学之间讨论交流来做出这个课题,我想将来不管遇到什么样的题目,只要我采用同样的方法和态度,总会可以找到解决的方案的。

9. 附录(VHDL源程序)

------矩阵键盘按键的数码管显示

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY KEYSCAN IS

PORT (

clk : IN std_logic;

rst : IN std_logic;

row : IN std_logic_vector(3 DOWNTO 0);--行线

column : IN std_logic_vector(3 DOWNTO 0);--列线

dataout1 : OUT std_logic_vector(7 DOWNTO 0); -- 数码管显示数据,个位

dataout2 : OUT std_logic_vector(7 DOWNTO 0); -- 数码管显示数据,十位

en : OUT std_logic); --数码管显示使能

END KEYSCAN;

ARCHITECTURE arch OF KEYSCAN IS

SIGNAL key_code : std_logic_vector(3 DOWNTO 0);

SIGNAL dataout_tmp1 : std_logic_vector(7 DOWNTO 0);

SIGNAL dataout_tmp2 : std_logic_vector(7 DOWNTO 0);

BEGIN

dataout1 <= dataout_tmp1;

dataout2 <= dataout_tmp2;

en <= '0';

PROCESS(clk,rst)

BEGIN

IF (NOT rst = '1') THEN

key_code <= "0000";

ELSIF(clk'EVENT AND clk='1')THEN --上升沿有效

CASE row IS --检测何处有键按下

WHEN "1110" =>

CASE column IS

WHEN "1110" =>

key_code <= "0000";

WHEN "1101" =>

key_code <= "0001";

WHEN "1011" =>

key_code <= "0010";

key_code <= "0011"; WHEN OTHERS =>

NULL;

END CASE;

WHEN "1101" =>

CASE column IS

WHEN "1110" =>

key_code <= "0100"; WHEN "1101" =>

key_code <= "0101"; WHEN "1011" =>

key_code <= "0110"; WHEN "0111" =>

key_code <= "0111"; WHEN OTHERS =>

NULL;

END CASE;

WHEN "1011" =>

CASE column IS

WHEN "1110" =>

key_code <= "1000"; WHEN "1101" =>

key_code <= "1001"; WHEN "1011" =>

key_code <= "1010"; WHEN "0111" =>

key_code <= "1011"; WHEN OTHERS =>

NULL;

END CASE;

WHEN "0111" =>

CASE column IS

WHEN "1110" =>

key_code <= "1100"; WHEN "1101" =>

key_code <= "1101"; WHEN "1011" =>

key_code <= "1110"; WHEN "0111" =>

key_code <= "1111";

NULL;

END CASE;

WHEN OTHERS =>

key_code <= "1111";

END CASE;

END IF;

END PROCESS;

-----显示键值

-----00000011 10011111 00100101 00001101 10011001 01001001 01000001 00011111 ----- 0 1 2 3 4 5 6 7

-----00000001 00001001

----- 8 9

PROCESS(key_code)

BEGIN

CASE key_code IS

WHEN "0000" =>

dataout_tmp1 <= "10011111";

dataout_tmp2 <= "00000011";

WHEN "0001" =>

dataout_tmp1 <= "00100101";

dataout_tmp2 <= "00000011";

WHEN "0010" =>

dataout_tmp1 <= "00001101";

dataout_tmp2 <= "00000011";

WHEN "0011" =>

dataout_tmp1 <= "10011001";

dataout_tmp2 <= "00000011";

WHEN "0100" =>

dataout_tmp1 <= "01001001";

dataout_tmp2 <= "00000011";

WHEN "0101" =>

dataout_tmp1 <= "01000001";

dataout_tmp2 <= "00000011";

WHEN "0110" =>

dataout_tmp1 <= "00011111";

dataout_tmp2 <= "00000011";

WHEN "0111" =>

dataout_tmp1 <= "00000001";

dataout_tmp2 <= "00000011";

WHEN "1000" =>

dataout_tmp1 <= "00001001";

dataout_tmp2 <= "00000011";

WHEN "1001" =>

dataout_tmp1 <= "00000011";

dataout_tmp2 <= "10011111";

WHEN "1010" =>

dataout_tmp1 <= "10011111";

dataout_tmp2 <= "10011111";

WHEN "1011" =>

dataout_tmp1 <= "00100101";

dataout_tmp2 <= "10011111";

WHEN "1100" =>

dataout_tmp1 <= "00001101";

dataout_tmp2 <= "10011111";

WHEN "1101" =>

dataout_tmp1 <= "10011001";

dataout_tmp2 <= "10011111";

WHEN "1110" =>

dataout_tmp1 <= "01001001";

dataout_tmp2 <= "10011111";

WHEN "1111" =>

dataout_tmp1 <= "01000001";

dataout_tmp2 <= "10011111";

WHEN OTHERS =>

NULL;

END CASE;

END PROCESS;

END arch;

二数码管学号滚动显示

1.实验目的

(1).使学生全面了解如何应用该硬件描述语言进行高速集成电路设计;

(2).通过软件设计环节与仿真环节使学生熟悉Quartus II设计与仿真环境;

(3).通过对基本题、综合题的设计实践,使学生掌握硬件系统设计方法(自底向上或自顶向下),熟悉VHDL语言三种设计风格,熟悉其芯片硬件实现的过程。

2.实验所用仪器及元器件

(1)PC机

(2)ALtera CPLD硬件实验开发系统

(3)设计软件(Quartus II )

3.实验任务要求

要求学生在六个数码管滚动显示自己的学号(六位),每隔一定时间循环移位一次,学号为奇数则左移,学号为偶数则右移。间隔时间可由开关选择1秒,2秒,3秒和4秒。

4.设计思路

首先需要有六个数码管用于六位的学号的显示,而实现的时候可以在每个脉冲来临的时候使我的学号中六个数字010504依次在六个数码管上输出,而在六个脉冲之后,010504还是依次输出,但是显示的数码管不同,0在第二个数码管显示,1在第三个数码管显示,0在第四个数码管显示,5在第五个数码管显示,0在第六个数码管显示,4在第一个数码管显示。又一组六个脉冲过去以后,输出的位置会再改变一次,0在第三个数码管显示,1在第四个数码管显示,0在第五个数码管显示,5在第六个数码管显示,0在第一个数码管显示,4在第二个数码管显示。依次类推,就达到了学号的右移效果。而间隔时间的改变可以由程序内部的某一步运行时的长短次数来实现。

5.模块分析

(1)输入输出解释

输入: clk ------时钟信号

column ------行列式键盘的4列

输出:led_out ------数码管8段显示,可显示0~9,A~F

led_sel ------选择6个数码管,‘1’表示点亮对应数码管

output ------分频后的时钟

Interval ------随学号移动而数值改变的寄存器

(2)模块解释

A. 模块一

PROCESS(clk)--12分频电路

V ARIABLE counter: std_logic_vector(2 downto 0);--计数寄存器,12分频输入时钟为1Hz BEGIN

IF (clk'EVENT AND clk ='0') THEN --下降沿有效

counter := counter + 1 ;

IF (counter = 6) THEN

clk_temp <= NOT clk_temp; --分频后的时钟变化

counter := "000";

END IF;

END IF;

END PROCESS;

PROCESS(clk)--读取行列式键盘的键值

(这段程序是对时钟clock进行分频,进而得到新的时钟clk_temp,并赋值给输出output)B. 模块二

BEGIN

IF(clk'EVENT AND clk = '0')THEN

CASE column IS

WHEN "1110" =>

key_code <= "00";

WHEN "1101" =>

key_code <= "01";

WHEN "1011" =>

key_code <= "10";

WHEN "0111" =>

key_code <= "11";

WHEN OTHERS =>

key_code <= "00";

END CASE;

END IF;

END PROCESS;

process (clk_temp)

V ARIABLE time_count : std_logic_vector(1 DOWNTO 0);

begin

if (clk_temp 'event and clk_temp = '0') then--下降沿有效

time_count := time_count + 1;

CASE key_code IS

WHEN "00" =>

shift <= shift- 1; --数据右移1位

if(shift = "000") then

shift <="110";

end if;

WHEN "01" =>

if(time_count = "10") then

time_count := "00" ;

shift <= shift - 1; --数据右移1位

if(shift = "000") then

shift <="110";

end if;

end if;

WHEN "10" =>

if(time_count = "11") then

time_count := "00";

shift <= shift - 1; --数据右移1位

if(shift = "000") then

shift <="110";

end if;

end if;

WHEN "11" =>

if(time_count = "00") then

shift <= shift - 1; --数据右移1位

if(shift = "000") then

shift <="110";

end if;

end if;

WHEN OTHERS =>

shift <= shift - 1; --数据右移1位

if(shift = "000") then

shift <="110";

end if;

END CASE;

end if;

end process;

(这模块利用key_code的四个数值来控制四个case,由于time_count 初始值是00,在进入运算时是01,根据case的不同,运行次数不同,分别是一次,两次,三次和四次,根据这个来控制移动的间隔时间。并且每次运行时shift的值会减小1,这与数据的右移有关。)

C. 模块三

process (clk)--显示学号010504

V ARIABLE led_sel_llb :std_logic_vector(3 DOWNTO 0); --信号量,6个数码管显示的选择

begin

if (clk 'event and clk='0') then --时钟下降沿有效

if (led_sel_count = "0000") then --轮询6个数码管

led_sel_count <= "0101";

else

led_sel_count <= led_sel_count - "0001";

end if;

--0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff

-- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 空

case led_sel_count is --选择要要显示的值

when "0000" => led_out <= X"99"; --位置6,内容4

when "0001" => led_out <= X"c0"; --位置5,内容0

when "0010" => led_out <= X"92"; --位置4,内容5

when "0011" => led_out <= X"c0"; --位置3,内容0

when "0100" => led_out <= X"f9"; --位置2,内容1

when "0101" => led_out <= X"c0"; --位置1,内容0

when others => led_out <= X"92"; --其他情况下,位置6,内容5

end case;

led_sel_llb := led_sel_count + shift;

if (led_sel_llb >= "0110") then

led_sel_llb := led_sel_llb - "0110";

end if;

case led_sel_llb is --选择要被点亮的数码管

when "0000" => led_sel <= "000001"; --位置6

when "0001" => led_sel <= "000010"; --位置5

when "0010" => led_sel <= "000100"; --位置4

when "0011" => led_sel <= "001000"; --位置3

when "0100" => led_sel <= "010000"; --位置2

when "0101" => led_sel <= "100000"; --位置1

when others => led_sel <= "000001"; --其他情况下,位置6,内容5

end case;

end if;

end process;

(这模块中,led_sel用来表示选中的数码管,led_out 表示输出的数值。每一个clock过来,都会输出一个数,依次是0-1-0-5-0-4,而数字输出在哪个数码管是由相同时刻的led_sel 决定的。由于时钟的跳动很快,虽然每个时钟来临时只有一个数码管被点亮,但是人眼是无法分辨的,所以在视觉上还是每个数码管都被点亮了,就是亮度没有静态显示的时候亮。这样动态的运用对于节约电能也是有所贡献的。)

6. 逻辑仿真图及功能分析

(1)右移功能的展示:

(led-sel表示选中点亮的数码管,100000表示点亮左侧第一个,010000表示点亮左侧第二个,一次类推;led-out表示选中数码管显示的数字,11000000表示0,11111001表示1,10010010表示5,10011001表示4)

一开始六个数码管从左至右分别为0-1-0-5-0-4

第一个时钟output的下降沿来临时时,显示右移一位4-0-1-0-5-0

没有时钟output下降沿,显示不变4-0-1-0-5-0

第二个时钟output下降沿来临,显示右移一位0-4-0-1-0-5

没有output下降沿,显示不改变0-4-0-1-0-5

第三个时钟output下降沿来临,显示右移一位5-0-4-0-1-0

(2)四个不同循环间隔功能的展示:

(每次数码管显示的数字有改变时,interval的数值都会减小一位,即只要比较interval的数值变化快慢就可以知道移动一位的时间间隔了,令时钟output的一个周期为T。选择间隔是由column来决定的,1110表示循环间隔为1秒,1101表示循环间隔为2秒,1011表示循环间隔为3秒,0111表示循环间隔为4秒)

Column为1110,interval=T

Column为1101,interval=2T

Column为1011,interval=3T

Column为0111,interval=4T

7. 调试过程与问题

(1)操作问题:由于我是第一次接触这个软件,在操作时会忘了一些必要的步骤,从而导致系统出现error,不能运行下去,但是多操作几次以后这种问题就可以被解决了。

(2)设计问题:题目要求是间隔时间可由开关选择1秒,2秒,3秒和4秒,虽然我可以做到间隔时间可由开关选择T,2T,3T,4T,但对于如何使T=1秒,我还是没有知道应该如何实现。

(3)截图问题:根据实验报告的要求,要把仿真的图截下来,而数码管显示的变化要能够看出来,图片就需要很长,实际上无法截下来,所以,我在完成后增加了一个寄存器interval,每当学号移动时,interval的数值会减小一位,这样,只要将时钟周期变小,压缩图片,观察每个interval所占的周期长短就可以了。

8. 实验总结

通过这个设计实验,我学习到了很多知识。在做这个数码管学号滚动显示的实验设计的过程中,我通过查阅资料和搜集有关的文献,培养了自学能力。并且由原先的被动的接受知识转化为主动的寻求知识,这可以说是学习方法上的一个很大的突破。虽然我之前从来没有用过这个软件,也没有接触过VHDL语言,但是我依然可以通过自学,查阅资料和与同学之间讨论交流来做出这个课题,我想将来不管遇到什么样的题目,只要我采用同样的方法和态度,总会可以找到解决的方案的。并且通过这次实验我充分体会到了集思广益的好处。很多时候,并不是只有请教会的人才可以得到答案,往往在大家都不会的时候,讨论着讨论着,就会有灵感出现,而灵感出现的时候一定要去尝试,并且不断的改进。通过这次实验,我对VHDL语言有了进一步的理解,也进一步理解了课堂上关于时序逻辑电路的内容,对于计数器,译码器的应用油了更深层次的理解。通过这次实验,我巩固了再数字电路与逻辑设计课上学习到的理论知识,加深了对理论知识的理解。

9. 附录(VHDL源程序)

------数码管学号滚动显示

LIBRARY ieee ;

USE ieee.std_logic_1164.all ;

USE ieee.std_logic_unsigned.all ;

--显示模块

ENTITY llb IS

PORT (

clk : IN STD_LOGIC;

led_out : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); --数码管8段显示,可显示0~9,A~F

led_sel : BUFFER STD_LOGIC_VECTOR(5 DOWNTO 0); --选择6个数码管,‘1’表示点亮对应数码管

output : OUT STD_LOGIC;

interval : OUT STD_LOGIC_VECTOR(2 downto 0);

column : IN STD_LOGIC_VECTOR(3 downto 0) --行列式键盘的4列) ;

END llb ;

ARCHITECTURE Behavior OF llb IS

signal clk_temp : std_logic := '1'; --用作分频后的电路时钟signal led_sel_count : std_logic_vector(3 DOWNTO 0); --信号量,6个数码管显示的选择

signal div_cnt : std_logic_vector(1 downto 0); --行扫描驱动

signal scan_key : std_logic_vector(3 DOWNTO 0); --扫描码寄存器

signal key_code : std_logic_vector(1 DOWNTO 0); --存储键值

signal shift : std_logic_vector(2 DOWNTO 0):= "110"; --控制数码管显示的数据右移

begin

output <= clk_temp;

interval <= shift;

PROCESS(clk)--12分频电路

V ARIABLE counter: std_logic_vector(2 downto 0);--计数寄存器,12分频输入时钟为1Hz

BEGIN

IF (clk'EVENT AND clk ='0') THEN --下降沿有效

counter := counter + 1 ;

IF (counter = 6) THEN

clk_temp <= NOT clk_temp; --分频后的时钟变化

counter := "000";

END IF;

END IF;

END PROCESS;

PROCESS(clk)--读取行列式键盘的键值

BEGIN

IF(clk'EVENT AND clk = '0')THEN

CASE column IS

WHEN "1110" =>

key_code <= "00";

WHEN "1101" =>

key_code <= "01";

WHEN "1011" =>

key_code <= "10";

WHEN "0111" =>

key_code <= "11";

WHEN OTHERS =>

key_code <= "00";

END CASE;

END IF;

END PROCESS;

process (clk_temp)

V ARIABLE time_count : std_logic_vector(1 DOWNTO 0);

begin

if (clk_temp 'event and clk_temp = '0') then--下降沿有效

time_count := time_count + 1;

CASE key_code IS

WHEN "00" =>

shift <= shift- 1; --数据右移1位

if(shift = "000") then

shift <="110";

end if;

WHEN "01" =>

if(time_count = "10") then

time_count := "00" ;

shift <= shift - 1; --数据右移1位

if(shift = "000") then

shift <="110";

end if;

end if;

WHEN "10" =>

用6位数码管显示时间

#include #define uchar unsigned char #define uint unsigned int sbit dula=P2^6; sbit wela=P2^7; sbit key1=P3^4; sbit key2=P3^5; sbit key3=P3^6; sbit key4=P3^7; sbit fm=P2^3; uchar num,num1,num2,num3,temp; void init(); void keyscan(); //void jianpan(); void delay(uint a) { uint x,z; for(x=a;x>0;x--) for(z=10;z>0;z--); } uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71, }; unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd, 0x87,0xff,0xef}; void display1(uchar numdi) //秒钟显示函数 { uchar fen,miao; fen=numdi/10; miao=numdi%10; dula=1; P0=table[fen]; dula=0; P0=0xff; wela=1; P0=0xfb; wela=0; delay(20); dula=1;

P0=table1[miao]; dula=0; P0=0xff; wela=1; P0=0xf7; wela=0; delay(20); } void display(uchar numdis)//分钟显示函数{ uchar shi,ge; shi=numdis/10; ge=numdis%10; dula=1; P0=table[shi]; dula=0; P0=0xff; wela=1; P0=0xef; wela=0; delay(20); dula=1; P0=table[ge]; dula=0; P0=0xff; wela=1; P0=0xdf; wela=0; delay(20); } void display2(uchar numd2)//小时显示函数{ uchar xshi,xfen; xshi=numd2/10; xfen=numd2%10; dula=1; P0=table[xshi]; dula=0; P0=0xff; wela=1; P0=0xfe;

4乘4矩阵键盘输入数码管显示四位数

综合课程设计三相步进电机控制器电路的设计 学生姓名__________

指导教师_________ 课程设计任务书 一、设计说明 步进电机是工业过程控制及仪表控制中的主控元件之一,作为执行元件其特点为能够快速起启停、精度高且能直接接收数字量,由于这些特点使其在定位场合得到了广泛的应用。 设计一个三相步进电机控制器,使其能够控制步进电机的工作状态,如步进电机正、反转,步进电机的工作方式等。 用键盘设定步进电机的工作频率,工作方式,并用数码管显示设定值,可以通过按键来更换显示内容。用示波器观测三相的输出波形,并用数码管显示电路的工作状态。 二、技术指标 步进电机的工作频率为:<10kHz 三、设计要求 1.进行方案论证,提出一个合理的设计方案并进行理论设计; 2.对所设计的方案部分进行调试; 3.在选择器件时,应考虑成本。 4.设计测量调试电路。 四、实验要求 1.根据技术指标制定实验方案;验证所设计的电路。 2.进行实验数据处理和分析。 五、推荐参考资料 1?谢自美?电子线路设计?实验?测试.[M]武汉:华中理工大学出版社,2000 年 2. 阎石. 数字电子技术基础. [M] 北京:高等教育出版社,2006年 3. 童诗白、华成英.模拟电子技术基础. [M] 北京:高等教育出版社,2006年 4..付家才. 电子实验与实践. [M] 北京:高等教育出版社,2004年 5.沙占友、李学芝著.中外数字万用表电路原理与维修技术. [M] 北京:人民 邮电出版社,1993年

六、按照要求撰写课程设计报告成绩评定表

一、概述 本次毕设的题目是:三相步进电机控制电路的设计。本次毕设使用80C51单片机作为主控芯片,利用ULN2003A集成电路作为三相步进电机的驱动电路,采用单极性驱动方式,使三相步进电机能在(1)三相单三拍,(2)三相双三拍, (3)三相六拍三种工作方式下正常工作;能实现的功能有:启动/停止控制、方向控制;速度控制;用LED数码管显示工作方式。键盘输入工作频率。本次课程设计采用80C51单片机作为主控芯片,程序采用C语言来编写,驱动电路采用ULN2003A集成电路,显示采用 7SEG-MPX4-CC卩四位共阴数码管,P0接段码,并用8只1K欧左右电阻上拉。P2的4位10 口接位选码。正转,数码管显示1。反转,数码管显示2.不转,数码管显示0.采用Proteus软件进行仿真。在Keil uVsuon3编程环境下编程和编译生成HEX文件,导入到 80C51单片机,实现对各个模块的控制,实现我们所需要的功能。 本次课程是对毕业设计的基础设计,即实现4x4键盘输入,数码管显示输入数字的设计。 二、方案论证 1步进电机驱动方案选择 方案1 :使用功率三极管等电子器件搭建成功率驱动电路来驱动电机的运行。这种方案的驱动电路的优点是使用电子器件联接,电路比较简单,但容易受 干扰,信号不够稳定,缺点是器件较大而不便电路的集成,使用时很不方便,联接时容易出错误。 方案2:使用专门的电机驱动芯片ULN2003A来驱动电机运行。驱动芯片的优点是便于电路的集成,且驱动电路简单,驱动信号很稳定,不易受外界环境的干扰,因而设计的三相步进电机控制系统性能更好。 通过对两种方案的比较,我选择方案2使用ULN2003A S机驱动芯片来作为驱动。 2数码管显示方案选择 方案1:把所需要显示的数据通过专用的七段显示译码器(例如7448)的转换输出给LED显示屏。优点是输出比较简单,可以简化程序,但增加了芯片的费用,电路也比较复杂。 方案2:通过程序把所要的数据转化为七段显示的数据,直接通过单片机接 口来显示,其优点是简化了电路,但增加了软件编写的负担。 通过对两种方案进行比较,我选择通过软件编写来输出显示信号,即单片机直接和显示器相连。 3控制状态的读取 方案1:把按键接到单片机的中断口,若有按键按下,单片机接收到中断信 号,再通过软件编写的中断程序来执行中断,优点是接线简单,简化了电路,但软件编写较为复杂,不易掌握。

郭天祥老师51单片机中矩阵键盘显示程序

3.键盘的应用,第一排。 #include #define uint unsigned int #define uchar unsigned char sbit dula=P2^6; sbit wela=P2^7; void delay(uint); uchar code table[]= { //段选的数字决定显示的数字,这里的是数字0~15 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,}; uchar num,temp; void main() { dula=0; wela=1; P0=0xc0; //位选6数码管 wela=0; while(1) { P3=0xfe; temp=P3; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P3; temp=temp&0xf0; while(temp!=0xf0) { temp=P3; switch(temp) { case 0xee:num=1; break; case 0xde:num=2; break; case 0xbe:num=3; break;

case 0x7e:num=4; break; } } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } } dula=1; P0=table[num-1]; dula=0; } } void delay(uint z) //延时函数 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); }

6位7段LED数码管显示

目录 1. 设计目的与要求..................................................... - 1 - 1.1 设计目的...................................................... - 1 - 1.2 设计环境...................................................... - 1 - 1.3 设计要求...................................................... - 1 - 2. 设计的方案与基本原理............................................... - 2 - 2.1 6 位 8 段数码管工作原理....................................... - 2 - 2.2 实验箱上 SPCE061A控制 6 位 8 段数码管的显示................... - 3 - 2.3 动态显示原理.................................................. - 4 - 2.4 unSP IDE2.0.0 简介............................................ - 6 - 2.5 系统硬件连接.................................................. - 7 - 3. 程序设计........................................................... - 8 - 3.1主程序......................................................... - 8 - 3.2 中断服务程序.................................................. - 9 - 4.调试............................................................... - 12 - 4.1 实验步骤..................................................... - 12 - 4.2 调试结果..................................................... - 12 - 5.总结............................................................... - 14 - 6.参考资料........................................................... - 15 - 附录设计程序汇总.................................................... - 16 -

矩阵键盘电路设计

课程设计 题目矩阵键盘电路设计教学院计算机学院 专业计算机应用技术班级 姓名 指导教师 2010 年01 月12 日

前言.................................................................... 第一章需求分析......................................................... 功能描述......................................................... 功能分析......................................................... 第二章系统的原理及分析................................................. 用到的知识点的介绍,知识点使用的总体思路 第三章详细设计......................................................... 硬件设计 系统结构图,元器件的选择等 软件设计 所设计的软件关键模块的程序流程 第四章测试............................................................ 运行结果分析等 第五章总结............................................................. 参考文献................................................................ 附录 关键程序代码........................................................

用数码管显示实时日历时钟的应用设计

(用数码管显示实时日历时钟的应用设计)

摘要 本课题通过MCS-51单片机来设计电子时钟,采用汇编语言进行编程,可以实现以下一些功能:小时,分,秒和年,月,日的显示。本次设计的电子时钟系统由时钟电路,LED显示电路三部分组成。51单片机通过软件编程,在LED数码管上实现小时,分,秒和年,月,日的显示;利用时钟芯片DS1302来实现计时。本文详细介绍了DS1302 芯片的基本工作原理及其软件设计过程,运用PROTEUS软件进行电路连接和仿真,同时还介绍了74LS164,通过它来实现I|O口的扩展。 关键词:时钟芯片,仿真软件,74LS164 目录 前言 0.1设计思路 (8) 0.2研究意义 (8)

一、时钟芯片 1.1 了解时钟芯片……………………………………………….8-9 1.2 掌握时钟芯片的工作原理………………………………….10-11二、74LS164 2.1 了解74LS164........................................................11-12 2.2 掌握的74LS164工作原理. (12) 三、数码管 3.1 熟悉常用的LED数码管...........................................12-13 3.2 了解动态显示与静态显示. (13) 四、程序设计 4.0 程序流程图 (14) 4.1 DS1392的驱动.......................................................15-16 4.2 PROTUES实现电路连接. (17) 4.3 数码管的显示:小时;分;秒 (18) 4.4 数码管显示:年;月;日 (19) 五、总结…………………………………………………………………..20-21 六、附页程序………………………………………………………………22-31前言

4乘4矩阵键盘输入数码管显示四位数

沈阳航空航天大学 综合课程设计三相步进电机控制器电路的设计 班级 94020101 学号 2009040201023 学生姓名 XXXXXXXXX 指导教师常丽东

课程设计任务书 一、设计说明 步进电机是工业过程控制及仪表控制中的主控元件之一,作为执行元件其特点为能够快速起启停、精度高且能直接接收数字量,由于这些特点使其在定位场合得到了广泛的应用。 设计一个三相步进电机控制器,使其能够控制步进电机的工作状态,如步进电机正、反转,步进电机的工作方式等。 用键盘设定步进电机的工作频率,工作方式,并用数码管显示设定值,可以通过按键来更换显示内容。用示波器观测三相的输出波形,并用数码管显示电路的工作状态。 二、技术指标 步进电机的工作频率为:<10kHz 三、设计要求 1.进行方案论证,提出一个合理的设计方案并进行理论设计; 2.对所设计的方案部分进行调试; 3.在选择器件时,应考虑成本。 4.设计测量调试电路。 四、实验要求 1.根据技术指标制定实验方案;验证所设计的电路。 2.进行实验数据处理和分析。 五、推荐参考资料 1.谢自美. 电子线路设计·实验·测试. [M]武汉:华中理工大学出版社,2000年 2.阎石. 数字电子技术基础. [M]北京:高等教育出版社,2006年 3.童诗白、华成英.模拟电子技术基础. [M]北京:高等教育出版社,2006年 4..付家才. 电子实验与实践. [M]北京:高等教育出版社,2004年 5.沙占友、李学芝著.中外数字万用表电路原理与维修技术. [M]北京:人民邮电出版社,1993年

六、按照要求撰写课程设计报告成绩评定表

4×4矩阵键盘数码管显示 最简便易懂的键盘扫描方法

/////4×4矩阵键盘按键为1-16,按键显示0-9、a-f; ////////////////// #include #define uchar unsigned char uchar key=0; uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e,0xc0}; void show(uchar key) { P0=table[key];//显示数值 } void Scan_key()//扫描键盘 { uchar m; P1=0xff;//数码管全亮 P2=0x0f;//P2口赋初值低位1高位0 m=P2; switch (m) { case 0x0e: { P2=0xf0;

m=P2; switch (m) { case 0xe0:{key=0;show(key);break;} case 0xd0:{key=1;show(key);break;} case 0xb0:{key=2;show(key);break;} case 0x70:{key=3;show(key);break;} default:break; } break; } case 0x0d: { P2=0xf0; m=P2; switch (m) { case 0xe0:{key=4;show(key);break;} case 0xd0:{key=5;show(key);break;} case 0xb0:{key=6;show(key);break;} case 0x70:{key=7;show(key);break;} default:break; } break; } case 0x0b: { P2=0xf0; m=P2; switch (m) { case 0xe0:{key=8;show(key);break;} case 0xd0:{key=9;show(key);break;} case 0xb0:{key=10;show(key);break;} case 0x70:{key=11;show(key);break;} default:break; } break; } case 0x07: { P2=0xf0; m=P2; switch (m)

矩阵键盘的工作原理和扫描确认方式

9.3.1 矩阵键盘的工作原理和扫描确认方式 来源:《AVR单片机嵌入式系统原理与应用实践》M16华东师范大学电子系马潮 当键盘中按键数量较多时,为了减少对I/O 口的占用,通常将按键排列成矩阵形式,也称为行列键盘,这是一种常见的连接方式。矩阵式键盘接口见图9-7 所示,它由行线和列线组成,按键位于行、列的交叉点上。当键被按下时,其交点的行线和列线接通,相应的行线或列线上的电平发生变化,MCU 通过检测行或列线上的电平变化可以确定哪个按键被按下。 图9-7 为一个 4 x 3 的行列结构,可以构成12 个键的键盘。如果使用 4 x 4 的行列结构,就能组成一个16 键的键盘。很明显,在按键数量多的场合,矩阵键盘与独立式按键键盘相比可以节省很多的I/O 口线。 矩阵键盘不仅在连接上比单独式按键复杂,它的按键识别方法也比单独式按键复杂。在矩阵键盘的软件接口程序中,常使用的按键识别方法有行扫描法和线反转法。这两种方法的基本思路是采用循环查循的方法,反复查询按键的状态,因此会大量占用MCU 的时间,所以较好的方式也是采用状态机的方法来设计,尽量减少键盘查询过程对MCU 的占用时间。 下面以图9-7 为例,介绍采用行扫描法对矩阵键盘进行判别的思路。图9-7 中,PD0、PD1、PD2 为3 根列线,作为键盘的输入口(工作于输入方式)。PD3、PD4、PD5、PD6 为4根行线,工作于输出方式,由MCU(扫描)控制其输出的电平值。行扫描法也称为逐行扫描查询法,其按键识别的过程如下。 √将全部行线PD3-PD6 置低电平输出,然后读PD0-PD2 三根输入列线中有无低电平出现。只要有低电平出现,则说明有键按下(实际编程时,还要考虑按键的消抖)。如读到的都是高电平,则表示无键按下。 √在确认有键按下后,需要进入确定具体哪一个键闭合的过程。其思路是:依

ds1302时钟数码管显示时分秒

单片机原理课程设计 课题名称:基于DS1302的数码管显示数字钟 专业班级:电子信息工程 学生学号:0414070126 学生姓名:张向阳 指导教师:张云马崇霄 设计时间:2010年6月21日--2010年6月25日

目录 摘要................................................................................... 1 设计任务和要求..................................................................... 2 方案论证........................................................................... 3 系统硬件设计....................................................................... 3.1 系统总原理图 ............................................................... 3.2 元器件清单.................................................................................... .................................................. 3.3 PCB板图.................................................................................... ................................................... 3.4 Proteus仿真图.............................................................. 3.5 分电路图及原理说明......................................................... 3.5.1 主控部分(单片机MCS-51).................................................................... .......... 3.5.2 计时部分(实时时钟芯片DS1302).................................................................. 3.5.3 显示部分(共阳极数码管)....................................................................... ......... 3.5.4 调时部分(按键)....................................................................... ......................... 4 系统软件设计....................................................................... 4.1 程序流程图.................................................................. 4.2 程序源代码................................................................... 5 心得体会...........................................................................

LED数码管显示矩阵键盘按键的设计

任务九设计说明2 一、电路原理及仿真图: 二、程序设计: #include #define uchar unsigned char uchar display[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0 x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0 x40}; uchar key; void get(){ uchar a; P1=0x0f; //按下按钮// a=P1^0x0f; switch(a) //确定行// { case 1:key=0;break; case 2:key=4;break; case 4:key=8;break; case 8:key=12;break; case 0:key=16;} P1=0xf0; a=P1^0xf0; switch(a) //确定列//{ case 16:key=key+3;break; case 32:key=key+2;break; case 64:key=key+1;break;

case 128:key=key+0;}} void main(){ P0=display[16]; get(); P0=display[key]; } 程序完成两个功能,首先扫描键盘,检测是否有按键按下并计算键值。 然后如果有按键按下则驱动数码管显示相应键值,否则显示”-“符号。 三、设计说明 如电路原理图所示,图中矩阵键盘和P3端口连接,共阳极数码管的段选端和单片机的P0口连接,位选直接接到高电平,使得数码管始终处于选通状态。系统启动后,单片机逐行扫描键盘,当没有按键按下时,驱动数码管显示“-”符号,当检测到有按键按下时,单片机将相应键值对应的数码编码送至P0端口,驱动数码管以十六进制方式显示被按下的按键的键值。四、遇到的问题 首先遇到的问题是系统启动后数码管没有任何显示,仔细查看仿真现象后发现P0口始终为高阻状态,于是怀疑是数码管极性错误。再检查数码管型号后发现果然使用了共阴极数码管,于是换成共阳极数码管后终于有了显示。其次是希望键值从键盘的左下角起始,即左下角键值为0。但由于对键盘的扫描方向理解的不是很透彻,导致调试了很多次,键值排列顺序都不尽人意。不过最终还是达到了设计要求。

矩阵键盘控制12864显示最经典程序

#include //这个程序的功能:用4*4的矩阵键盘(接P3口)按键盘k1——k16中的任何一个键ki #include //12864液晶上显示数字i-1 (液晶数据口接P0) #define uint unsigned int//键盘扫描的思想是将行设置为低,列设置为高,来读取P3口的值,就能知道是哪个按键按下了 #define uchar unsigned char #define LCDdata P0 sbit E = P2^7; sbit RW = P2^6; sbit RS = P2^5; void init(); void delayms(uint x); void displaykey(); void write_com(uchar com);//写命令 void write_data(uchar date);//写数据 uchar temp; //--------------主函数----------------- void main() { init();// P3=0xfe;//P3=0xfd;//P3=0xfb;//P3=0xf7; while(1) { displaykey(); } } //-------------液晶初始化---------------- void init() { write_com(0x01); write_com(0x02); write_com(0x06); write_com(0x0e); } //------------毫秒延时--------------- void delayms(uint x) { uchar i; while(x--) {

8位数码管显示时钟

本人依据AT89C51和8位数码管为素材,以最少的见实现最多的功能! 本程序开机流动显示学号可实现时钟,日历,定时闹钟,秒表等功能! C程序: #include unsigned char led[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00}; //用一维数组定义-9、横杠、全灭 unsigned char num[12]={2,0,0,9,3,5,0,7,0,1,2,0} ; unsigned char a[8]; unsigned char second=0,minute=0,hour=0,year=0,mon=1,day=1,day1,hsec,sec_m,min_m,N,temp1; unsigned char minute1=0,hour1=0; unsigned char b[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //扫描 unsigned char k=0; unsigned int temp; // 记录毫秒为秒的变量 unsigned char M,S_flag; //M是模式,更新时间的种模式加上正常模式 S_flag闪烁标志 sbit K0=P3^7; //K0是闹钟起停标志位 sbit K1=P3^0; sbit K2=P3^1; sbit K3=P3^2; sbit BEEP=P3^3; void delay(unsigned n) //0.2毫秒 { int x,y; for(x=0;x

单片机实验报告——矩阵键盘数码管显示

单片机实验报告 信息处理实验 实验二矩阵键盘 专业:电气工程及其自动化 指导老师:高哲 组员:明洪开张鸿伟张谦赵智奇 学号:152703117 \152703115\152703118\152703114室温:18 ℃日期:2017 年10 月25日

矩阵键盘 一、实验内容 1、编写程序,做到在键盘上每按一个键(0-F)用数码管将该建对应的名字显示出来。按其它键没有结果。 二、实验目的 1、学习独立式按键的查询识别方法。 2、非编码矩阵键盘的行反转法识别方法。 3、掌握键盘接口的基本特点,了解独立键盘和矩阵键盘的应用方法。 4、掌握键盘接口的硬件设计方法,软件程序设计和贴士排错能力。 5、掌握利用Keil51软件对程序进行编译。 6、会根据实际功能,正确选择单片机功能接线,编制正确程序。对实验结果 能做出分析和解释,能写出符合规格的实验报告。 三、实验原理 1、MCS51系列单片机的P0~P3口作为输入端口使用时必须先向端口写入“1”。 2、用查询方式检测按键时,要加入延时(通常采用软件延时10~20mS)以消除抖动。 3、识别键的闭合,通常采用行扫描法和行反转法。行扫描法是使键盘上某一行线为低电平,而其余行接高电平,然

后读取列值,如读列值中某位为低电平,表明有键按下,否则扫描下一行,直到扫完所有行。 行反转法识别闭合键时,要将行线接一并行口,先让它工作在输出方式,将列线也接到一个并行口,先让它工作于输入方式,程序使CPU通过输出端口在各行线上全部送低电平,然后读入列线值,如此时有某键被按下,则必定会使某一列线值为0。然后,程序对两个并行端口进行方式设置,使行线工作于输入方式,列线工作于输出方式,并将刚才读得的列线值从列线所接的并行端口输出,再读取行线上输入值,那么,在闭合键所在行线上的值必定为0。这样,当一个键被接下时,必定可以读得一对唯一的行线值和列线值。 由于51单片机的并口能够动态地改变输入输出方式,因此,矩阵键盘采用行反转法识别最为简便。 行反转法识别按键的过程是:首先,将4个行线作为输出,将其全部置0,4个列线作为输入,将其全部置1,也就是向P1口写入0xF0;假如此时没有人按键,从P1口读出的值应仍为0xF0;假如此时1、4、7、0四个键中有一个键被按下,则P1.6被拉低,从P1口读出的值为0xB0;为了确定是这四个键中哪一个被按下,可将刚才从P1口读出的数的低四位置1后再写入P1口,即将0xBF写入P1口,使P1.6为低,其余均为高,若此时被按下的键是“4”,则P1.1被拉低,从P1口读出的值为0xBE;这样,当只有一个键被按下时,每一个键只有唯一的反转码,事先为12个键的反转码建一个表,通过查表就可知道是哪个键被按下了。

单片机课程设计4X4矩阵键盘显示要点

长沙学院 《单片机原理及应用》 课程设计说明书 题目液晶显示4*4矩阵键盘按键号 程序设计 系(部) 电子与通信工程系 专业(班级) 电气1班 姓名龙程 学号2011024109 指导教师刘辉、谢明华、王新辉、马凌 云 起止日期2014.5.19—2014.5.30

长沙学院课程设计鉴定表

《单片机技术及应用》课程设计任务书系(部):电子与电气工程系专业:11级电子一班指导教师:谢明华、刘辉

目录 前言 (5) 一、课程设计目的 (6) 二、设计内容及原理 (6) 2.1 单片机控制系统原理 (6) 2.2阵键盘识别显示系统概述 (6) 2.3键盘电路 (7) 2.4 12864显示器 (8) 2.5整体电路图 (9) 2.6仿真结果 (9) 三、实验心得与体会 (10) 四、实验程序 (10) 参考文献 (18)

前言 单片机,全称单片微型计算机(英语:Single-Chip Microcomputer),又称微控制器 应(不用外接硬件)和节约成本。它的最大优点是体积小,可放在仪表内部,但存储量小,输入输出接口简单,功能较低。由于其发展非常迅速,旧的单片机的定义已不能满足,所以在很多应用场合被称为范围更广的微控制器;从上世纪80年代,由当时的4位、8位单片机,发展到现在的32位300M的高速单片机。现代人类生活中所用的几乎每件有电子器件的产品中都会集成有单片机。手机、电话、计算器、家用电器、电子玩具、掌上电脑以及鼠标等电子产品中都含有单片机。汽车上一般配备40多片单片机,复杂的工业控制系统上甚至可能有数百片单片机在同时工作!单片机的数量不仅远超过PC机和其他计算机的总和,甚至比人类的数量还要多。 是以电流刺激液晶分子产生点、线、面配合背部灯管构成画面。由一定数量的彩色或黑白像素组成,放置于光源或者反射面前方。液晶显示器功耗低,因此倍受工程师青睐,适用于使用电池的电子设备。英国科学家在上世纪制造了第一块液晶显示器即LCD。而第一台可操作的LCD基于动态散射模式(Dynamic Scattering Mode,DSM),是RCA公司乔治·海尔曼带领的小组开发的。 LED点阵屏通过LED(发光二极管)组成,以灯珠亮灭来显示文字、图片、动画、视频等,是各部分组件都模块化的显示器件,通常由显示模块、控制系统及电源系统组成。LED点阵显示屏制作简单,安装方便,被广泛应用于各种公共场合,如汽车报站器、广告屏以及公告牌等。 交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成4*4=16个按键, 键盘是合理的。

数码管动态显示与矩阵键盘的编程

实验四综合应用设计——数码管动态显示与矩阵键盘的编程 一、实验目的: 1、掌握单片机I/O技术和子程序设计等综合知识。 2、了解矩阵式键盘的内部结构和数码管显示的基本原理,掌握至少一种常用的按键识别方法。 3、熟练掌握数码管动态显示和矩阵键盘识别的综合应用。 二、实验内容: 设计一个矩阵键盘的识别和动态显示综合的系统,控制8个8段数码管动态扫描显示4*4矩阵键盘上按下的按键所对应的值。 三、实验要求: 给定一个4*4的矩阵键盘,16个按键对应显示0123456789ABCDE,第1次按下某按键在第一个8段数码管上显示对应的值,第2次在第二个数码管上显示,以此类推,第9次又在第一个数码管上显示,以此循环下去。其中ABCDE在数码管上无法表达,可以用其它代替,例如:B用8表示,D用0表示,E用H表示等。 四、实验设备及实验耗材: 计算机一台,W A VE6000软件模拟器,完成ISP下载的XLISP软件,XL1000单片机综合仿真试验仪一台(8个8段数码管,4*4矩阵键盘一个,89S51一片,9针对9针的串口线一条,5V稳压电源线一条) 五、实验基本原理与方法: 查阅相关资料掌握矩阵式键盘的内部结构,8段数码管动态显示原理和常用的按键识别方法,建议使用按键识别方法中最常用的“行扫描法”编写程序。结合动态显示技术和矩阵键盘识别技术。 六、实验方案设计: 1、采用哪些I/O口完成通信,采用何种按键识别的方法,如何综合动态显示技术和矩 阵键盘识别技术。 2、说明该程序的功能。 3、硬件连接原理图。 七、实验步骤: 1.弄清实验内容和实验要求。 2.学习相关理论知识,提出实验方案,画出程序流程图。

矩阵键盘显示系统

1 4×4矩阵式键盘识别显示系统概述 矩阵式键盘模式以N个端口连接控制N*N个按键,实时在LED数码管上显示按键信息。显示按键信息,既降低了成本,又提高了精确度,省下了很多的I/O 端口为他用,相反,独立式按键虽编程简单,但占用I/O口资源较多,不适合在按键较多的场合应用。并且在实际应用中经常要用到输入数字、字母、符号等操作功能,如电子密码锁、电话机键盘、计算器按键等,至少都需要12到16个按键,在这种情况下如果用独立式按键的话,显然太浪费I/O端口资源,为了解决这一问题,我们使用矩阵式键盘。 矩阵式键盘又称行列键盘,它是用N条I/O线作为行线,N条I/O线作为列线组成的键盘。在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为N×N个。这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。 最常见的键盘布局如图1.1所示。一般由16个按键组成,在单片机中正好可以用一个P口实现16个按键功能,这也是在单片机系统中最常用的形式,本设计就采用这个键盘模式。 图1.1 键盘布局

2系统主要硬件电路设计 2.1单片机控制系统原理 图2.1 单片机控制系统原理框图 2.2单片机主机系统电路 AT89C52单片机是51系列单片机的一个成员,是52单片机的简化版。内部自带2K字节可编程FLASH存储器的低电压、高性能COMS八位微处理器,与Intel MCS-52系列单片机的指令和输出管脚相兼容。由于将多功能八位CPU和闪速存储器结合在单个芯片中,因此,AT89C52构成的单片机系统是具有结构最简单、造价最低廉、效率最高的微控制系统,省去了外部的RAM、ROM和接口器件,减少了硬件开销,节省了成本,提高了系统的性价比。 图2.2 单片机主机系统图

基于51单片机100天倒计时数码管显示(共阴) (附加时分秒显示)

基于51单片机100天倒计时数码管显示 (共阴) (附加时分秒显示) #include unsigned char s[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char e3,f3,g3,h3,count,flag0,flag2,flag3,flag4,j,a1,a2,a3,a4,b1,b2; void delay(unsigned char i); signed int time1=100,time0=59,time3=59,time4=23; void sm(); void time2(); void hms1 (); void timej (); void timez (); sbit ks=P1^4; sbit hms=P1^5; sbit add=P1^6; sbit bat=P1^7; void sm() //100天数码管显示 { e3=time1/100; f3=time1%100/10; g3=time1%100%10; P2=0x00; P0=s[e3]; delay(2); P2=0x01; P0=s[f3]; delay(2); P2=0x02; P0=s[g3]; delay(2); a1=time4%60/10; //时显示 a2=time4%60%10; a3=time3%60/10; //分显示 a4=time3%60%10; P2=0x03; P0=s[a1]; delay(2); P2=0x04;

delay(2); P2=0x05; P0=s[a3]; delay(2); P2=0x06; P0=s[a4]; delay(2); b1=time0%60/10; 秒显示b2=time0%60%10; P2=0x07; P0=s[b1]; delay(2); P2=0x08; P0=s[b2]; delay(2); } void main() { TMOD=0x01; TH0=0x3c; TL0=0xb0; EA=1; ET0=1; while(1) { sm(); time2(); hms1(); timej(); timez(); } } void time2() //计时开始{ if(ks==0) {delay(10);} if(ks==0) {flag0=1;} if(flag0==1&&ks==1)

相关主题
文本预览
相关文档 最新文档