有些单片机,如STC89C52RC等,带有EEPROM,一般的同学很少用到这些存储器,有点浪费资源。在我们的程序设计中,有时要在没有字库的设备上显示内容,这时不得不在内存中开辟空间存储字模,而且一般的CPU数据段很小,只有128个字节,因此稍多的数据就要存放在CODE段,使本来就不大的内存更显紧张,这时如果我们把字模存放在EEPROM中,一来可以程序变得易读,设计方便不少,二来可以节省空间,能编更长的程序,有不少好处。
本人就编一个程序,把简单的6X8字符字模放在EEPROM的前二个扇区内,使用的时候读出来用,使用程序精简不少,供大家参考。
1、字模存入EEPROM的程序:
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit LED8x8_ser=P0^3;
- sbit LED8x8_sck=P0^4;
- sbit LED8x8_rck=P0^5;
- void delay(int ii){int i,j;for(i=0;i<ii;i++);}
- #include "EEPROM.h"
- ......
- //==============================================================
- void LED8X8_SendByte(uchar cc)
- {uchar c=cc;int i;
- for(i=0;i<8;i++){if(c&0x01)LED8x8_ser=1;else LED8x8_ser=0;c>>=1;LED8x8_sck=0;LED8x8_sck=1;}
- LED8x8_rck=0;LED8x8_rck=1;
- }
- //==============================================================
- void LED8X8_PutChar(char ci)
- {int i,j;
- 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;}}
- }
- //=============================================================
- void LED8X8_PutStr(char *str)
- {int i=0;
- while(str[i]!=0){LED8X8_PutChar(str[i]);i++;}
- }
- //=============================================================
- void Char6X8_Dat_Init()
- {char i,j,k;
- for(k=0;k<2;k++)
- {cc(0x2000+k*0x200);
- for(i=0;i<85;i++)
- {for(j=0;j<6;j++){xcx(0x2000+k*0x200+i*6+j,F6x8[k*85+i][j]);}
- }
- }
- }
- //==========================================================
- main()
- {Char6X8_Dat_Init(); while(1)LED8X8_PutStr("Char6X8_Dat_Init Finish!");
- }
复制代码
2、从EEPROM读取字模显示的程序
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit LED8x8_ser=P0^3;
- sbit LED8x8_sck=P0^4;
- sbit LED8x8_rck=P0^5;
- void delay(int ii){int i,j;for(i=0;i<ii;i++);}
- #include "EEPROM.h"
- void LED8X8_SendByte(uchar cc)
- {uchar c=cc;int i;
- for(i=0;i<8;i++){if(c&0x01)LED8x8_ser=1;else LED8x8_ser=0;c>>=1;LED8x8_sck=0;LED8x8_sck=1;}
- LED8x8_rck=0;LED8x8_rck=1;
- }
- //=============================================================
- void LED8X8_PutChar_EPROM(int char_in)
- {int i=0,j=0;unsigned char buffer[7];
- char_in-=0x20;
- if(char_in<=84)for(i=0;i<6;i++)buffer[i]=dcx(0x2000+char_in*6+i);
- else{for(i=0;i<6;i++)buffer[i]=dcx(0x2200+(char_in-85)*6+i);}
- for(i=0;i<100;i++)
- {for(j=0;j<6;j++)
- {LED8X8_SendByte(buffer[j]);delay(50);
- LED8X8_SendByte(0);P0=j;
- }
- }
- }
- //=============================================================
- void LED8X8_PutStr_EPROM(char *str)
- {int i=0;
- while(str[i]!=0){LED8X8_PutChar_EPROM(str[i]);i++;}
- }
- //===================================================================================
- main()
- {LED8X8_PutStr_EPROM("XYZxyz");
- }
复制代码
由于带EEPROM的CPU不好仿真,本文没法仿真给同学们观看效果。
完全程序在附件中:
P9C.zip
(38.56 KB, 下载次数: 44)
|