文档库 最新最全的文档下载
当前位置:文档库 › 数码管动态显示程序设计

数码管动态显示程序设计

电子系统设计专题实验报告

学院:电信学院

班级:

姓名:

学号:

Email:

日期:

实验三、数码管动态显示程序设计

一、实验目的和要求

【实验目的】

1. 熟悉单片机数码管电路结构原理;

2. 学会单片机C语言I/O端口编程控制方法;

3. 学会外部显示部件LED灯的软件编程使用方法;

4. 学会单片机开发系统的软件调试方法。

【实验要求】

1. 仔细阅读示例程序,了解程序的设计方法,完成示例程序的编译、调试、下载验证,运行结果正确;

2. 修改示例程序的延时参数及其他参数,使之能够快速稳定的显示1-8的8个数据,即动态扫描显示效果。

3. 自己设计实现8位数码管能够自动进位计数显示的功能程序,并在实验系统平台完成编译、调试、下载验证,运行结果正确。

4. * 编写程序,显示教师指定的符号形状。

二、实验设备及设计开发环境

1. 单片机平台:AVR ATmega128实验开发板;

2. 开发环境平台:AVR Studio 4.18集成开发软件;WinAVR(GCC) 2010 C 语言编译器;JTAGICE mkII在线仿真器。

三、实验的电路原理

电路由两个锁存器及8位七段共阳极数码管组成;

两个锁存器,分别管理段码和位码,通过使能编程实现段码和位码的操作;

位码操作:选定将要进行显示的某一位数码管;

段码操作:输出欲显示的字符的段码;

程序设计及分析

设计思路:

1)端口初始化

2)关闭位码锁存器,使能段码锁存器(位码锁存使能端输出低电平,段码锁存使能端输出高电平)

参考语句:

PORTG |= _BV(DIG_CS2);//段使能,1

PORTG &= ~_BV(DIG_CS1);//位关闭,0

3)送数码管段码

参考语句:

PORTB = code[j];

4)关闭段码锁存器,使能位码锁存器(位段码锁存使能端输出低电平,位码锁存使能端输出高电平)

参考语句:

PORTG |= _BV(DIG_CS1); //1,位使能

PORTG &= ~_BV(DIG_CS2); //0,段关闭

5)送数码管位码

参考语句:

PORTB = 128;

6)关闭位码锁存器

参考语句:

PORTG &= ~_BV(DIG_CS1); //0,段关闭

PORTG &= ~_BV(DIG_CS2); //0,位关闭

_delay_ms(1);

四、实验结果

【任务一】:输出显示八进制计数

【任务二】:输出显示倒C

五、实验总结

完成了输出显示八进制计数和老师指定要输出的倒C,对七段共阳极数码管有了更深的理解,学会了对其进行段、位码操作。

附录1软件源代码

【任务一】

//功能:输出显示八进制计数

#include

#include

#define DIG_CS1 PG3 // DIG_CS1与ATmega128的PG3相连,位码

#define DIG_CS2 PG4 // DIG_CS2与ATmega128的PG4相连,段码

#define PB_MASK 0xFF

uint8_t code[16] = { 0xC0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e };

voidDIG_Init()

{

PORTB = ~PB_MASK; //数据=初始为高电平

DDRB = PB_MASK; //输出

PORTG &= 0x00; //PG是锁存使能端

DDRG |= _BV(DIG_CS1) | _BV(DIG_CS2); //使能位操作:CS1:段CS2:位

}

int main()

{

int m = 0, com = 1;

DIG_Init();

while(1)

{

for (int a = 0; a < 8; ++a) //千位

{

for (int e = 0; e < 8; ++e) //百位

{

for (inti = 0; i< 8; ++i) //十位

{

for (int j = 0; j < 8; ++j) //个位

{

for (int k = 0; k < 500; ++k)

{

//个位

//段

PORTG |= _BV(DIG_CS2); //段使能,1

PORTG &= ~_BV(DIG_CS1); //位关闭,0

PORTB = code[j];

//位

PORTG |= _BV(DIG_CS1); //1,位使能PORTG &= ~_BV(DIG_CS2); //0,段关闭PORTB = 128;

//关闭

PORTG &= ~_BV(DIG_CS1); //0,段关闭PORTG &= ~_BV(DIG_CS2); //0,位关闭_delay_ms(1);

//十位

//段

PORTG |= _BV(DIG_CS2); //使能PORTG &= ~_BV(DIG_CS1); //取反0 PORTB = code[i];

//位

PORTG |= _BV(DIG_CS1); //1 PORTG &= ~_BV(DIG_CS2); //0 PORTB = 64;

//关闭

PORTG &= ~_BV(DIG_CS1); //0 PORTG &= ~_BV(DIG_CS2); //0

_delay_ms(1);

//百位

//段

PORTG |= _BV(DIG_CS2); //使能PORTG &= ~_BV(DIG_CS1); //取反0 PORTB = code[e];

//位

PORTG |= _BV(DIG_CS1); //1 PORTG &= ~_BV(DIG_CS2); //0 PORTB = 32;

//关闭

PORTG &= ~_BV(DIG_CS1); //0 PORTG &= ~_BV(DIG_CS2); //0

_delay_ms(1);

//千位

PORTG |= _BV(DIG_CS2); //使能PORTG &= ~_BV(DIG_CS1); //取反0 PORTB = code[a];

//位

PORTG |= _BV(DIG_CS1); //1

PORTG &= ~_BV(DIG_CS2); //0

PORTB = 16;

//关闭

PORTG &= ~_BV(DIG_CS1); //0

PORTG &= ~_BV(DIG_CS2); //0

_delay_ms(1);

}

}

}

}

}

}

return 0;

}

【任务二】

//功能:输出显示倒C

#include

#include

#define DIG_CS1 PG3

#define DIG_CS2 PG4

#define PB_MASK 0xFF

uint8_t code[16] = {0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0};

voidDIG_Init()

{

PORTB = ~PB_MASK;

DDRB = PB_MASK;

PORTG &= 0x00;

DDRG |= _BV(DIG_CS1) | _BV(DIG_CS2);

}

int main()

{

inti = 0, com = 1;

DIG_Init();

while(1)

{

for (i = 0; i< 9; ++i)

{

PORTG |= _BV(DIG_CS2); //段码使能,1

PORTG &= ~_BV(DIG_CS1); //位码关闭,0

PORTB = code[i]; //显示led

PORTG |= _BV(DIG_CS1); //位码使能,1

PORTG &= ~_BV(DIG_CS2); //段码关闭,0

PORTB = com; // 位码

com *= 2; //移动位码

PORTG &= ~_BV(DIG_CS1); //关闭位码,0

PORTG &= ~_BV(DIG_CS2); //关闭段码,0

_delay_ms(1); //延时500ms

if(com > 128) //若位码从左至右移至最后一位,则从头开始com =1;

}

}

return 0;

}

相关文档
相关文档 最新文档