51单片机 漩涡流水点阵
2014-12-03 23:09
281 查看
#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++; }
相关文章推荐
- 51单片机 漩涡流水点阵
- 51单片机 8*8LED点阵横向流水 使用位运算生成中间帧
- 51单片机 8*8LED点阵横向流水 使用位运算生成中间帧
- 51单片机流水灯程序
- 51单片机流水灯入门(理解IO口的组操作)
- 51单片机学习之流水灯的设计
- led流水灯——51单片机程序
- 51单片机(使用8x8点阵)
- 51单片机 LED点阵的呼吸灯效果
- 51单片机学习总结系列(一)之驱动流水灯(1)
- [51单片机学习笔记FOUR]----16*16LED点阵
- C语言编写51单片机程序:键控流水灯
- 51单片机STC89C52 流水灯
- 51单片机LED点阵显示文字
- 51单片机_LED流水灯_0x03
- 51单片机用定时器0实现流水灯
- 51单片机LED点阵显示文字
- 第七个试验:流水灯数字显示综合练习----51单片机汇编语言试验教程
- 手把手讲解51单片机最小系统焊接、流水灯(跑马灯)编写以及烧录
- 51单片机汇编编程--16位流水灯收缩点亮