本帖最后由 zsq198926 于 2020-3-13 16:14 編輯
在網上看到有人用MAX7219顯示屏結合arduino做的顯示時間的屏幕,網上查了一下用51做MAX7219顯示的好像很少,都是用1602顯示的比較多,就自己動手用51單片及做了一個類似的。自己網上查了顯示的驅動程序,參考了郭天祥的書,組合修改了部分代碼,買了塊DS12C887(這塊時鐘模塊比較精準,有掉電走時功能,避免反復設置時間,一年時間誤差1分鐘左右)。主要功能顯示時間(前兩塊顯示小時,三四塊顯示分鐘),顯示星期(前三塊顯示英文縮寫,第四塊顯示數字周幾),顯示月份(第一塊月份,如果超過9,第一塊上顯示兩個數字,第二塊漢子“月”,第三四塊顯示日期)。另外在顯示星期時調整了一下大小寫,用取模軟件美化了一下數字的顯示(網上找的大同小異,8*8的美化效果畢竟有限)
月份顯示
月份顯示
星期顯示
星期顯示
時間顯示
時間顯示
單片機代碼如下:比較雜亂,高手請多多指教
- #include <reg52.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- //sfr WDT_CONTR=0xe1;
- //定義Max7219端口
- sbit Max7219_pinCLK = P3^7;
- sbit Max7219_pinCS = P3^6;
- sbit Max7219_pinDIN = P3^5;
- //DS12C887 端口定義
- sbit cs=P2^4; //片選信號,低電平有效
- sbit as=P2^3; //地址選通輸入端
- sbit rw=P2^2; //讀寫輸入端
- sbit ds=P2^1; //讀輸入腳
- //sbit IRQ=P3^3; //外部中斷
- uchar code disp1[41][8]={
- {0x1C,0x22,0x63,0x63,0x63,0x63,0x22,0x1C},//0
- {0xC,0x1C,0xC,0xC,0xC,0xC,0xC,0x1E},//1
- {0x1C,0x22,0x22,0x4,0x8,0x10,0x3E,0x3E},//2
- {0x1C,0x22,0x2,0x1C,0x2,0x2,0x22,0x1C},//3
- {0x6,0xE,0x16,0x26,0x46,0x7F,0x6,0xF},//4
- {0x3E,0x40,0x40,0x7E,0x2,0x2,0x62,0x3C},//5
- {0xC,0x10,0x20,0x3C,0x42,0x42,0x42,0x3C},//6
- {0x7E,0x7E,0x2,0x4,0x8,0x10,0x30,0x30},//7
- {0x1C,0x22,0x22,0x1C,0x22,0x22,0x22,0x1C},//8
- {0x3C,0x42,0x42,0x42,0x3E,0x6,0xC,0x38},//9
- {0x0,0x0,0x38,0x44,0x44,0x44,0x44,0x3A},//a 11
- {0x3C,0x22,0x22,0x3E,0x22,0x22,0x3C,0x0},//B
- {0x3C,0x40,0x40,0x40,0x40,0x40,0x3C,0x0},//C
- {0x0,0x8,0x8,0x38,0x48,0x48,0x78,0x38},//D
- {0x0,0x0,0x0,0x38,0x44,0x7C,0x40,0x38},//E 15
- {0x7C,0x40,0x40,0x7C,0x40,0x40,0x40,0x40},//F 16
- {0x3C,0x40,0x40,0x40,0x40,0x44,0x44,0x3C},//G
- {0x0,0x20,0x20,0x38,0x24,0x24,0x24,0x24},//H 18
- {0x0,0x10,0x0,0x10,0x10,0x10,0x10,0x10},//I 19
- {0x3C,0x8,0x8,0x8,0x8,0x8,0x48,0x30},//J 20
- {0x0,0x24,0x28,0x30,0x20,0x30,0x28,0x24},//K
- {0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7C},//L
- {0x0,0x6C,0x6C,0x6C,0x7C,0x74,0x54,0x54},//M 24
- {0x0,0x0,0x40,0x7C,0x44,0x44,0x44,0x44},//N 25
- {0x0,0x0,0x0,0x38,0x44,0x44,0x44,0x38},//O 26
- {0x3C,0x22,0x22,0x22,0x3C,0x20,0x20,0x20},//P
- {0x1C,0x22,0x22,0x22,0x22,0x26,0x22,0x1D},//Q
- {0x0,0x0,0x14,0x18,0x10,0x10,0x10,0x10},//R 28
- {0x0,0x1E,0x20,0x20,0x3E,0x2,0x2,0x3C},//S 29
- {0x0,0x3E,0x8,0x8,0x8,0x8,0x8,0x8},//T 31
- {0x0,0x0,0x44,0x44,0x44,0x44,0x44,0x3A},//U 32
- {0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18},//V
- {0x0,0x82,0x82,0x82,0x92,0xAA,0xC6,0x82},//W 34
- {0x0,0x41,0x22,0x14,0x8,0x14,0x22,0x41},//X
- {0x41,0x22,0x14,0x8,0x8,0x8,0x8,0x8},//Y
- {0x0,0x7F,0x2,0x4,0x8,0x10,0x20,0x7F},//Z
- {0x1E,0x22,0x3E,0x22,0x3E,0x22,0x22,0x42},//月
- {0x5F,0xD1,0x51,0x51,0x51,0x51,0x51,0x5F},//10
- {0x22,0x66,0x22,0x22,0x22,0x22,0x22,0x22},//11
- {0x5F,0xC1,0x41,0x5F,0x50,0x50,0x50,0x5F},//12
- };
- /*n毫秒的延時程序*/
- void Delay_xms(uint x)
- {
- uint a,b;
- for(a=0;a<x;a++)
- for(b=0;b<112;b++);
- }
- void write_ds(uchar add,uchar date)
- {
- cs=0;
- as=1;
- ds=1;
- rw=1;
- P0=add;
- as=0;
- rw=0;
- P0=date;
- rw=1;
- as=1;
- cs=1;
- }
- // ---------------讀887函數-------
- uchar read_ds(uchar rs_add)
- {
- uchar ds_date;
- as=1;
- ds=1;
- rw=1;
- cs=0;
- P0=rs_add; //寫地址
- as=0;
- ds=0;
- P0=0xff;
- ds_date=P0; //讀數據
- ds=1;
- as=1;
- cs=1;
- return ds_date;
- }
- //-------首次上電對時 --------
- /*
- void set_time()
- {
- write_ds(0,30); //秒
- write_ds(1,0); //鬧鐘秒
- write_ds(2,5); //分鐘
- write_ds(3,0); //鬧鐘分鐘
- write_ds(4,21); //小時
- write_ds(5,0); // 鬧鐘小時
- write_ds(6,5); // 星期幾
- write_ds(7,6); // 日期
- write_ds(8,3); // 月份
- write_ds(9,20); // 年
- } */
- void INit_887()
- {
- //------------------887首次使用,----初始化-------------
- write_ds(0x0A,0x20); // 打開振蕩器
- write_ds(0x0B,0x06); // 24小時模式,二級制格式,鬧鈴中斷開
- }
- //--------------------------------------------
- //向MAX7219(U3)寫入字節
- void Write_Max7219_byte(uchar DATA)
- {
- uchar i;
- Max7219_pinCS=0; //CS=0有效,CS=1鎖存
- for(i=8;i>=1;i--)
- {
- Max7219_pinCLK=0;
- Max7219_pinDIN=DATA&0x80; //&10000000, 編譯器對位操作的理解:非0即為1
- DATA=DATA<<1;
- Max7219_pinCLK=1; //上升沿把數據送出去
- }
- }
- //-------------------------------------------
- /*向M第一片MAX7219寫入數據*/
- void Write_Max7219_1(uchar add1,uchar dat1)
- {
- Max7219_pinCS=0;
- Write_Max7219_byte(add1); //寫入地址,即數碼管編號
- Write_Max7219_byte(dat1); //寫入數據,即數碼管顯示數字
- Max7219_pinCS=1;
- }
- /*第二片MAX7219的寫入數據*/
- void Write_Max7219_2(uchar add2,uchar dat2)
- {
- Max7219_pinCS=0;
- //Max7219_pinCLK=1;
- Write_Max7219_byte(add2);
- Write_Max7219_byte(dat2);
- Max7219_pinCLK=1;
- Write_Max7219_byte(0x00); //片1寫入空
- Write_Max7219_byte(0x00);
- Max7219_pinCS=1;
- }
- /*第三片MAX7219的寫入數據*/
- void Write_Max7219_3(uchar add3,uchar dat3)
- {
- Max7219_pinCS=0;
- //Max7219_pinCLK=1;
- Write_Max7219_byte(add3);
- Write_Max7219_byte(dat3);
- Max7219_pinCLK=1;
- Write_Max7219_byte(0x00); //片1寫入空
- Write_Max7219_byte(0x00);
- Write_Max7219_byte(0x00); //片2寫入空
- Write_Max7219_byte(0x00);
- Max7219_pinCS=1;
- }
- /*第四片MAX7219的寫入數據*/
- void Write_Max7219_4(uchar add4,uchar dat4)
- {
- Max7219_pinCS=0;
- //Max7219_pinCLK=1;
- Write_Max7219_byte(add4);
- Write_Max7219_byte(dat4);
- Max7219_pinCLK=1;
- Write_Max7219_byte(0x00); //片1寫入空
- Write_Max7219_byte(0x00);
- Write_Max7219_byte(0x00); //片2寫入空
- Write_Max7219_byte(0x00);
- Write_Max7219_byte(0x00); //片3空
- Write_Max7219_byte(0x00);
- Max7219_pinCS=1;
- }
- /*初始化芯片*/
- void Init_MAX7219()
- {
- Write_Max7219_1(0x09, 0x00); //譯碼方式:BCD碼
- Write_Max7219_1(0x0a, 0x00); //亮度
- Write_Max7219_1(0x0b, 0x07); //掃描界限;8個數碼管顯示
- Write_Max7219_1(0x0c, 0x01); //掉電模式:0,普通模式:1
- Write_Max7219_1(0x0f, 0x00); //顯示測試:1;測試結束,正常顯示:0
- Write_Max7219_2(0x09, 0x00); //譯碼方式:BCD碼
- Write_Max7219_2(0x0a, 0x00); //亮度
- Write_Max7219_2(0x0b, 0x07); //掃描界限;8個數碼管顯示
- Write_Max7219_2(0x0c, 0x01); //掉電模式:0,普通模式:1
- Write_Max7219_2(0x0f, 0x00); //顯示測試:1;測試結束,正常顯示:0
- Write_Max7219_3(0x09, 0x00); //譯碼方式:BCD碼
- Write_Max7219_3(0x0a, 0x00); //亮度
- Write_Max7219_3(0x0b, 0x07); //掃描界限;8個數碼管顯示
- Write_Max7219_3(0x0c, 0x01); //掉電模式:0,普通模式:1
- Write_Max7219_3(0x0f, 0x00); //顯示測試:1;測試結束,正常顯示:0
- Write_Max7219_4(0x09, 0x00); //譯碼方式:BCD碼
- Write_Max7219_4(0x0a, 0x00); //亮度
- Write_Max7219_4(0x0b, 0x07); //掃描界限;8個數碼管顯示
- Write_Max7219_4(0x0c, 0x01); //掉電模式:0,普通模式:1
- Write_Max7219_4(0x0f, 0x00);
- }
- void weekshow(void)
- {
- uchar i,week;
-
- week=read_ds(6);
- switch(week)
- {
- case 1:
- for(i=1;i<9;i++)
- {
- Write_Max7219_1(i,disp1[week][i-1]);
- Write_Max7219_2(i,disp1[24][i-1]);
- Write_Max7219_3(i,disp1[25][i-1]);
- Write_Max7219_4(i,disp1[23][i-1]);
- }
- break;
- case 2:
- for(i=1;i<9;i++)
- {
- Write_Max7219_1(i,disp1[week][i-1]);
- Write_Max7219_2(i,disp1[13][i-1]);
- Write_Max7219_3(i,disp1[30][i-1]);
- Write_Max7219_4(i,disp1[29][i-1]);
- }
- break;
- case 3:
- for(i=1;i<9;i++)
- {
- Write_Max7219_1(i,disp1[week][i-1]);
- Write_Max7219_2(i,disp1[13][i-1]);
- Write_Max7219_3(i,disp1[14][i-1]);
- Write_Max7219_4(i,disp1[32][i-1]);
- }
- break;
- case 4:
- for(i=1;i<9;i++)
- {
- Write_Max7219_1(i,disp1[week][i-1]);
- Write_Max7219_2(i,disp1[31][i-1]);
- Write_Max7219_3(i,disp1[17][i-1]);
- Write_Max7219_4(i,disp1[29][i-1]);
- }
- break;
- case 5:
- for(i=1;i<9;i++)
- {
- Write_Max7219_1(i,disp1[week][i-1]);
- Write_Max7219_2(i,disp1[18][i-1]);
- Write_Max7219_3(i,disp1[27][i-1]);
- Write_Max7219_4(i,disp1[15][i-1]);
- }
- break;
- case 6:
- for(i=1;i<9;i++)
- {
- Write_Max7219_1(i,disp1[week][i-1]);
- Write_Max7219_2(i,disp1[29][i-1]);
- Write_Max7219_3(i,disp1[10][i-1]);
- Write_Max7219_4(i,disp1[28][i-1]);
- }
- break;
- case 7:
- for(i=1;i<9;i++)
- {
- Write_Max7219_1(i,disp1[week][i-1]);
- Write_Max7219_2(i,disp1[24][i-1]);
- Write_Max7219_3(i,disp1[30][i-1]);
- Write_Max7219_4(i,disp1[28][i-1]);
- }
- break;
- }
- }
- void timeshow (void)
- {
- uchar i,shi,shiwei,shige,fen,fenshi,fenge ;
-
- shi=read_ds(4);
- fen=read_ds(2);
- Delay_xms(5);
- shiwei=shi/10;
- shige=shi%10;
- fenshi=fen/10;
- fenge=fen%10;
- for(i=1;i<9;i++)
- {
- Write_Max7219_1(i,disp1[fenge][i-1]);
- Write_Max7219_2(i,disp1[fenshi][i-1]);
- Write_Max7219_3(i,disp1[shige][i-1]);
- Write_Max7219_4(i,disp1[shiwei][i-1]);
- }
- }
- void dayshow()
- {
- uchar i,yue,day,dayshi,dayge;
- yue=read_ds(8);
- day=read_ds(7);
- Delay_xms(5);
- dayshi=day/10;
- dayge=day%10;
- if(yue<10)
- {
- for(i=1;i<9;i++)
- {
- Write_Max7219_1(i,disp1[dayge][i-1]);
- Write_Max7219_2(i,disp1[dayshi][i-1]);
- Write_Max7219_3(i,disp1[36][i-1]);
- Write_Max7219_4(i,disp1[yue][i-1]);
- }
- }
- switch (yue)
- {
- case 10:
- for(i=1;i<9;i++)
- {
- Write_Max7219_1(i,disp1[dayge][i-1]);
- Write_Max7219_2(i,disp1[dayshi][i-1]);
- Write_Max7219_3(i,disp1[36][i-1]);
- Write_Max7219_4(i,disp1[38][i-1]);
- }
- break;
- case 11:
- for(i=1;i<9;i++)
- {
- Write_Max7219_1(i,disp1[dayge][i-1]);
- Write_Max7219_2(i,disp1[dayshi][i-1]);
- Write_Max7219_3(i,disp1[36][i-1]);
- Write_Max7219_4(i,disp1[39][i-1]);
- }
- break;
- case 12:
- for(i=1;i<9;i++)
- {
- Write_Max7219_1(i,disp1[dayge][i-1]);
- Write_Max7219_2(i,disp1[dayshi][i-1]);
- Write_Max7219_3(i,disp1[36][i-1]);
- Write_Max7219_4(i,disp1[40][i-1]);
- }
- break;
- }
- }
- /**********************主程序**************************/
- void main()
- {
- // uchar i;//j;
- Init_MAX7219();
- INit_887();
- Delay_xms(5);
- // set_time(); 44
- while(1)
- {
- // WDT_CONTR=0x35;
- weekshow();
- // WDT_CONTR=0x35;
- Delay_xms(5000);
- timeshow();
- Delay_xms(5000);
- // dayshow();
- // Delay_xms(5000);
- }
- }
復制代碼
|