找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3462|回复: 1
收起左侧

用单片机自带EEPROM保存字模数据 附源程序

[复制链接]
ID:404797 发表于 2019-4-4 13:47 | 显示全部楼层 |阅读模式
    有些单片机,如STC89C52RC等,带有EEPROM,一般的同学很少用到这些存储器,有点浪费资源。在我们的程序设计中,有时要在没有字库的设备上显示内容,这时不得不在内存中开辟空间存储字模,而且一般的CPU数据段很小,只有128个字节,因此稍多的数据就要存放在CODE段,使本来就不大的内存更显紧张,这时如果我们把字模存放在EEPROM中,一来可以程序变得易读,设计方便不少,二来可以节省空间,能编更长的程序,有不少好处。
    本人就编一个程序,把简单的6X8字符字模放在EEPROM的前二个扇区内,使用的时候读出来用,使用程序精简不少,供大家参考。
    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. }
复制代码


    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. }
复制代码

由于带EEPROM的CPU不好仿真,本文没法仿真给同学们观看效果。

完全程序在附件中:
P9C.zip (38.56 KB, 下载次数: 41)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:796531 发表于 2020-11-2 10:36 | 显示全部楼层
正好遇到这个问题,学习一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表