📄 daxianshi.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 + -