其他
单片机点阵 LED 设计显示屏,超详细!
#include <reg52.h>
sbit LED = P0^0;
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
void main(){
ENLED = 0; //U3、U4 两片 74HC138 总使能
ADDR3 = 0; //使能 U4 使之正常输出
ADDR2 = 0; //经 U4 的 Y0 输出开启三极管 Q10
ADDR1 = 0;
ADDR0 = 0;
LED = 0; //向 P0.0 写入 0 来点亮左上角的一个点
while(1); //程序停止在这里
}
#include <reg52.h>
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
void main(){
ENLED = 0; //U3、U4 两片 74HC138 总使能
ADDR3 = 0; //使能 U4 使之正常输出
ADDR2 = 0; //经 U4 的 Y1 输出开启三极管 Q11
ADDR1 = 0;
ADDR0 = 1;
P0 = 0x00; //向 P0 写入 0 来点亮一行
while(1); //程序停止在这里
}
#include <reg52.h>
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
void main(){
EA = 1; //使能总中断
ENLED = 0; //使能 U4,选择 LED 点阵
ADDR3 = 0; //因为需要动态改变 ADDR0-2 的值,所以不需要再初始化了
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; //动态扫描的索引
TH0 = 0xFC; //重新加载初值
TL0 = 0x67;
//以下代码完成 LED 点阵动态扫描刷新
P0 = 0xFF; //显示消隐
switch (i){
case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=0x00; break;
case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=0x00; break;
case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=0x00; break;
case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=0x00; break;
case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=0x00; break;
case 5: ADDR2=1; ADDR1=0; ADDR0=1; i++; P0=0x00; break;
case 6: ADDR2=1; ADDR1=1; ADDR0=0; i++; P0=0x00; break;
case 7: ADDR2=1; ADDR1=1; ADDR0=1; i=0; P0=0x00; break;
default: break;
}
}
#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[] = { //图片的字模表
0xFF, 0x99, 0x00, 0x00, 0x00, 0x81, 0xC3, 0xE7
};
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; //动态扫描的索引
TH0 = 0xFC; //重新加载初值
TL0 = 0x67;
//以下代码完成 LED 点阵动态扫描刷新
P0 = 0xFF; //显示消隐
switch (i){
case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=image[0]; break;
case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=image[1]; break;
case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=image[2]; break;
case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=image[3]; break;
case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=image[4]; break;
case 5: ADDR2=1; ADDR1=0; ADDR0=1; i++; P0=image[5]; break;
case 6: ADDR2=1; ADDR1=1; ADDR0=0; i++; P0=image[6]; break;
case 7: ADDR2=1; ADDR1=1; ADDR0=1; i=0; P0=image[7]; break;
default: break;
}
}
#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[] = { //图片的字模表
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xC3,0xE7,0xE7,0xE7,0xE7,0xE7,0xC3,0xFF,
0x99,0x00,0x00,0x00,0x81,0xC3,0xE7,0xFF,
0x99,0x99,0x99,0x99,0x99,0x81,0xC3,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,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 >= 32){ //图片索引达到 32 后归零
index = 0;
}
}
}
#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}, //动画帧 1
{0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F}, //动画帧 2
{0xFF,0x3F,0x7F,0x7F,0x7F,0x7F,0x7F,0x3F}, //动画帧 3
{0xFF,0x1F,0x3F,0x3F,0x3F,0x3F,0x3F,0x1F}, //动画帧 4
{0xFF,0x0F,0x9F,0x9F,0x9F,0x9F,0x9F,0x0F}, //动画帧 5
{0xFF,0x87,0xCF,0xCF,0xCF,0xCF,0xCF,0x87}, //动画帧 6
{0xFF,0xC3,0xE7,0xE7,0xE7,0xE7,0xE7,0xC3}, //动画帧 7
{0xFF,0xE1,0x73,0x73,0x73,0xF3,0xF3,0xE1}, //动画帧 8
{0xFF,0x70,0x39,0x39,0x39,0x79,0xF9,0xF0}, //动画帧 9
{0xFF,0x38,0x1C,0x1C,0x1C,0x3C,0x7C,0xF8}, //动画帧 10
{0xFF,0x9C,0x0E,0x0E,0x0E,0x1E,0x3E,0x7C}, //动画帧 11
{0xFF,0xCE,0x07,0x07,0x07,0x0F,0x1F,0x3E}, //动画帧 12
{0xFF,0x67,0x03,0x03,0x03,0x07,0x0F,0x9F}, //动画帧 13
{0xFF,0x33,0x01,0x01,0x01,0x03,0x87,0xCF}, //动画帧 14
{0xFF,0x99,0x00,0x00,0x00,0x81,0xC3,0xE7}, //动画帧 15
{0xFF,0xCC,0x80,0x80,0x80,0xC0,0xE1,0xF3}, //动画帧 16
{0xFF,0xE6,0xC0,0xC0,0xC0,0xE0,0xF0,0xF9}, //动画帧 17
{0xFF,0x73,0x60,0x60,0x60,0x70,0x78,0xFC}, //动画帧 18
{0xFF,0x39,0x30,0x30,0x30,0x38,0x3C,0x7E}, //动画帧 19
{0xFF,0x9C,0x98,0x98,0x98,0x9C,0x1E,0x3F}, //动画帧 20
{0xFF,0xCE,0xCC,0xCC,0xCC,0xCE,0x0F,0x1F}, //动画帧 21
{0xFF,0x67,0x66,0x66,0x66,0x67,0x07,0x0F}, //动画帧 22
{0xFF,0x33,0x33,0x33,0x33,0x33,0x03,0x87}, //动画帧 23
{0xFF,0x99,0x99,0x99,0x99,0x99,0x81,0xC3}, //动画帧 24
{0xFF,0xCC,0xCC,0xCC,0xCC,0xCC,0xC0,0xE1}, //动画帧 25
{0xFF,0xE6,0xE6,0xE6,0xE6,0xE6,0xE0,0xF0}, //动画帧 26
{0xFF,0xF3,0xF3,0xF3,0xF3,0xF3,0xF0,0xF8}, //动画帧 27
{0xFF,0xF9,0xF9,0xF9,0xF9,0xF9,0xF8,0xFC}, //动画帧 28
{0xFF,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFE}, //动画帧 29
{0xFF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF} //动画帧 30
};
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;
}
}
}
推荐阅读
【01】最强干货!延时功能进化论(适用于单片机和任何延时平台)【02】嵌入式软件面试那点事【03】嵌入式软件工程师从初级迈入合格,可以这么来做!【04】回想一下你操作正确吗?FPGA复位的正确打开方式【05】关于嵌入式 Qt 最全最棒的教程(万字干货)