题目:
练习题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点阵右移