⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcm1602.c

📁 已经调通了PS2键盘程序。想学习的也许能帮上用处的。
💻 C
字号:
#include<iom16v.h>
#include<eeprom.h> 
#include<macros.h>

#define uchar unsigned char 
#define uint  unsigned int

#define LCM1602_RS 3 //PA3
#define LCM1602_RW 2 //PA2
#define LCM1602_EN 1 //PA1

#define LCM1602_RS_1 PORTA|=BIT(PA3)    //RS脚输出高电平的宏定义
#define LCM1602_RS_0 PORTA&=~BIT(PA3)   //RS脚输出高电平的宏定义
#define LCM1602_RW_1 PORTA|=BIT(PA2)    //RW脚输出高电平的宏定义
#define LCM1602_RW_0 PORTA&=~BIT(PA2)   //RW脚输出高电平的宏定义
#define LCM1602_EN_1 PORTA|=BIT(PA1)    //EN脚输出高电平的宏定义
#define LCM1602_EN_0 PORTA&=~BIT(PA1)   //EN脚输出高电平的宏定义
#define dataport     PORTC                     //数据端口宏定义
#define Busy         0x80                      //忙信号的宏定义
#define XTAL         8                         //晶振频率宏定义


/*****************1ms延时程序*********************
void Delay_nms(uint n)
 {
  uint i,j=0;
  while(j<n)
   {
    for(i=1;i<(uint)(XTAL*143-2);i++)
        {;}
	j++;
    }
 }
/*************************************************/
 
/*****************LCD初始化函数*********************/
void InitLcd(void)
 {
  LcdWriteCommand(0x38,1);//8位数据传送,2行显示,5*7字型,检测忙信号
  Delay_nms(1);
  LcdWriteCommand(0x0c,1);//开显示,检测忙信号
  Delay_nms(1);
  LcdWriteCommand(0x06,1);//LCD显示光标移动设置,整屏显示不移动)
  Delay_nms(1);
  LcdWriteCommand(0x01,1);//清屏,检测忙信号
  Delay_nms(1);
  LcdWriteCommand(0x0f,1);//显示屏打开,光标不闪烁,检测忙信号
  Delay_nms(1);
  //LcdWriteCommand(0x1c,1);
 }

/*****************写命令到LCD函数*********************/
void LcdWriteCommand(uchar CMD,uchar Attribc)
 {
  if(Attribc)WaitForEnable();
  LCM1602_RS_0;LCM1602_RW_0;_NOP();
  dataport=CMD;_NOP();_NOP();
  LCM1602_EN_1;_NOP();_NOP();LCM1602_EN_0;
 }
 
/*****************写数据到LCD函数*********************/
void LcdWriteData(uchar data)
 {
  WaitForEnable();
  LCM1602_RS_1;LCM1602_RW_0;_NOP();
  dataport=data;_NOP();
  LCM1602_EN_1;_NOP();_NOP();LCM1602_EN_0;
 }

/*****************检测LCD忙信号函数*********************/
void WaitForEnable(void)
 {
  uchar val;
  dataport=0xff;
  LCM1602_RS_0;LCM1602_RW_1;_NOP();
  LCM1602_EN_1;_NOP();_NOP();
  DDRC=0x00;//注意端口方向
  val=PINC;//注意端口方向
  while(val&Busy){val=PINC;}//注意端口方向
  LCM1602_EN_0;
  DDRC=0xff;//注意端口方向
 }
 
/*****************显示指定坐标的一个字符函数*****************/
void Displayonechar(uchar x,uchar y,uchar data)
 {
  LocateXY(x,y);
  LcdWriteData(data);
 }

/********************显示光标定位子函数*********************/
void LocateXY(uchar posx,uchar posy)
 {
  uchar temp;
  temp&=0x7f;
  temp=posx&0x0f;
  posy&=0x01;
  if(posy)temp|=0x40;
  temp|=0x80;
  LcdWriteCommand(temp,0);
 }

 /*************显示指定坐标的一串字符函数*********************/
void eputstr(uchar x,uchar y,const uchar *ptr)
 {
   uchar i,l=10;
    while(ptr[l]>31){l++;}
	for(i=0;i<l;i++)
	  {
	   Displayonechar(x++,y,ptr[i]);
	    if(x==16)
		 { 
		  x=0;
		  y^=1;
		 }
	   }
  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -