#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;

}

}

}

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

  1. c语言编程TLC2543AD采集,51单片机驱动12位AD转换TLC2543电路图+程序

    51单片机驱动12位AD转换TLC2543电路图+程序 2015-06-18 16:51:15   来源:51hei void resultvolt() { volt=volt*5000.0/4334 ...

  2. 基于51单片机驱动ADXL346 (LCD1602显示)

    基于51单片机驱动ADXL346 (LCD1602显示) 一.ADXL346传感器介绍 1.实物图 2.产品说明 3.电气参数 4.通信协议 二.驱动代码 1.引脚定义 2.初始化函数 3.主函数 三 ...

  3. LED数码管静态显示 C语言程序,PIC单片机驱动LED数码管显示程序

    ;*****该程序用于驱动led数码管显示,在8个LED数码管上依次显示数字1.2.3.4.5.6.7.8******* ;****http://www.51hei.com 单片机学习网经典程序已测试 ...

  4. 单片机显示屏c语言程序,51单片机驱动1602液晶显示器c程序

    51单片机驱动1602液晶显示器c程序 /* 程序效果:单片机控制液晶显示器1602显示字母数字,用户自行更改io 程序版权:http://www.51hei.com */ #include //头文 ...

  5. ds12c887程序C语言,51单片机驱动DS12C887的时钟芯片C语言程序

    本程序旨在读出DS12C887的时间,显示部分只做了分和秒的部分,已通过测试,详细注释很好用的. #include < absacc.h > #include < reg51.h & ...

  6. sja1000编程c语言,基于51单片机SJA1000 CAN通讯实现(C语言程序)

    经过一个星期的艰苦奋斗,终于将两个SJA1000通过51单片机成功通讯了!采用的是Pelican工作模式,扩展帧数据格式,验收滤波器是采用单滤波扩展帧模式. 发送和接收代码都全部相同样! 一 实物图 ...

  7. 基于51单片机驱动MPU6050模块(LCD1602显示)

    @TOC 一.简介 MPU-6050集成了3轴MEMS陀螺仪,3轴MEMS加速度计,以及一个可扩展的数字运动处理器DMP,可用IIC接口连接一个第三方的数字传感器.MPU-6050对陀螺仪和加速度计分 ...

  8. 51单片机led点阵C语言,51单片机驱动LED点阵扫描显示C语言程序

    #ifndef__Matrix_H__ #define__Matrix_H__ #ifdef__cplusplus extern"C" { #endif #define SET  ...

  9. 收音机c语言程序,51单片机驱动TEA5767调频收音机芯片C程序

    /*-----------  TEA5767 驱动-----------*/ /*------   外部晶振为  12MHz-------*/ /*--------最后修改2011.02.26---- ...

  10. 单片机音乐芯片c语言程序,51单片机驱动MT8880双音频接收发送芯片C语言程序分享...

    /*     库端电话程式序  */ /*************************************************************/ #include #include ...

最新文章

  1. 易语言模拟键盘(ctrl+v)_键盘快捷键使用大全
  2. springboot过滤字段_SpringBoot自定义过滤器的两种方式及过滤器执行顺序
  3. python输出去空格_Python3基础 print(,end=) 输出内容的末尾加入空格
  4. 为什么单击用户账户没有反应_为什么您的网站没有流量?是因为用户搜不到你!...
  5. Dev XtraReport 正在打印弹出框如何隐藏 批量打印 静默打印
  6. 服务器centos怎么部署_我什么都不会,怎么拥有自己的个人博客呢
  7. 生活大爆炸版石头剪刀布(洛谷-P1328)
  8. android异步加载视频缩略图,swift-如何将视频URL的缩略图异步加载到tableview列表中...
  9. HDFS进阶应用 配置 NFS 网关
  10. Mac编译OpenJDK8:configure: error: Xcode 4 is required to build JDK 8, the version found was 10.1config
  11. 51单片机串行通信原理
  12. Win7环境下如何开启802.1X 无线网络认证
  13. 关于《数据出境安全评估办法》,来看看3位行业专家的不同视角
  14. 14岁考入清华,22岁博士四年级,杜克大学杨幻睿的AI成长之路
  15. 怎么关闭火狐浏览器的百度辅助模式(无障碍服务)
  16. layui教程(一) form 表单的提交问题
  17. 【 react】react实现页面后退按钮(goBack())
  18. 一千万人都在等小黄车OFO退押金
  19. MATLAB作图时值为0的点不画出来
  20. vue自适应布局(各种浏览器,分辨率)

热门文章

  1. win10怎么修改计算机桌面存储路径,win10桌面保存位置怎么修改_win10修改桌面存储位置教程...
  2. Fullcalendar 在vue中鼠标hover显示悬浮框(tippy.js插件)
  3. 学习RAID磁盘阵列
  4. pr如何跳到关键帧_【技能培训营】Pr基本操作(五)
  5. 用户画像设计与搭建(附金融行业用户画像案例)
  6. Python数据分析案例-消费者用户画像
  7. NBA 2009-10赛季赛程表
  8. python 处理excel公式_python 处理excel踩过的坑——data_only,公式全部丢失
  9. csgo fps不稳定和服务器,CSGO fps不稳定,求FPS 优化设置
  10. html js实现省市区联动调节下拉框菜单