#ifndef__Matrix_H__

#define__Matrix_H__

#ifdef__cplusplus

extern"C" {

#endif

#define SET         0x1 //置1操作

#define CLEAR           0x2 // 清0操作

#define NEGATE      0x3 //取反操作

#defineMOVE_UP     0x1 // 向上平移1

#defineMOVE_DOWN   0x2 // 向下平移1

#defineMOVE_LEFT   0x3 // 向左平移1

#defineMOVE_RIGHT 0x4 // 向右平移1

// 列数据输出到P0口

#defineMatrixOutputData(Dat) {P0 = (Dat);}

// P2口输出对应列的扫描选择线,低有效

#defineMatrixOutputSelect(Select) {P2 = ~(1<

void MatrixClearScreen(void);

void MatrixMove(unsigned char Direction, unsigned char Filling);

unsigned char*MatrixGetBuffer(void);

void MatrixScan(void);

void MatrixSetPoint(unsigned char x, unsigned char y, unsigned char Operation);

#ifdef__cplusplus

}

#endif

#endif/*__Matrix_H__*/

外部应用通过引入点阵屏的模块头文件Matrix.h来实现调用点阵屏驱动函数,简单测试调用(心形在点阵屏内随机平移)实现如下:

#include"reg52.h"

#include"Matrix.h"

// 心形坐标数据

static unsigned charcode HeartShape[][2] = {

{3, 3}, {4, 2}, {5,3}, {5, 4}, {4, 5},

{3, 6}, {2, 5}, {1,4}, {1, 3}, {2, 2},

};

// 以定时器时间为计时标准,记录时间间隔

static volatileunsigned int SystemTick = 0;

// 定时器1.5ms中断处理进行数码管刷新

void T0_Interrupt()interrupt 1

{

TH0 = (65536-1500) / 256;

TL0 = (65536-1500) % 256;

SystemTick++; // 记录时间间隔

MatrixScan(); // 刷新数码管

}

void T0_Init()

{

TMOD = 0x01; // 定时器0工作方式1

// 1.5ms计时中断(12M)

TH0 = (65536-1500) / 256;

TL0 = (65536-1500) % 256;

ET0 = 1; // 定时器T0中断允许

EA = 1; // 总中断允许

}

void main()

{

unsigned char *pBuffer;

unsigned char State = 0;

unsigned char Point;

unsigned char Direction;

unsigned char DataAnd;

unsigned char i;

// 定时器初始化

T0_Init();

// 获得点阵显存,以作数据处理

pBuffer = MatrixGetBuffer();

// 点阵屏清屏

MatrixClearScreen();

// 开启定时器进行计时以及点阵扫描

TR0 = 1;

Point = 0;

while(1) {

switch (State) {

case 0:    //状态0为逐点打出心形

if (SystemTick > 334) { // 500ms打心形的一个点

SystemTick = 0;

MatrixSetPoint(HeartShape[Point][0],HeartShape[Point][1], CLEAR);

Point++;

if (Point >sizeof(HeartShape)/sizeof(HeartShape[0])) {

State = 1; // 心形打完,进入状态1,是否到边界判断

Direction = TL0& 0x3; // 随机得出心形的移动方向

}

}

break;

case 1:    // 状态1为心形是否移动到点阵屏边界的判断

switch (Direction) { // 移动方向判断是否到相应方向的边界

case 0:    // 左边界判断

// 第一列的点有一个亮,则认为图形到了左边界

if (pBuffer[0] !=0xff) {

Direction = TL0& 0x3; // 重新选择移动方向

} else {

State = 2; // 未到左边界,进入状态2进行左平移

}

break;

case 1:    // 右边界判断

// 第八列的点有一个亮,则认为图形到了右边界

if (pBuffer[7] !=0xff) {

Direction = TL0& 0x3; // 重新选择移动方向

} else {

State = 2; // 未到右边界,进入状态2进行右平移

}

break;

case 2:    // 上边界判断

// 所有列的第一行点有一个亮,则认为图形到了上边界

DataAnd = 0xff;

for (i=0; i<8; i++) {

DataAnd &= pBuffer[i];

}

if (DataAnd & 0x1) {

State = 2; // 未到上边界,进入状态2进行上平移

} else {

Direction = TL0& 0x3; // 重新选择移动方向

}

break;

case 3:    // 下边界判断

// 所有列的第八行点有一个亮,则认为图形到了下边界

DataAnd = 0xff;

for (i=0; i<8; i++) {

DataAnd &= pBuffer[i];

}

if (DataAnd & 0x80) {

State = 2; // 未到下边界,进入状态2进行下平移

} else {

Direction = TL0& 0x3; // 重新选择移动方向

}

break;

default:

break;

}

break;

case 2:    // 状态2为对点阵屏平移

if (SystemTick < 667){  // 1s平移1次

continue;

}

SystemTick = 0;

switch (Direction) {

case 0:    // 左平移,平移后的空缺位置灭

MatrixMove(MOVE_LEFT, 0xff);

break;

case 1: // 右平移,平移后的空缺位置灭

MatrixMove(MOVE_RIGHT,0xff);

break;

case 2:    // 上平移,平移后的空缺位置灭

MatrixMove(MOVE_UP, 0xff);

break;

case 3:    // 下平移,平移后的空缺位置灭

MatrixMove(MOVE_DOWN, 0xff);

break;

default:

break;

}

State = 1; // 平移后再进入状态1进行边界检测

break;

default:

break;

}

}

}

51单片机led点阵C语言,51单片机驱动LED点阵扫描显示C语言程序相关推荐

  1. led linux定时闪烁心跳,Linux驱动——LED闪烁

    连接开发板和PC,然后打开S3C开发板的电源开关,成功启动后,执行build.sh脚本文件编译和安装LED驱动.build脚本文件会自动将驱动的.ko文件上传到S3C开发板并安装. LED驱动会建立一 ...

  2. 51单片机STC 89C52RC进阶 – 自制8x8点阵、点亮单颗LED、显示点阵汉字

    电路及驱动原理 上图是CS1088B的8x8 LED点阵的部分技术文档截图,最下面就是这个点阵模块的基本电路图. 其实很简单,每一横行控制LED的一极,每一竖列又控制LED的另一极.又因为是一个矩阵, ...

  3. c语言52单片机液晶屏显示,[手把手教你学51单片机C语言教程]22 LCD12864液晶屏显示.pdf...

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbspC/C++资料 [手把手教你学51单片机C语言教程]22 LCD ...

  4. c语言51单片机外部中断,51单片机外部中断0实例详解

    今天就以51单片机的外部中断0为例,来简单讲解一下单片机中断的用法. 1 51单片机的中断源 51单片机共有5个中断源,分别为:外部中断0 定时器0中断 外部中断1 定时器1中断 串口中断 每一个中断 ...

  5. c语言单片机停车场收费系统,基于51单片机停车场车位引导系统设计

    ?周明彬 曾伊玲 摘要:在很多人流量大的地方,因为车辆集中的情况,所以每次经过停车场时都需要工作人员来指挥车辆,告诉车主停车场那些地方还有空余车位可以泊车.所以很多地方的旧停车场使用的管理方式,是十分 ...

  6. 51单片机呼吸灯c语言,51单片机呼吸灯C语言版.doc

    基于单片机与PWM的呼吸灯设计 实训指导教师: 班 级: 设 计 人姓名: 设 计 日 期: 设 计 地 点: 完 成 时 间: 摘要 本设计是基于单片机的原理与接口设计,采用单片机I/O口,加以C语 ...

  7. 【74HC595】51单片机(普中A2开发板)LED点阵屏点亮以及74HC595芯片的使用笔记

    使用74HC595芯片驱动LED点阵屏的使用笔记 1.控制显示LED点阵屏的思路 2.74HC595芯片的学习 2.1.74HC595芯片是什么? 2.2.74HC595芯片各引脚解释以及分析 2.3 ...

  8. 基于单片机的c语言倒计时程序,30秒倒计时c语言51单片机实现.doc

    30秒倒计时c语言51单片机实现 原理图: 程序: #include #define uchar unsigned char #define uint unsigned int sbit dula=P ...

  9. c语言数码管流动显示一个数,51单片机数码管动态显示 - 数码管动态扫描显示01234567程序(三种方案)...

    数码管动态扫描显示01234567程序二--51单片机动态显示共阳数码管01234567 原理图 c语言程序 程序如下: #include #define uint unsigned int #def ...

最新文章

  1. 【设计模式系列】结构型模式之Proxy模式
  2. ASP.NET夜话笔记06
  3. mysql锁相关讲解及其应用——《深究mysql锁》
  4. kafka单机安装(版本kafka_2.11-2.2.0.tgz)
  5. 洛谷P1082 同余方程 数论
  6. 【job】2013年5-5阿里巴巴暑期实习招聘笔试题目及部分答案
  7. head first java原文_Head First Java
  8. android密码可见不可见的光标控制,Android EditText 在设置为输入密码的时候 密码是否可见 光标在最后显示...
  9. 苹果秋季新品将要发布,MacBook Pro都有哪些变化
  10. c++ string substr_用std::string_view替换leveldb的Slice
  11. 线性代数及其应用第一章总结
  12. RocketMQ 监控平台搭建与项目引入
  13. UML之包图(Package Diagram)
  14. 传奇人物李兴平5000万卖掉hao123后在做什么
  15. java之21点游戏(只包含一个玩家和一个庄家,是否抓牌,没有黑杰克)
  16. 《Java语言程序设计与数据结构(基础篇)》第11版第四章复习题答案
  17. PHP完成微信小程序在线支付功能
  18. [Paper Reading] Dynamo: Amazon‘s Highly Available Key-value Store
  19. 数据读取机制Dataloader和Dataset和Transforms
  20. 【案例实践】WRF-Python融合技术:WRF 模式前后处理、自动化运行、数据处理、可视化绘图

热门文章

  1. win10 win7 php,win10降win7的方法
  2. mathtype中的字号与word相对应
  3. 农历与西历对照、万年历
  4. 武林外传老是显示服务器未响应,武林外传手游启动闪退及获取服务器列表失败解决方法...
  5. Springboot毕业设计毕设作品,农产品销售系统设计与实现
  6. Java微服务单实例
  7. 关于数据冗余的一点思考
  8. 公理定理定律的区别与联系
  9. 融云im callkit 会话遇到的坑融云研究
  10. 微信小程序获取当前的位置地名