買了幾塊MAX7219點陣模塊,弄了個點陣級聯,時間上翻顯示,有秒點上下閃動,里面有兩段,一段是點陣屏水平放置時數字上翻,另一段是點陣屏垂直放置時數字上翻,程序純屬業余愛好,高手勿噴,下面直接代碼,3個IO口不能有其他器件,下面是壓縮過的圖像,有點變化,其實是沒有拖影的,
max7219.jpg (17.56 KB, 下載次數: 77)
下載附件
2020-9-17 07:27 上傳
51hei.png (131.32 KB, 下載次數: 75)
下載附件
2020-9-17 18:17 上傳
單片機源程序如下:
- #include <reg52.h>
- #include <intrins.h>
- #include <max7219.h>
- #include <zimo.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar timecount,point,sec;
- void timedeal();
- void Delay_xms(uint x)
- {
- uint i,j;
- for(i=0;i<x;i++)
- for(j=0;j<112;j++);
- }
- void main(void)
- {
- uchar i,j,a,b,c,d;
- IE=0x82; //允許定時器0工作
- TR0=1; //定時器0可以工作
- TMOD=0x01; //timer0為模式1
-
- TH0 = 0x4c;
- TL0 = 0x00;
- Delay_xms(50);
-
- InitMAX7219();
-
- while (1)
- {
- a=sec%10;
- c=sec/10;
- /*******************************以下屏幕旋轉90度**************/
- if(b==a)
- {
- for(i=0;i<8;i++)
- {
- for(j=0;j<8;j++)
- {
- Write_1(8-j,logo_1[a][j]);
- Write_2(8-j,logo_2[c][j]|logo_1[11][j]);
- }
- }
- }
- else
- {
- for(i=0;i<8;i++)
- {
- for(j=0;j<8;j++)
- {
- Write_1(8-j,(logo_1[b][j]<<i|logo_1[b+1][j]>>8-i));
- if(d==c) Write_2(8-j,logo_2[d][j]|logo_1[12][j]);
- else Write_2(8-j,(logo_2[d][j]<<i|logo_2[d+1][j]>>8-i)|logo_1[12][j]);
- }
- Delay_xms(50);
- }
- }
- b=a;
- d=c;
-
- /*******************************以下屏幕旋轉90度**************
- if(b==a)
- {
- for(j=1;j<9;j++)
- {
- Write_1(j,logo_3[b][j-1]); //1
- Write_2(j,logo_4[d][j-1]|logo_3[11][j-1]); //2
-
- }
- }
- else
- for(i=0;i<8;i++)
- {
- for(j=1;j<9;j++)
- {
- Write_1(j,logo_3[b][(j-1+i)]); //1
- if(d==c)Write_2(j,logo_4[d][(j-1)]|logo_3[12][j-1]); //2
- else Write_2(j,logo_4[d][(j-1+i)]|logo_3[12][j-1]);//2
- }
- Delay_xms(50);
- }
- b=a;
- d=c;
- /**************************************************************************/
- }
- }
- /****************************************************/
- void time50ms(void) interrupt 1 //計時模式
- {
- TH0 = 0x4c;
- TL0 = 0x00;
- timecount++;
- if(timecount==10)
- {
- timecount=0;
- point=!point;
- if(point)
- {
- sec++;
- if(sec>=60)
- sec=0;
- }
- }
- }
- /*************************************************/
- #ifndef _MAX7219_H_
- #define _MAX7219_H_
- #include <REGX51.H>
- /*********************** 定義MAX7219 內部寄存器 **********************/
- #define REG_DECODE 0x09 // 譯碼方式寄存器
- #define REG_INTENSITY 0x0a // 亮度寄存器
- #define REG_SCAN_LIMIT 0x0b // 掃描界限寄存器
- #define REG_SHUTDOWN 0x0c // 停機寄存器
- #define REG_DISPLAY_TEST 0x0f // 顯示測試寄存器
- #define INTENSITY_MIN 0x00 // 最小顯示亮度
- #define INTENSITY_MAX 0x0f // 最大顯示亮度
- /*********************** 定義MAX7219 端口信號 ************************/
- sbit DATA=P3^5;
- sbit LOAD=P3^4;
- sbit CLK=P3^3;
- #define DATA_high DATA=1
- #define DATA_low DATA=0
- #define LOAD_high LOAD=1
- #define LOAD_low LOAD=0
- #define CLK_high CLK=1
- #define CLK_low CLK=0
- /************************** 函數原型說明 *****************************/
- void Write_1 (unsigned char, unsigned char);
- void Write_2 (unsigned char, unsigned char);
- void SendByte (unsigned char);
- void Clear (void);
- /************************************************************************
- * 函數原型:void Init()
- * 功 能: 對MAX7219進行初始化,調用任何其他函數之前必需先調用此函數
- *************************************************************************/
- void InitMAX7219(void)
- {
- DATA_high;
- LOAD_high;
- CLK_high;
- Write_1(REG_SCAN_LIMIT, 7); // 掃描8位數字
- Write_1(REG_DECODE, 0); // 設置不譯碼方式
- Write_1(REG_SHUTDOWN,1); // 結束停機方式,正常工作
- Write_1(REG_DISPLAY_TEST, 0); // 結束顯示測試,正常工作
- Write_1(REG_INTENSITY, 0); // 設置亮度
-
- Write_2(REG_SCAN_LIMIT, 7); // 掃描8位數字
- Write_2(REG_DECODE, 0); // 設置不譯碼方式
- Write_2(REG_SHUTDOWN,1); // 結束停機方式,正常工作
- Write_2(REG_DISPLAY_TEST, 0); // 結束顯示測試,正常工作
- Write_2(REG_INTENSITY, 0); // 設置亮度
-
- Clear(); // 清零全部顯示器
- }
- /*************************************************************************
- * 函數原型:void Clear()
- * 功 能:關閉全部顯示器
- **************************************************************************/
- void Clear (void)
- {
- unsigned char i;
- for (i=1;i<=8;i++)
- Write_1(i, 0); // 關閉全部顯示器
- Write_2(i, 0);
- }
- /*************************************************************************
- * 函數原型:static void Write (unsigned char reg_add, unsigned char dat)
- * 功 能:向指定的MAX7219內部寄存器寫入數據
- * 參 數: reg_add = MAX7219內部寄存器地址
- dat = 待寫入的數據
- **************************************************************************/
- void Write_1 (unsigned char reg_add, unsigned char dat)
- {
- LOAD_low; // 使LOAD變低,啟動串行數據發送
- SendByte(reg_add); // 發送MAX7219內部寄存器地址
- if(reg_add>8) SendByte(dat); // 發送待寫入的數據
- else SendByte((dat<<7)|(dat>>1)); //如發送的是顯示數據,則根據硬件轉換一下數據位
- LOAD_high; // 使LOAD變高,串行數據結束
- }
- /*************************************************************************
- * 函數原型:static void Write (unsigned char reg_add, unsigned char dat)
- * 功 能:向指定的MAX7219內部寄存器寫入數據
- * 參 數: reg_add = MAX7219內部寄存器地址
- dat = 待寫入的數據
- **************************************************************************/
- void Write_2 (unsigned char reg_add, unsigned char dat)
- {
- LOAD_low; // 使LOAD變低,啟動串行數據發送
- SendByte(reg_add); // 發送MAX7219內部寄存器地址//寫入地址,即數碼管編號
- if(reg_add>8) SendByte(dat); // 發送待寫入的數據 //寫入數據,即數碼管顯示數字
- else SendByte((dat<<7)|(dat>>1)); //如發送的是顯示數據,則根據硬件轉換一下數據位
- CLK_high;
- SendByte(0x00); // 第一片空
- SendByte(0x00); // 第一片空
- LOAD_high; // 使LOAD變高,串行數據結束
- }
- /*************************************************************************
- * 函數原型:static void SendByte (unsigned char dat)
- * 功 能:向MAX7219發送一個字節串行數據
- * 參 數:dat = 待發送的數據
- **************************************************************************/
- void SendByte (unsigned char dat)
- {
- unsigned char i;
- for (i=0; i<8; i++)
- {
- CLK_low; // 使CLK變低
- if(dat&0x80) // 發送一位數據"1"或"0"
- DATA_high;
- else
- DATA_low;
- dat<<=1;
- CLK_high; // 使CLK變高
- }
- }
- #endif
- /************************************************************************/
- unsigned char code logo_1[][8]=
- {
- 0x00,0x00,0x3E,0x41,0x41,0x41,0x41,0x3E,//0
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,//1
- 0x00,0x00,0x46,0x49,0x49,0x49,0x49,0x31,//2
- 0x00,0x00,0x41,0x49,0x49,0x49,0x49,0x36,//3
- 0x00,0x00,0x70,0x08,0x08,0x08,0x08,0x7F,//4
- 0x00,0x00,0x31,0x49,0x49,0x49,0x49,0x46,//5
- 0x00,0x00,0x3E,0x49,0x49,0x49,0x49,0x46,//6
- 0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x3F,//7
- 0x00,0x00,0x36,0x49,0x49,0x49,0x49,0x36,//8
- 0x00,0x00,0x31,0x49,0x49,0x49,0x49,0x3E,//9
- 0x00,0x00,0x3E,0x41,0x41,0x41,0x41,0x3E,//0
- 0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- };
- unsigned char code logo_2[][8]=
- {
- 0x00,0x00,0x3E,0x41,0x41,0x41,0x41,0x3E,//0
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,//1
- 0x00,0x00,0x46,0x49,0x49,0x49,0x49,0x31,//2
- 0x00,0x00,0x41,0x49,0x49,0x49,0x49,0x36,//3
- 0x00,0x00,0x70,0x08,0x08,0x08,0x08,0x7F,//4
- 0x00,0x00,0x31,0x49,0x49,0x49,0x49,0x46,//5
- 0x00,0x00,0x3E,0x41,0x41,0x41,0x41,0x3E,//0
- };
- unsigned char code logo_3[][8]=
- {
- 0x00,0x1E,0x21,0x21,0x21,0x21,0x21,0x1E,//0
- 0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,//1
- 0x00,0x3E,0x01,0x01,0x1E,0x20,0x20,0x1F,//2
- 0x00,0x3E,0x01,0x01,0x1E,0x01,0x01,0x3E,//3
- 0x00,0x21,0x21,0x21,0x1F,0x01,0x01,0x01,//4
- 0x00,0x1F,0x20,0x20,0x1E,0x01,0x01,0x3E,//5
- 0x00,0x1F,0x20,0x20,0x3E,0x21,0x21,0x1E,//6
- 0x00,0x3E,0x01,0x01,0x01,0x01,0x01,0x01,//7
- 0x00,0x1E,0x21,0x21,0x1E,0x21,0x21,0x1E,//8
- 0x00,0x1E,0x21,0x21,0x1F,0x01,0x01,0x3E,//9
- 0x00,0x1E,0x21,0x21,0x21,0x21,0x21,0x1E,//0
- 0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,
- 0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x80,
- };
- unsigned char code logo_4[][8]=
- {
- 0x00,0x1E,0x21,0x21,0x21,0x21,0x21,0x1E,//0
- 0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,//1
- 0x00,0x3E,0x01,0x01,0x1E,0x20,0x20,0x1F,//2
- 0x00,0x3E,0x01,0x01,0x1E,0x01,0x01,0x3E,//3
- 0x00,0x21,0x21,0x21,0x1F,0x01,0x01,0x01,//4
- 0x00,0x1F,0x20,0x20,0x1E,0x01,0x01,0x3E,//5
- 0x00,0x1E,0x21,0x21,0x21,0x21,0x21,0x1E,//0
- };
復制代碼
圖片:鏈接:https://pan.baidu.com/s/1ae95GQXkaVLrqg8nV1oE8w
提取碼:5q6j |