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

📄 daxianshi.c

📁 实现DA0832在LCD1602显示数值
💻 C
字号:
#include<stdio.h>
#include<reg51.h>
#include<intrins.h>
#include <absacc.h>

#define uchar unsigned char
#define LCD_DATA P0  //数据口  
#define LCD_GO_HOME 0x02 //AC=0,光标、画面回HOME位

//输入方式设置
#define LCD_AC_AUTO_INCREMENT 0x06 //数据读、写操作后,AC自动增一
#define LCD_AC_AUTO_DECREASE 0x04 //数据读、写操作后,AC自动减一
#define LCD_MOVE_ENABLE 0x05 //数据读、写操作,画面平移
#define LCD_MOVE_DISENABLE 0x04 //数据读、写操作,画面不动

//设置显示、光标及闪烁开、关
#define LCD_DISPLAY_ON 0x0C //显示开
#define LCD_DISPLAY_OFF 0x08 //显示关
#define LCD_CURSOR_ON 0x0A //光标显示
#define LCD_CURSOR_OFF 0x08 //光标不显示
#define LCD_CURSOR_BLINK_ON 0x09 //光标闪烁
#define LCD_CURSOR_BLINK_OFF 0x08 //光标不闪烁

//光标、画面移动,不影响DDRAM
#define LCD_LEFT_MOVE 0x18 //LCD显示左移一位
#define LCD_RIGHT_MOVE 0x1C //LCD显示右移一位
#define LCD_CURSOR_LEFT_MOVE 0x10 //光标左移一位
#define LCD_CURSOR_RIGHT_MOVE 0x14 //光标右移一位

//工作方式设置
#define LCD_DISPLAY_DOUBLE_LINE 0x38 //两行显示
#define LCD_DISPLAY_SINGLE_LINE 0x30 //单行显示

sbit LCD_BUSY=P0^7;      //忙标志位
sbit LCD_RS=P3^7;		 //LCD寄存器
sbit LCD_RW=P3^6;		 //LCD读写
sbit LCD_EN=P2^6;		 //LCD使能
sbit RW=P3^6;
sbit DA=P2^5;

//定义变量
uchar XPOS,YPOS;
uchar Tens[2]={0x01,0x02};
uchar counter;
uchar Later=0;
uchar out;
uchar DAzhi[];

/*********************************************
涵数名称:  Delay()
涵数功能:  延时
入口参数:  Void
出口参数:  Void
*********************************************/
void Delay(int number)
{
 for(;number!=0;number--)
 {}
}

/*********************************************
涵数名称:  LcdCheckBusy(void)
涵数功能:  判断LCD忙信号
入口参数:  Void
出口参数:  Void
*********************************************/
void LcdCheckBusy(void)		   //判断忙标志
  {
   LCD_DATA=0xff;
   LCD_RS=0;				   //选择IR
   LCD_RW=1;				   //读操作
   LCD_EN=1;
   while(LCD_BUSY);	   //为1继续判断,为0时往下执行
   LCD_EN=0;
   }

/*********************************************
涵数名称: LCD_READ_AC()
涵数功能:  读LCD光标地址
入口参数:  void
出口参数:  Void
*********************************************/
/*void Lcd_Read_AC()
{
   LCD_DATA=0xff;
   LCD_RS=0;				   //选择IR
   LCD_RW=1;				   //读操作
   LCD_EN=1;
  counter=LCD_DATA;	   //为1继续判断,为0时往下执行   
   LCD_EN=0;
} 

/*********************************************
涵数名称:  LcdCls(void)
涵数功能:  向LCD写指令
入口参数:  void
出口参数:  Void
*********************************************/
void LcdCls(void) //LCD清屏
{
LcdCheckBusy();
LCD_RS=0;
LCD_RW=0;
LCD_EN=1;
LCD_DATA=1;
LCD_EN=0;
}


/*********************************************
涵数名称:  void LcdWriteInstruction()
涵数功能:  向LCD写指令
入口参数:  uchar LcdInstruction
出口参数:  Void
*********************************************/
 
 void LcdWriteInstruction(uchar LcdInstruction) //写指令到LCD
{
LcdCheckBusy();
LCD_RS=0;
LCD_RW=0;
LCD_EN=1;
LCD_DATA=LcdInstruction;
LCD_EN=0;
}

/*********************************************
涵数名称:  LcdWriteData()
涵数功能:  输出一个字节
入口参数:  uchar LcdData
出口参数:  Void
*********************************************/
void LcdWriteData(uchar LcdData) //输出一个字节数据到LCD
{
LcdCheckBusy();
LCD_RS=1;
LCD_RW=0;
LCD_EN=1;
LCD_DATA=LcdData;
LCD_EN=0;
}

/*********************************************
涵数名称:  void LcdPos(void)
涵数功能:  地址计算
入口参数:  viod
出口参数:  Void
*********************************************/ 

void LcdPos(void)		   //显示地址计算
{  XPOS&=0x0f; 			   //定义列向显示个数为16
   YPOS&=0x03;			   //定义显示行数为2行
   if(YPOS==0x00)		   //当在第一行显示时,横向显示地址从0开始,因为写地址时D7为1,所以要或80H
      LcdWriteInstruction(XPOS|0x80);
   else if(YPOS==0x01)
      LcdWriteInstruction((XPOS+0x40)|0x80);   //当在第二行显示时,加40H回到第二行的第一个位置
   else if(YPOS==0x02)
      LcdWriteInstruction((XPOS+0x01)|0x80);  //当行数超过2时,回到起始点
  
}
 
/*********************************************
涵数名称:  void LcdInits(void)
涵数功能:  初始化LCD
入口参数:  void
出口参数:  Void
*********************************************/ 
void LcdInit(void) //初始化LCD
{
LcdWriteInstruction(LCD_DISPLAY_DOUBLE_LINE);
LcdWriteInstruction(LCD_DISPLAY_OFF);
LcdCls();
LcdWriteInstruction(LCD_AC_AUTO_INCREMENT);
LcdWriteInstruction(0x0f);
}


/*********************************************
涵数名称:  void LcdWDAstr()
涵数功能:  确定显示地址并显示字符串
入口参数:  uchar x 确定LCD的X向显示坐标
           uchar y 确定LCD的Y向显示坐标
		   uchar s[]写入字符串
		   uchar Len 数组长度
出口参数:  Void
*********************************************/  
void LcdWDAstr(uchar x,uchar y,uchar s[],uchar Len)	   //地址确定
{	
    YPOS=y;		//把要显示的位置赋值 
    for(XPOS=x;Later<Len;XPOS++)  //指针值必须要有数据
    { 
	 LcdPos();
     LcdWriteData(s[Later]);					   //指针取内容
     Later++;							   //逐个显示
   }
}

/**********************************************
函数名称:DA_Star()
函数功能:启动DA转换
函数类型:void
入口参数:无
出口参数:无
***********************************************/
void DA_Star(uchar d)
{
  RW=0;
  DA=0;
  _nop_();
 _nop_();
 _nop_();
  P0=d;
  _nop_();
 _nop_();
 _nop_();
  RW=1;
  DA=1;
  _nop_();
 _nop_();
 _nop_();
  _nop_();
 _nop_();
 _nop_();
 }

void main()
{
  LcdInit();
  while(1)
 {
  DA_Star(0xff);
  Delay(2000);
  DA_Star(0x00);
  Delay(2000);
  Tens[Later]+=0x30;
  LcdWDAstr(3,0,Tens,1);

 }
 }



⌨️ 快捷键说明

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