只要对应的一段给予高电平点亮,即可自己组合出各种符号。
如给:0b00110001显示P,0b1100011显示L,0b10010001显示H,00011001显示q等
2、修改程序,控制一个8段数码管循环显示0~F 16个字符,每个字符显示1s,并在显示的1s内,数码管的小数点要亮0.5s,灭0.5s。
flash unsigned char
led_7[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07, 0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71}; void display(void) { char i;
for(i=0;i<=15;i++) { PORTA = led_7[i]; PORTA |= 0x80; PORTC = position[1]; delay_ms(500); PORTA |= 0x00;
delay_ms(500);
PORTC = 0xff; } }
七、遇到的问题及解决方法
进行实验内容2时,只有5个数码管显示,但是我每个数码管都是接了线的。 经过仔细检查,我发现我是从mega16最下面的接口开始接的,于是错开了一位,第六根线接到另外的接口上了,于是便只显示五位。重新校对接线,问题便解决了。
八、心得体会
通过本次试验,我设计实现单个数码管字符显示,控制一个数码管循环显示“0”-“F”16个字符功能的电路。同时了设计一个综合实验——秒表系统。为了方便的再程序中使用显示的数码管的数值,我们制作了一个显示表,以方便之后的使用。
flash unsigned char
led_7[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};关键字flash表示将数据存放到Flash中,LED_7数组中
27
的量都是固定值,将它们存放到Flash中不会占用有限的Ram资源。
本次实验,我学习到八段数码管的显示方法,并根据字型段码对照表,成功编写代码,实现实验要求。
28
新建项目
四、实验步骤
二、实验内容
一、实验目的
实验五 按键实验
读取键值的函数: #define NO_KEY 0 #define KEY1 1 #define KEY2 2
#define KEY1_PIN ~PIND.2 #define KEY2_PIN ~PIND.3
三、实验所用仪表及设备
硬件连接图如图5.3所示。
硬件:PC机一台、AVR_StudyV1.1实验板
(1)掌握ATMega16的I/O输出特性和使用。
(2)了解按键的使用,及按键消抖的原理与实现。
软件:CodeVision AVR集成开发软件、SLISP下载软件
数码管显示的数值加1;每按一次按键KEY2,数码管显示的数值减1。
(1)单个按键实验,按键控制数码管显示0 — 9,每按一次按键KEY1,
图5.3
29
unsigned char readkey(void) {
if(KEY1_PIN) //判断KEY1是否按下 {
delay_ms(20); //延时20ms,屏蔽抖动区 if(KEY1_PIN) //再次判断KEY1是否按下 {
while(KEY1_PIN); //等待按键释放 return KEY1; //返回键值1 } }
else if(KEY2_PIN) //判断KEY2是否按下 {
delay_ms(20); //延时20ms,屏蔽抖动区 if(KEY2_PIN) //再次判断KEY2是否按下 {
while(KEY2_PIN); //等待按键释放 return KEY2; //返回键值2 } }
return NO_KEY; //没有按键按下,返回键值0 }
说明:PIND.2就表示PIND的第二位,在头文件mega16.h中已给我们定义好,我们可以很方便地操作8位寄存器的每一位。如PORTA.7 = 1;//将PORTA的第7位置1,不影响其它位。它相当于PORTA |= (1 <<7);
五、实验现象
实验内容1:
按K1键时,数码管示数加一,按K2键时示数减一,但是按键时如果不小心,示数的增量就不是1,我按K1的时候故意抖动了一下,示数加2,由1变为3
思考题:K1控制秒表的启动和停止,并进行了消抖处理
30
六、思考题
停止。(硬件连接如图5.4所示)
图5.4
#define NO_KEY 0 #define KEY1 1 #define KEY2 2
#define KEY1_PIN ~PIND.2 #define KEY2_PIN ~PIND.3 char KEY
void char readkey(void) {
if(KEY1_PIN) //判断KEY1是否按下 {
delay_ms(20); //延时20ms,屏蔽抖动区 if(KEY1_PIN) //再次判断KEY1是否按下 {
while(KEY1_PIN); //等待按键释放
KEY = !KEY; //标志位取反
(1)修改实验四的秒表系统,增加一个按键,实现按键控制秒表的启动和
31