电子系统设计专题实验报告
学院:电信学院
班级:
姓名:
学号:
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;
}