第七章 变量进阶与点阵LED 练习题

题目:

练习题1:

       关于变量的作用域和存储类别,这些关于C语言的一些基础知识在 浙大版《C语言程序设计(第三版)》中已经全面涉及,在此不一一赘述。 

练习题2:

 如图所示,为8*8LED点阵的外观和8*8点阵结构原理图

        类似数码管动态显示,LED点阵的动画显示也是类似,通过不断地刷新,利用人眼的“余辉效应”,来让人感觉到就是一副图画在显示。

练习题3:

#include <reg52.h>   

sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

unsigned char code imag[]={
0xFF,0xFF,0x81,0x81,0xE7,0xE7,0xE7,0xE7,0xE7,0xE7,0xE7,0x81,0x81,0xFF,0xFF,0xFF,
0xFF,0xC3,0x81,0x00,0x00,0x00,0x81,0xC3,0xE7,0xFF,0xFF,0xFF,0xFF,0x99,0x99,0x99,
0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x81,0x81,0xC3,0xC3,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF
};                                            #通过字模软件生成相应的
void main()
{
    

    EA = 1;       //使能总中断
    ENLED = 0;    //使能U3
    ADDR3 = 0;    //因为需要动态改变ADDR0-2的值,所以不需要再初始化了
    TMOD = 0x10;  //设置T1为模式1
    TH1  = 0xFC;  //为T1赋初值0xFC67,定时1ms
    TL1  = 0x67;
    ET1  = 1;     //使能T1中断
    TR1  = 1;     //启动T1
    
    while (1);
}
// 定时器1中断服务函数,利用定时器实现动态的刷新LED点阵屏幕
void InterruptTimer1() interrupt 3
{
  	static unsigned char i=0;
	static unsigned char tmr=0;
	static unsigned char index=0;

	TH1=0xfc;
	TL1=0x67;
	P0=0XFF;

	switch(i)
	{
	 case 0:ADDR2=0;ADDR1=0;ADDR0=0;i++;P0=imag[0+index];break;
	 case 1:ADDR2=0;ADDR1=0;ADDR0=1;i++;P0=imag[1+index];break;
	 case 2:ADDR2=0;ADDR1=1;ADDR0=0;i++;P0=imag[2+index];break;
	 case 3:ADDR2=0;ADDR1=1;ADDR0=1;i++;P0=imag[3+index];break;
	 case 4:ADDR2=1;ADDR1=0;ADDR0=0;i++;P0=imag[4+index];break;
	 case 5:ADDR2=1;ADDR1=0;ADDR0=1;i++;P0=imag[5+index];break;
	 case 6:ADDR2=1;ADDR1=1;ADDR0=0;i++;P0=imag[6+index];break;
	 case 7:ADDR2=1;ADDR1=1;ADDR0=1;i=0;P0=imag[7+index];break;
	}
    tmr++;
	if(tmr>=250){
		 tmr=0;
		 index++;
		 if(index>=43){
		   index=0;
		 }
	}    
}

效果:

LED点阵动画显示

练习题4:

        本练习题要求让LED显示屏显示向右的动画,因为该开发板为横向扫描,所以有两种方式让LED点阵显示向右的动画。第一种方法:将LED点阵屏幕转置,然后按照练习题3中的方法进行设计以及编写代码进行运行。第二种方法:利用二维数组的知识,就是将每一帧的数值都存在一个数组里面,因为代码比较繁琐,仅仅给出作者资料中给出的源码。

/*
*******************************************************************************
*                     《手把手教你学51单片机(C语言版)》
*                    配套 KST-51 单片机开发板 示例源代码
*
*         (c) 版权所有 2014 金沙滩工作室/清华大学出版社 保留所有权利
*                 获取更多资料请访问:http://www.kingst.org
*
* 文件名:main.c
* 描  述:第7章 作业题4 
* 版本号:v1.0.0
* 备  注:lesson7_7的向左移动改为向右移动
*******************************************************************************
*/

#include <reg52.h>

sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

unsigned char code image[30][8] = {
    {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},
    {0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE},
    {0xFF,0xFC,0xFE,0xFE,0xFE,0xFE,0xFE,0xFC},
    {0xFF,0xF8,0xFC,0xFC,0xFC,0xFC,0xFC,0xF8},
    {0xFF,0xF0,0xF9,0xF9,0xF9,0xF9,0xF9,0xF0},
    {0xFF,0xE1,0xF3,0xF3,0xF3,0xF3,0xF3,0xE1},
    {0xFF,0xC3,0xE7,0xE7,0xE7,0xE7,0xE7,0xC3},
    {0xFF,0x87,0xCE,0xCE,0xCE,0xCF,0xCF,0x87},
    {0xFF,0x0E,0x9C,0x9C,0x9C,0x9E,0x9F,0x0F},
    {0xFF,0x1C,0x38,0x38,0x38,0x3C,0x3E,0x1F},
    {0xFF,0x39,0x70,0x70,0x70,0x78,0x7C,0x3E}, 
    {0xFF,0x73,0xE0,0xE0,0xE0,0xF0,0xF8,0x7C},
    {0xFF,0xE6,0xC0,0xC0,0xC0,0xE0,0xF0,0xF9},
    {0xFF,0xCC,0x80,0x80,0x80,0xC0,0xE1,0xF3},
    {0xFF,0x99,0x00,0x00,0x00,0x81,0xC3,0xE7},
    {0xFF,0x33,0x01,0x01,0x01,0x03,0x87,0xCF},
    {0xFF,0x67,0x03,0x03,0x03,0x07,0x0F,0x9F},
    {0xFF,0xCE,0x06,0x06,0x06,0x0E,0x1E,0x3F},
    {0xFF,0x9C,0x0C,0x0C,0x0C,0x1C,0x3C,0x7E},
    {0xFF,0x39,0x19,0x19,0x19,0x39,0x78,0xFC},
    {0xFF,0x73,0x33,0x33,0x33,0x73,0xF0,0xF8},
    {0xFF,0xE6,0x66,0x66,0x66,0xE6,0xE0,0xF0},
    {0xFF,0xCC,0xCC,0xCC,0xCC,0xCC,0xC0,0xE1},
    {0xFF,0x99,0x99,0x99,0x99,0x99,0x81,0xC3},
    {0xFF,0x33,0x33,0x33,0x33,0x33,0x03,0x87},
    {0xFF,0x67,0x67,0x67,0x67,0x67,0x07,0x0F},
    {0xFF,0xCF,0xCF,0xCF,0xCF,0xCF,0x0F,0x1F},
    {0xFF,0x9F,0x9F,0x9F,0x9F,0x9F,0x1F,0x3F},
    {0xFF,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x7F},
    {0xFF,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0xFF},
};

void main()
{
    EA = 1;       //使能总中断
    ENLED = 0;    //使能U4,选择LED点阵
    ADDR3 = 0;
    TMOD = 0x01;  //设置T0为模式1
    TH0  = 0xFC;  //为T0赋初值0xFC67,定时1ms
    TL0  = 0x67;
    ET0  = 1;     //使能T0中断
    TR0  = 1;     //启动T0
    while (1);
}
/* 定时器0中断服务函数 */
void InterruptTimer0() interrupt 1
{
    static unsigned char i = 0;  //动态扫描的索引
    static unsigned char tmr = 0;  //250ms软件定时器
    static unsigned char index = 0;  //图片刷新索引

    TH0 = 0xFC;  //重新加载初值
    TL0 = 0x67;
    //以下代码完成LED点阵动态扫描刷新
    P0 = 0xFF;   //显示消隐
    switch (i)
    {
        case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=image[index][0]; break;
        case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=image[index][1]; break;
        case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=image[index][2]; break;
        case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=image[index][3]; break;
        case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=image[index][4]; break;
        case 5: ADDR2=1; ADDR1=0; ADDR0=1; i++; P0=image[index][5]; break;
        case 6: ADDR2=1; ADDR1=1; ADDR0=0; i++; P0=image[index][6]; break;
        case 7: ADDR2=1; ADDR1=1; ADDR0=1; i=0; P0=image[index][7]; break;
        default: break;
    }
    //以下代码完成每250ms改变一帧图像
    tmr++;
    if (tmr >= 250)  //达到250ms时改变一次图片索引
    {
        tmr = 0;
        index++;
        if (index >= 30)  //图片索引达到30后归零
        {
            index = 0;
        }
    }
}

效果:

LED点阵右移

练习五:因为在练习四和练习三中,已经了解了LED点阵屏幕如何左右和上下动态显示。该练习题也是类似的做法,不详细解答。

练习题六:尝试实现流水灯,数码管和点阵同时显示,也是通过单片机的定时器作用,利用余辉效应,感觉是在同时显示。对于每一种效果的显示,可以单独设计函数来进行实现,这里就不详细解答了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值