我测量了下24MHz下I/O的翻转速度能到3MHz,所以直接I/O驱动是足够的。废话不多说直接上代码
- #include <AI8H.H>
- #include <intrins.h>
-
- typedef unsigned char uint8_t;
-
-
- #define ZERO_CODE() P21=1; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();P21=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
- #define ONE_CODE() P21=1; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();P21=0; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
-
- #define LED_NUMBER 2
- #define BRIGHTNESS 2
- #define MAX_BRIGHTNESS 255
-
-
- void Delay55us(void) //@24.000MHz
- {
- unsigned char data i, j;
-
- _nop_();
- i = 2;
- j = 180;
- do
- {
- while (--j);
- } while (--i);
- }
-
- void reset_all()
- {
- uint8_t index;
-
-
- for (index = 0; index < 24 * LED_NUMBER; index++)
- {
- ZERO_CODE();
- }
-
-
- Delay55us();
- }
-
-
-
- void Delay1000ms(void) //@24.000MHz
- {
- unsigned char data i, j, k;
-
- _nop_();
- _nop_();
- i = 122;
- j = 193;
- k = 128;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
-
-
-
-
- void set_led_color(uint8_t led_index, uint8_t green, uint8_t red, uint8_t blue)
- {
- uint8_t i;
- uint8_t mask, number;
-
-
- green = (green * BRIGHTNESS) / MAX_BRIGHTNESS;
- red = (red * BRIGHTNESS) / MAX_BRIGHTNESS;
- blue = (blue * BRIGHTNESS) / MAX_BRIGHTNESS;
-
-
- led_states[led_index][0] = green;
- led_states[led_index][1] = red;
- led_states[led_index][2] = blue;
-
- for (number = 0; number < LED_NUMBER; number++)
- {
-
- for (i = 0; i < 8; i++)
- {
- mask = 0x80 >> i;
- if (led_states[number][0] & mask)
- {
- ONE_CODE();
- }
- else
- {
- ZERO_CODE();
- }
- }
- for (i = 0; i < 8; i++)
- {
- mask = 0x80 >> i;
- if (led_states[number][1] & mask)
- {
- ONE_CODE();
- }
- else
- {
- ZERO_CODE();
- }
- }
- for (i = 0; i < 8; i++)
- {
- mask = 0x80 >> i;
- if (led_states[number][2] & mask)
- {
- ONE_CODE();
- }
- else
- {
- ZERO_CODE();
- }
- }
- }
- Delay55us();
- }
-
- void main()
- {
- P2M0 |= 0x02;
- P2M1 &= ~0x02;
-
- set_led_color(0, 255, 0, 0);
-
- set_led_color(1, 0, 255, 0);
-
- Delay1000ms();
- Delay1000ms();
- Delay1000ms();
- Delay1000ms();
- Delay1000ms();
- reset_all();
-
- while (1)
- {
-
- }
- }
复制代码
|