为啥按书上的例子
仿真串口液晶MILFORD-2X16-BKP显示乱码??
例子源于书《PIC16系列
单片机C程序设计与
proteus仿真》江和编著
/******************************************************************************/
/*FilestoInclude*/
/******************************************************************************/
#ifdefined(__XC)
#include<xc.h>/*XC8GeneralIncludeFile*/
#elifdefined(HI_TECH_C)
#include<htc.h>/*HiTechGeneralIncludeFile*/
#endif
#include<stdint.h>/*Foruint8_tdefini
tion*/
#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>*/
}
}
一周热门 更多>