制作出来的实物图如下:
四线八线都可以用,送给需要的
单片机源程序如下:
- #include "stc12c5410ad.h"
- #include "intrins.h"
- #define uchar unsigned char
- #define uint unsigned int
- uchar dis1[]={" welcome "};
- uchar dis2[]={" 4line Mode "};
- /***********************************************************/
- /***********************************************************/
- /***********************************************************/ //
- #define LcdMode4 1 // 选择4线 为1 则为0
- #define LcdMode8 0 // 选择8线 为1 则为0
- #define LineMode4 0x28 // zz1d nfxx d=1是8线 d=0是4线 n=0是1行 n=1是2行 f=0是5x7 f=1是5x10
- #define LineMode8 0x38 // zz1d nfxx d=1是8线 d=0是4线 n=0是1行 n=1是2行 f=0是5x7 f=1是5x10
- #define Display_ON 0x0c // zzzz 1dcb d=1开显示 c=1有光标 b=1光标不闪 显示开,有光标 不闪
- #define Display_OFF 0x08 // zzzz 1dcb d=1开显示 c=1有光标 b=1光标不闪 显示开,有光标 不闪
- #define EntryMode 0x06 // 显示光标移动设置
- #define LcdClear 0x01 //清屏
- /***********************************************************/
- /*************** LCD1602脚位定义 **************************/
- /***********************************************************/
- #if LcdMode4>0 //4线改这里
- sbit LcdEn = P2^2;
- sbit LcdRs = P2^3;
- sbit LcdRw = P2^5;
- #define lcdDat P3 //xx0000xx
- #endif
- #if LcdMode8>0
- //8线改这里
- sbit LcdEn = P2^7;
- sbit LcdRs = P2^6;
- sbit LcdRw = P2^5;
- #define lcdDat P0
- #endif
- /***********************************************************/
- /***********************************************************/
- /***********************************************************/
- void Lcddelay(uint us){
- uint i;
- for(i=0;i<us;i++){
- _nop_();
- _nop_();
- }
- }
- /***********************************************************/
- /***********************************************************/
- /***********************************************************/
- bit Check_Busy()
- {
- bit result;
- LcdRs = 0;
- LcdRw = 1;
- LcdEn = 1;
- #if LcdMode4>0
- result = (bit)((lcdDat>>2) & 0x80); //检测P0最高位是否为1
- #endif
- #if LcdMode8>0
- result = (bit)(lcdDat & 0x80); //检测P0最高位是否为1
- #endif
- LcdEn = 0;
- return result;//返回侧忙结果
- }
- void LcdWriteBety(uchar dat1,uchar btey){//btey=1 写数据 btey=0 写指令
- // while(Check_Busy()); //LcdRw 不用要屏蔽掉查忙
- if(btey==0){
- LcdRs = 0; }
- else{
- LcdRs = 1; }
- LcdRw = 0;
- #if LcdMode4>0
- LcdEn = 0;
- lcdDat= (dat1>>2)&0x3c; // 1111 1111 先高
- LcdEn = 1;
- // Lcddelay(13); //不用时钟分频延时要用 c51不用
- _nop_();
- LcdEn = 0;
- LcdEn = 0;
- lcdDat= (dat1<<2)&0x3c; //再低
- LcdEn = 1;
- // Lcddelay(11); //不用时钟分频延时要用 c51不用
- _nop_();
- LcdEn = 0;
- #endif
- #if LcdMode8>0
- lcdDat= dat1;
- LcdEn = 1;
- _nop_();
- LcdEn = 0;
- #endif
- }
- /***********************************************************/
- /***********************************************************/
- /***********************************************************/
- void LcdInit(void){
- #if LcdMode4>0
- LcdWriteBety(LineMode4,0);
- Lcddelay(20);
- LcdWriteBety(LineMode4,0);
-
- #endif
- #if LcdMode8>0
- LcdWriteBety(LineMode8,0);
- Lcddelay(20);
- LcdWriteBety(LineMode8,0);
- #endif
- Lcddelay(20);
- LcdWriteBety(Display_ON,0);
- Lcddelay(10);
- LcdWriteBety(EntryMode,0);
- Lcddelay(10);
- LcdWriteBety(LcdClear,0);
- Lcddelay(10);
- }
- /***********************************************************/
- /***********************************************************/
- /***********************************************************/
- void LcdPos(uchar x,uchar y){
- if(y==1) x=0x80+x-1;
- if(y==2) x=0xc0+x-1;
- LcdWriteBety(x,0);
- }
- /***********************************************************/
- /***********************************************************/
- /***********************************************************/
- void LcdClread(){
- LcdWriteBety(LcdClear,0);
- Lcddelay(1500);
- }
- /***********************************************************/
- /***********************************************************/
- /***********************************************************/
- void WriteStr(uchar x,uchar y,uchar *str){
- LcdPos(x,y);
- while(*str!='\0'){
- LcdWriteBety(*str++,1);
- }
- }
- /***********************************************************/
- /***********************************************************/
- /***********************************************************/
- void LcdStr(uchar x,uchar y,uchar *str,uchar mun){
- uchar i;
- LcdPos(x,y);
- for(i=0;i<mun;i++){
- LcdWriteBety(*str++,1);
- }
- }
- /***********************************************************/
- /***********************************************************/
- /***********************************************************/
- sbit LED=P1^0;
- /***********************************************************/
- /***********************************************************/
- /***********************************************************/
- /***********************************************************/
- /***********************************************************/
- /***********************************************************/
- void main(){
-
- LcdInit();
- LcdClread();
- /****************************************************/
- //测屏代码
- CLK_DIV=0x02; //时钟分频 c51用不上,stc12c5404用
- while(1){
-
- WriteStr(1,1,dis1);
- WriteStr(1,2,dis2);
- LED = ~LED;
-
- }
- }
复制代码
所有资料51hei提供下载:
4-8line1602.zip
(46.56 KB, 下载次数: 68)
|