本次实验是规划一块8 byte的内存做为8x8点阵的显示对映内存,然后编写一个点亮单颗LED的函数,函数功能是点亮8x8点阵共64颗LED中的其中一颗。而主回路中调用乱数 rand() 函数,产生0至63的乱数位置,一次产生5颗并显示出来,经过延时后再产生5颗新的位置,如此形成LED乱数闪烁的效果。
点亮单颗LED的函数:
- void PlotDot(char pos)
- {
- char x,y;
- if(pos < 64) {
- x = pos/8;
- y = pos%8;
- dotbuf[x] |= 1<<y;
- // DsDotBuf();
- }
- }
程序里面还有另一个关闭单颗LED的函数:(本次实验演示未使用)
- void EraseDot(char pos)
- {
- char x,y;
- if(pos < 64) {
- x = pos/8;
- y = pos%8;
- dotbuf[x] &= ~1<<y;
- // DsDotBuf();
- }
- }
完整程序码如下:
- #include "mbed.h"
- SPI spimax(SPI_MOSI, SPI_MISO, SPI_SCK);
- DigitalOut CS(PB_6);
- char dotbuf[8]; // DOT display buffer
- void max7219(char reg,char dta)
- {
- CS = 0;
- spimax.write(reg);
- spimax.write(dta);
- CS = 1;
- }
- void init_max7219(void)
- {
- max7219(0x09,0);
- max7219(0x0a,8);
- max7219(0x0b,7);
- max7219(0x0c,1);
- max7219(0x0f,0);
- for(char i=0; i<8; i++) {
- max7219(i+1,0);
- }
- }
- void DsDotBuf(void)
- {
- for(char i=0; i<8; i++) {
- max7219(i+1,dotbuf[i]);
- }
- }
- void PlotDot(char pos)
- {
- char x,y;
- if(pos < 64) {
- x = pos/8;
- y = pos%8;
- dotbuf[x] |= 1<<y;
- // DsDotBuf();
- }
- }
- void EraseDot(char pos)
- {
- char x,y;
- if(pos < 64) {
- x = pos/8;
- y = pos%8;
- dotbuf[x] &= ~1<<y;
- // DsDotBuf();
- }
- }
- int main()
- {
- char i;
- init_max7219();
- while(1) {
- for(i=0; i<8; i++) {
- dotbuf[i] = 0x00;
- }
- for(i=0; i<5; i++) {
- PlotDot(rand()%64);
- }
- DsDotBuf();
- wait_ms(50);
- }
- }
视频如下:
http://v.youku.com/v_show/id_XNzk5MjQ3NzYw.html
【Nucleo心得】+ 8x8点阵驱动 (EX01)
https://bbs.eeworld.com.cn/thread-448651-1-1.html
【Nucleo心得】+ 8x8点阵驱动 (EX02)
https://bbs.eeworld.com.cn/thread-448710-1-1.html