2011.10 课堂设计操作练习题以及参考代码
(原文件名:未标题-1 拷贝.jpg)
1.使用8个LED数码管构成一个流水灯,其中只有一段不亮,每隔0.5S顺时(或逆时针)移动。
2.采用软delay、中断+外部时钟、定时器都可以
3.交手画的硬件连接草图
4.说明如何设计0.5S移动的
5.软件(整个目录)在x:\2xx_2xx\建立新的工程,完成后将整个目录拷贝出
/*********************************************
Chip type : ATmega16
Program type : Application
Clock frequency : 4.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*********************************************/
#include <mega16.h>
unsigned char led_7[8]={0x39,0x09,0x09,0x09,0x09,0x09,0x09,0x0f}; //封闭图像的8段码表
unsigned char blk_7[20][2] = {
{0,0x38},{1,0x08},{2,0x08},{3,0x08},{4,0x08},{5,0x08},{6,0x08},{7,0x0e},{7,0x0d},{7,0x0b},
{7,0x07},{6,0x01},{5,0x01},{4,0x01},{3,0x01},{2,0x01},{1,0x01},{0,0x31},{0,0x29},{0,0x19}};
//unsigned char blk_7[20]={0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfd,0xfb,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xef,0xdf};
unsigned char time_counter; // 中断次数计数单元
unsigned char posit,i;
void display(void) // 8位LED数码管动态扫描函数
{
PORTC = 0xff;
if (posit == blk_7[0])
PORTA = blk_7[1];
else
PORTA = led_7[posit];
PORTC = ~(1<<posit);
if (++posit >= 8 ) posit = 0;
}
// Timer 0 比较匹配中断服务,2s执行一次
interrupt [TIM0_COMP] void timer0_comp_isr(void)
{
display(); // 调用LED扫描显示
if (++time_counter >= 125)
{
time_counter = 0;
if(++i >= 20) i=0;
}
}
void main(void)
{
PORTA=0x00; // 显示控制I/O端口初始化
DDRA=0xFF;
PORTC=0xff;
DDRC=0xff;
// T/C0 初始化
TCCR0=0x0B; // 内部时钟,64分频(4M/64=62.5KHz),CTC模式
TCNT0=0x00;
OCR0=0x7c; // OCR0 = 0x7c(124),(124+1)/62.5=2ms
TIMSK=0x02; // 允许T/C0比较匹配中断
#asm("sei") // 开放全局中断
while (1)
{
}
} |