为啥按书上的例子仿真串口液晶MILFORD-2X16-BKP显示乱码??

2019-07-18 08:39发布

为啥按书上的例子仿真串口液晶MILFORD-2X16-BKP显示乱码??
例子源于书《PIC16系列单片机C程序设计与proteus仿真》江和编著
lcd.png




/******************************************************************************/
/*FilestoInclude*/
/******************************************************************************/

#ifdefined(__XC)
#include<xc.h>/*XC8GeneralIncludeFile*/
#elifdefined(HI_TECH_C)
#include<htc.h>/*HiTechGeneralIncludeFile*/
#endif

#include<stdint.h>/*Foruint8_tdefinition*/
#include<stdbool.h>/*Fortrue/falsedefinition*/

#include"system.h"/*Systemfunct/params,likeosc/peripheralconfig*/
#include"user.h"/*Userfunct/params,suchasInitApp*/
#include<stdio.h>
/******************************************************************************/
/*UserGlobalVariableDeclaration*/
/******************************************************************************/
char        ID[8];
/*i.e.uint8_t<variable_name>;*/
#define        TX                GP1//RC1                //¿ØÖÆ´®ÐÐLCDµÄTX

//#defineTX_DIRTRISD0//TRISC1
//#defineTX_READY()TX_DIR=0


#define        LCD_CLR        0x01                //ÇåÆÁÃüÁî
#define        LINE1                0x80                //µÚ1ÐеØÖ·
#define        LINE2                0xC0                //µÚ2ÐеØÖ·
#define        COMMAND        0xFE                //ÃüÁîÂë

#define        LCD_COMMAND(A)        
                LCD_TX(COMMAND);        
                LCD_TX(A)

#define        LCD_CLEAR()               
                LCD_COMMAND(LCD_CLR);        
                DELAY(2)
/******************************************************************************/
/*MainProgram*/
/******************************************************************************/

//======ÑÓʱ(n)ms
voidDELAY(unsignedintn)
{        unsignedintj;
        chark;
        for(j=0;j<n;j++)
                        for(k=246;k>0;k--)NOP();
}
//======ÑÓʱ(n¡Á10)us+12us,¾«È·,°üÀ¨µ÷ÓÃÓë·µ»Øʱ¼ä
voidDELAY_US(charn)
{        charj;
        j=n;
        while(j>0)
        {        j--;
                NOP();NOP();NOP();NOP();
        }
}
voidLCD_TX(charA)        //°´9600²¨ÌØÂÊÓëLCDͨÐÅ,ÿλʱ¼äΪ104us
{        chari;
        TX=1;NOP();
        TX=0;                        //Æôʼλ
        DELAY_US(9);//9        //ÑÓʱԼ102us
        for(i=0;i<8;i++)
        {        if((A&0x01)==0x01)
                        TX=1;
                else
                        TX=0;
                DELAY_US(8);//8//ÑÓʱ92us,¼ÓÉÏÑ­»·ÄÚµÄÆäËûÖ´ÐÐʱ¼ä,Óë9600²¨ÌØÂÊʱ¼ä104Ïà½ü¡£
                A=A>>1;        
        }
        TX=1;
        DELAY_US(20);//20        //°üÀ¨Í£Ö¹Î»ÑÓʱԼ212us,
}
void        LCD_CSH(void)
{        

//TX_READY();
TRISIO=0x08;
TX=1;
DELAY(200);
        LCD_COMMAND(0b00001100);        //D(d2)=1:´ò¿ªÏÔʾ,C(d1)=0:¹â±ê¹Ø±Õ,B(d0)=0:¹â±ê²»ÉÁ
        LCD_COMMAND(0b00000001);        //Çå³ýÏÔʾ
        DELAY(2);                                //ÑÓʱ2ms
        LCD_COMMAND(0b00000110);        //ÊäÈëģʽ,I/D(d1)=1:µØÖ·¼Ó1,S(d0)=1:ÏÔʾÒÆλ¹Ø±Õ        
}

//ÏÔʾN¸ö×Ö·û,×Ö·ûÒÑ´æÓÚÊý×éAÖÐ
voidLCD_LINE(char*A,charN)
{        chari;
        for(i=0;i<N;i++)
                LCD_TX(A);        
}

//ÏÔʾN¸ö×Ö·û,×Ö·ûΪ³£ÊýÊý×é
voidLCD_LINE1(constchar*A,charN)
{        chari;
        for(i=0;i<N;i++)
                LCD_TX(A);        
}

//°´ÕÕ16½øλÊýÏÔʾN¸ö×Ö½Ú(2N¸ö×Ö·û)
voidLCD_LINE2(char*A,charN)
{        chari,j,k;
        for(i=N;i>0;i--)
        {        j=A[i-1];
                k=j>>4;                        //ÏÈд¸ß4λ
                k=k&0x0F;
                if(k<=9)
                        LCD_TX(k+0x30);        //°Ñ0£­9ת»»ÎªÏàÓ¦Êý×ÖµÄASCIIÂë
                else
                        LCD_TX(k+'A'-0x0A);        //°ÑA£­Fת»»ÎªÏàÓ¦×Ö·ûµÄASCIIÂë
                k=j&0x0F;                        //ÔÙдµÍ4λ
                if(k<=9)
                        LCD_TX(k+0x30);
                else
                        LCD_TX(k+'A'-0x0A);
        }        
}
voidlcdPrintString(constchar*s)
{
        //while(s&&*s)        
        while(s&&*s)               
                LCD_TX(*s++);        
}
constcharAA1[13]="Find1-WIRE:";
void        DISP_ID(char*A)
{        LCD_CLEAR();
        DELAY(30);                        //Ôì³ÉÉÁ¶¯Ð§¹û
        LCD_COMMAND(LINE1);        //µÚ1ÐÐ
        LCD_LINE1(AA1,12);        //ÏÔʾÊý×éAA1µÄÇ°12¸ö×Ö·û
        LCD_COMMAND(LINE2);        //µÚ2ÐÐ
        LCD_LINE2(A,8);                //°´16½øÖÆÏÔʾROM_CODE
        DELAY(1000);                //ÑÓʱʱ¼ä¿É¸ù¾ÝÇé¿öÔö¡¢¼õ
}
//ÏÔʾζÈÖµ
void        DISP_WD(intWENDU)
{        
unsignedcharbuf[20]={0};//40

        LCD_COMMAND(0b00001100);//D(d2)=1:´ò¿ªÏÔʾ,C(d1)=0:¹â±ê¹Ø±Õ,B(d0)=0:¹â±ê²»ÉÁ
        LCD_COMMAND(LINE1+3);        //ÏÔʾζÈÖµ
        LCD_TX('t');
        LCD_TX('=');        

sprintf(buf,"%d",WENDU);
        lcdPrintString(buf);
        
        LCD_TX(0xDF);                //ÏÔʾ"¡ã",¼ûͼ5.10
        LCD_TX('C');
        LCD_COMMAND(0b00001111);//D(d2)=1:´ò¿ªÏÔʾ,C(d1)=1:¹â±ê´ò¿ª,B(d0)=1:¹â±êÉÁ˸
        DELAY(1000);
}
void        CSH(void)
{        ANSEL=0;                //全为数字口
        WPU=0;                //禁止弱上拉
        CMCON0=0x07;        //关闭比较器,相关的口均为IO口
        TRISIO=0b00001000;
        TX=1;
        OSCCON=0b01100000;        //选用内部4M振荡器作为系统时钟
}


voidmain(void)
{
/*Configuretheoscillatorforthedevice*/
ConfigureOscillator();

/*InitializeI/OandPeripheralsforapplication*/
InitApp();

for(inti=0;i<i;i++)
ID=0x99;

CSH();

LCD_CSH();
DISP_ID(ID);
while(1)
{
/*TODO<INSERTUSERAPPLICATIONCODEHERE>*/
}

}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。