51单片机 漩涡流水点阵
2014-11-18 20:17
169 查看
#include <reg52.h> typedef unsigned char uchar; typedef unsigned int uint; typedef unsigned long ulong; sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4; uchar image[8] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; uchar T0RH, T0RL; uint rate; void LEDScan(); void resetImage(); void configTmr0(uint ms1, uchar ms2); void main() { EA = 1; ADDR3 = 0; ENLED = 0; configTmr0(50, 2); while (1) ; } void configTmr0(uint ms1, uchar ms2) { ulong tmp; rate = ms1 / ms2; tmp = 11059200 / 12; //定时器计数频率 tmp = (tmp * ms2) / 1000; //计算所需的计数值 tmp = 65536 - tmp; //计算定时器重载值 tmp = tmp + 12; //补偿中断响应延时造成的误差 T0RH = tmp >> 8; //定时器重载值拆分为高低字节 T0RL = tmp; TMOD &= 0xF0; TMOD |= 0x01; TH0 = T0RH; TL0 = T0RL; ET0 = 1; TR0 = 1; } #define LEDScan(); { \ static uchar i = 0; \ P0 = 0xFF; \ P1 = (P1 & 0xF8) | i; \ P0 = image[i]; \ i = ++i & 0x07; \ } void resetImage() { static uchar x = 0, y = 0; image[y] ^= (0x80 >> x); if (x == 3 && y == 4) { x = 0; y = 0; } else if (y <= x + 1 && x + y < 7) { x++; } else if (x + y >= 7 && y < x) { y++; } else if (y >= x && x + y > 7) { x--; } else y--; } void interruptTmr0() interrupt 1 { static uint i = 0; TH0 = T0RH; TL0 = T0RL; LEDScan(); if (i == rate) { resetImage(); i = 0; } else i++; }
双向流水:
#include <reg52.h> typedef unsigned char uchar; typedef unsigned int uint; typedef unsigned long ulong; sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4; uchar image[8] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; uchar T0RH, T0RL; uint rate; void LEDScan(); void resetImage(); void configTmr0(uint ms1, uchar ms2); void main() { EA = 1; ADDR3 = 0; ENLED = 0; configTmr0(50, 2); while (1) ; } void configTmr0(uint ms1, uchar ms2) { ulong tmp; rate = ms1 / ms2; tmp = 11059200 / 12; //定时器计数频率 tmp = (tmp * ms2) / 1000; //计算所需的计数值 tmp = 65536 - tmp; //计算定时器重载值 tmp = tmp + 12; //补偿中断响应延时造成的误差 T0RH = tmp >> 8; //定时器重载值拆分为高低字节 T0RL = tmp; TMOD &= 0xF0; TMOD |= 0x01; TH0 = T0RH; TL0 = T0RL; ET0 = 1; TR0 = 1; } #define LEDScan(); { \ static uchar i = 0; \ P0 = 0xFF; \ P1 = (P1 & 0xF8) | i; \ P0 = image[i]; \ i = ++i & 0x07; \ } void resetImage() { static uchar x = 0, y = 0; image[y] ^= (0x80 >> x); image[7-y] ^= (0x01 << x); if (x == 3 && y == 4) { x = 0; y = 0; } else if (y <= x+1 && x + y < 7) x++; else if (x + y >= 7 && y < x-1) y++; else if (y >= x-1 && x + y > 7) x--; else y--; } void interruptTmr0() interrupt 1 { static uint i = 0; TH0 = T0RH; TL0 = T0RL; LEDScan(); if (i == rate) { resetImage(); i = 0; } else i++; }
相关文章推荐
- 51单片机 漩涡流水点阵
- 51单片机 8*8LED点阵横向流水 使用位运算生成中间帧
- 51单片机LED点阵显示(16*16)源代码
- 51单片机学习(四)用点阵LED显示I LOVE YOU!
- 基于51单片机的花样流水灯仿真(代码)
- 51单片机编程:做一个简易的流水灯
- 51单片机 LED点阵的呼吸灯效果
- [51单片机] EEPROM 24c02 [I2C代码封装-保存实现流水灯]
- 51单片机的流水灯--逻辑实现
- 菜鸟之学习51单片机(四)流水灯的实现
- 嵌入式 51单片机 流水灯原理详解
- 51单片机的流水灯--循环指令实现
- 51单片机 流水灯 蜂鸣器应用
- [精品书单]零基础开始学51单片机点流水灯
- 51单片机 8*8LED点阵横向流水 使用位运算生成中间帧
- 基于proteus的51单片机仿真实例十一、51单片机的P0口控制实例--流水灯
- 51单片机:每次按S1键,流水灯移位演示
- 51单片机流水灯程序
- 51单片机流水灯入门(理解IO口的组操作)
- 51单片机学习之流水灯的设计