📄 lcd1602.c
字号:
#include <pic.h>
#include <stdio.h>
#include <string.h>
#define LcdRs RA2
#define LcdRw RA3
#define LcdEn RA4
#define DBPort PORTB
#define _nop_() asm("nop")
__CONFIG(0X2F50);
volatile unsigned int Count=0;
volatile unsigned char TempBuffer[10];
bank1 volatile unsigned char name[]="The 1602LCD Test",
name1[]="GO: by XuF";
//内部等待函数**************************************************************************
void interrupt TMR(void)
{
#asm
CLRWDT
#endasm
TMR2IF=0;
}
void delay(unsigned int n)
{
unsigned int j;
for(j=0;j<n;j++);
}
void IntToStr(unsigned int t, unsigned char *str, unsigned char n)
{
unsigned char a[5];
char i, j;
a[0]=(t/10000)%10; //取得整数值到数组
a[1]=(t/1000)%10;
a[2]=(t/100)%10;
a[3]=(t/10)%10;
a[4]=(t/1)%10;
for(i=0;i<5;i++)
{
*str=a[i]+'0';
str++;
}
*str='\0';
str=str-5;
if(*str=='0')
{
*str=' ';
str++;
if(*str=='0')
{
*str=' ';
str++;
if(*str=='0')
{
*str=' ';
str++;
if(*str=='0')
{
*str=' ';
str++;
if(*str=='0')
{
*str=' ';
str++;
}
}
}
}
}
/*for(i=0; i<5; i++) //转成ASCII码
a[i]=a[i]+'0';
for(i=0; a[i]=='0' && i<=3; i++);
for(j=5-n; j<i; j++) //填充空格
{ *str=' '; str++; }
for(; i<5; i++)
{ *str=a[i]; str++; } //加入有效的数字
*str='\0'; */
}
unsigned char LCD_Wait(void)
{
LcdRs=0;
LcdRw=1;
_nop_();
LcdEn=1;
_nop_();
LcdEn=0;
return DBPort;
}
//向LCD写入命令或数据************************************************************
#define LCD_COMMAND 0 // Command
#define LCD_DATA 1 // Data
#define LCD_CLEAR_SCREEN 0x01 // 清屏
#define LCD_HOMING 0x02 // 光标返回原点
void LCD_Writedata(unsigned char input)
{
LcdRs=1;
LcdRw=0;
LcdEn=0;
_nop_();
DBPort=input;
_nop_();
LcdEn=1;
_nop_();
LcdEn=0;
_nop_();
delay(1000);
}
void LCD_Writecommand(unsigned char input)
{
LcdRs=0;
LcdRw=0;
LcdEn=0;
_nop_();
DBPort=input;
_nop_();
LcdEn=1;
_nop_();
LcdEn=0;
_nop_();
delay(1000);
}
//设置显示模式************************************************************
#define LCD_SHOW 0x04 //显示开
#define LCD_HIDE 0x00 //显示关
#define LCD_CURSOR 0x02 //显示光标
#define LCD_NO_CURSOR 0x00 //无光标
#define LCD_FLASH 0x01 //光标闪动
#define LCD_NO_FLASH 0x00 //光标不闪动
void LCD_SetDisplay(unsigned char DisplayMode)
{
LCD_Writecommand(0x08|DisplayMode);
}
//设置输入模式************************************************************
#define LCD_AC_UP 0x02
#define LCD_AC_DOWN 0x00 // default
#define LCD_MOVE 0x01 // 画面可平移
#define LCD_NO_MOVE 0x00 //default
void LCD_SetInput(unsigned char InputMode)
{
LCD_Writecommand(0x04|InputMode);
}
void LCD_Initial()
{
LcdEn=0;
delay(1500);
LCD_Writecommand(0x38); //8位数据端口,2行显示,5*7点阵
LCD_Writecommand(0x38);
LCD_Writecommand(0x38);
LCD_Writecommand(0x38);
//LCD_Writecommand(0x08);//显示关
//LCD_Writecommand(0x01);//清屏
//LCD_Writecommand(0x06);//AC递增, 画面不动
//LCD_Writecommand(0x0c);//开启显示, 无光标
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标
LCD_Writecommand(LCD_CLEAR_SCREEN); //清屏
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动
}
//************************************************************************
void GotoXY(unsigned char x, unsigned char y)
{
if(y==0)
LCD_Writecommand(0x80|x);//写地址
if(y==1)
LCD_Writecommand(0x80|(x+0x40));
}
void Print(unsigned char *str)
{
while((*str)!='\0')
{
LCD_Writedata(*str);
str++;
}
}
void systeminitial()
{
OSCCON=0X62;
OSCTUNE=0X00;
OPTION=0X1F;
CMCON=0X07;
//CCPR1L=0;
//PR2=255;
//TMR2=0X00;
//T2CON=0X0C;
//PORTB=0X00;
TRISB=0X00;
PORTA=0X00;
TRISA=0X00;
ANSEL=0X00;
PIR1=0;
PIE1=0;
INTCON=0;
//WDTCON=0X00;
}
void main()
{
systeminitial();
LCD_Initial();
GotoXY(0,0);
Print(name);
GotoXY(0,1);
Print(name1);
while(1)
{
IntToStr(Count++,&TempBuffer[0],5);
GotoXY(3,1);
Print(&TempBuffer[0]);
delay(1000);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -