📄 my1602-8bit.c
字号:
#include <iom16v.h>
#include <macros.h>
//--------------------------------------------------------
#define uchar unsigned char
#define uint unsigned int
//-------------------引脚电平的宏定义---------------------
#define LCM_RS_1 PORTA|=16
#define LCM_RS_0 PORTA&=~16
#define LCM_RW_1 PORTA|=32
#define LCM_RW_0 PORTB&=~32
#define LCM_EN_1 PORTA|=64
#define LCM_EN_0 PORTA&=~64
//========================================================
#define DataPort PORTB
#define Busy 0x80
#define xtal 4
//========函数声明========================================
void Delay_1ms(void);
void Delay_nms(uint n);
void LcdWriteData(uchar dataW);
void LcdWriteCommand(uchar CMD,uchar Attribc);
void Init_LCD(void);
void Display(uchar dd);
void DisplayOneChar(uchar x,uchar y,uchar Wdata);
void LCD_DisplayString(uchar x,uchar y, uchar const *ptr);
void busy(void);
//***************测试程序**********************
void DisplayLine2(uchar dd)
{
uchar i;
for(i=0;i<16;i++)
{
DisplayOneChar(i,1,dd++);
dd&=0x7f;
if(dd<32)dd=32;
}
};
//******************************************
//********************显示指定座标的一串字符子函数******************
void LCD_DisplayString(uchar x,uchar y, uchar const *ptr)
{
uchar i,l=0;
while(ptr[l]>31){l++;}
for(i=0;i<l;i++)
{
DisplayOneChar(x++,y,ptr[i]);
if(x==16)
{ x=0;y^=1; }
}
}
//*********************显示光标定位子函数***************************
void LocateXY(char posx,char posy)
{
uchar temp=0x00;
temp&=0x7f;
temp=posx&0x0f;
posy&=0x01;
if(posy==1)temp|=0x40;
temp|=0x80;
LcdWriteCommand(temp,1);
}
//*********************显示指定座标的一个字符子函数*****************
void DisplayOneChar(uchar x,uchar y,uchar Wdata)
{
LocateXY(x,y);
LcdWriteData(Wdata);
}
//*******************LCD初始化子函数*********************************
void Init_LCD(void)
{
LcdWriteCommand(0x38,0);
Delay_nms(5);
LcdWriteCommand(0x38,0);
Delay_nms(5);
LcdWriteCommand(0x38,0);
Delay_nms(5);
LcdWriteCommand(0x38,1);
LcdWriteCommand(0x08,1);
LcdWriteCommand(0x01,1);
LcdWriteCommand(0x06,1);
LcdWriteCommand(0x0c,1);
}
//********************写命令到LCM子函数******************************
void LcdWriteCommand(uchar CMD,uchar Attribc)
{
if(Attribc)busy( );
LCM_RS_0;LCM_RW_0;NOP();
DataPort=CMD;NOP();
LCM_EN_1;NOP();NOP();LCM_EN_0;
}
//*******************写数据到LCM子函数*******************************
void LcdWriteData(uchar dataW)
{
busy();
LCM_RS_1;
LCM_RW_0;NOP();
DataPort=dataW;NOP();
LCM_EN_1;NOP();NOP();LCM_EN_0;
}
//*******************检测LCD忙信号子函数*****************************
void busy(void)
{
uchar temp;
temp=1;
NOP();NOP();//Delay_1ms( );
LCM_RS_0; //RS=0
NOP();NOP();
LCM_RW_1; //RW=1
NOP();NOP();//Delay_1ms( );
while(temp)
{
LCM_EN_1; //EN=1
NOP();NOP();//Delay_1ms( );
DDRA=0x00; //A口变输入
PORTA=0xff; //上拉使能
NOP();NOP();//Delay_1ms( );
temp = PINA&0x80; //读取A口
NOP();NOP();//Delay_1ms( );
DDRA=0xff;
PORTA=0xff; //A口变输出
NOP();NOP();//Delay_1ms( );
LCM_EN_0; //EN=0
NOP();NOP();//Delay_1ms( );
}
}
//*******************1mS延时子函数**********************************
void Delay_1ms(void)
{ uint i;
for(i=1;i<(uint)(xtal*143-2);i++)
;
}
//*******************n*1mS延时子函数********************************
void Delay_nms(uint n)
{
uint i=0;
while(i<n)
{
Delay_1ms();
i++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -