找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4003|回復(fù): 1
收起左側(cè)

用單片機(jī)自帶EEPROM保存字模數(shù)據(jù) 附源程序

[復(fù)制鏈接]
ID:404797 發(fā)表于 2019-4-4 13:47 | 顯示全部樓層 |閱讀模式
    有些單片機(jī),如STC89C52RC等,帶有EEPROM,一般的同學(xué)很少用到這些存儲器,有點(diǎn)浪費(fèi)資源。在我們的程序設(shè)計(jì)中,有時要在沒有字庫的設(shè)備上顯示內(nèi)容,這時不得不在內(nèi)存中開辟空間存儲字模,而且一般的CPU數(shù)據(jù)段很小,只有128個字節(jié),因此稍多的數(shù)據(jù)就要存放在CODE段,使本來就不大的內(nèi)存更顯緊張,這時如果我們把字模存放在EEPROM中,一來可以程序變得易讀,設(shè)計(jì)方便不少,二來可以節(jié)省空間,能編更長的程序,有不少好處。
    本人就編一個程序,把簡單的6X8字符字模放在EEPROM的前二個扇區(qū)內(nèi),使用的時候讀出來用,使用程序精簡不少,供大家參考。
    1、字模存入EEPROM的程序:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit LED8x8_ser=P0^3;
  5. sbit LED8x8_sck=P0^4;
  6. sbit LED8x8_rck=P0^5;
  7. void delay(int ii){int i,j;for(i=0;i<ii;i++);}
  8. #include "EEPROM.h"
  9. ......
  10. //==============================================================
  11. void LED8X8_SendByte(uchar cc)
  12. {uchar c=cc;int i;
  13.   for(i=0;i<8;i++){if(c&0x01)LED8x8_ser=1;else LED8x8_ser=0;c>>=1;LED8x8_sck=0;LED8x8_sck=1;}
  14.     LED8x8_rck=0;LED8x8_rck=1;
  15. }
  16. //==============================================================
  17. void LED8X8_PutChar(char ci)
  18. {int i,j;
  19.   for(i=0;i<100;i++){for(j=0;j<6;j++){LED8X8_SendByte(F6x8[ci-0x20][j]);delay(50);LED8X8_SendByte(0);P0=j;}}
  20. }
  21. //=============================================================
  22. void LED8X8_PutStr(char *str)
  23. {int i=0;
  24. while(str[i]!=0){LED8X8_PutChar(str[i]);i++;}
  25. }
  26. //=============================================================
  27. void Char6X8_Dat_Init()
  28. {char i,j,k;
  29. for(k=0;k<2;k++)
  30.   {cc(0x2000+k*0x200);
  31.    for(i=0;i<85;i++)
  32.       {for(j=0;j<6;j++){xcx(0x2000+k*0x200+i*6+j,F6x8[k*85+i][j]);}
  33.     }
  34.    }
  35. }
  36. //==========================================================
  37. main()
  38. {Char6X8_Dat_Init(); while(1)LED8X8_PutStr("Char6X8_Dat_Init Finish!");
  39. }
復(fù)制代碼


    2、從EEPROM讀取字模顯示的程序
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit LED8x8_ser=P0^3;
  5. sbit LED8x8_sck=P0^4;
  6. sbit LED8x8_rck=P0^5;
  7. void delay(int ii){int i,j;for(i=0;i<ii;i++);}
  8. #include "EEPROM.h"
  9. void LED8X8_SendByte(uchar cc)
  10. {uchar c=cc;int i;
  11.   for(i=0;i<8;i++){if(c&0x01)LED8x8_ser=1;else LED8x8_ser=0;c>>=1;LED8x8_sck=0;LED8x8_sck=1;}
  12.     LED8x8_rck=0;LED8x8_rck=1;
  13. }
  14. //=============================================================
  15. void LED8X8_PutChar_EPROM(int char_in)
  16. {int i=0,j=0;unsigned char buffer[7];
  17.   char_in-=0x20;
  18.   if(char_in<=84)for(i=0;i<6;i++)buffer[i]=dcx(0x2000+char_in*6+i);
  19.   else{for(i=0;i<6;i++)buffer[i]=dcx(0x2200+(char_in-85)*6+i);}
  20.   for(i=0;i<100;i++)
  21.      {for(j=0;j<6;j++)
  22.         {LED8X8_SendByte(buffer[j]);delay(50);
  23.          LED8X8_SendByte(0);P0=j;
  24.          }
  25.      }
  26. }
  27. //=============================================================
  28. void LED8X8_PutStr_EPROM(char *str)
  29. {int i=0;
  30. while(str[i]!=0){LED8X8_PutChar_EPROM(str[i]);i++;}
  31. }
  32. //===================================================================================
  33. main()
  34. {LED8X8_PutStr_EPROM("XYZxyz");
  35. }
復(fù)制代碼

由于帶EEPROM的CPU不好仿真,本文沒法仿真給同學(xué)們觀看效果。

完全程序在附件中:
P9C.zip (38.56 KB, 下載次數(shù): 44)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:796531 發(fā)表于 2020-11-2 10:36 | 顯示全部樓層
正好遇到這個問題,學(xué)習(xí)一下
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表