#include "stm8s105c6.h"
#include "lcd1602.h"
u8 LCDtemp1602;
void InitDelayLCD1602(void)
{
u8 temp,i=1;
LCDtemp1602 =1;
temp =(CLK_CKDIVR&0X18)>>3;
i=temp;
while(i--)
temp = temp<<1;
LCDtemp1602 =16/temp;
//LCDtemp1602 =LCDtemp1602<<1;
}
/*
===================================================
函数:void DelayUS1602(u16 xus)
参数:u16 xus:延时xus微秒
输出:无
说明:延时时函数,主频16M
===================================================
*/
void DelayUS1602(u16 xus)
{
u8 temp;
xus = xus >>3;
while(xus--)
{
for(temp = 0;temp <=LCDtemp1602; temp ++);
}
/*
#pragma asm
PUSHW X
DELAY_LOOP:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DECW X
JRNE DELAY_LOOP
POPW X
#pragma endasm*/
}
/*
===================================================
函数:void DelayMS1602(u16 xms)
参数:u16 xms:延时xms毫秒
输出:无
说明:延时时函数,主频16M
===================================================
*/
void DelayMS1602(u16 xms)
{
u16 j;
for(j=xms;j>0;j--)
DelayUS1602(1000);
}
/*
===================================================
函数:u8 LCD1602_Check_Cusy(void)
参数:无
输出:u8 i:i=0时数据线空闲;i=1时数据线忙
说明:判断数据线是否空闲
===================================================
*/
u8 LCD1602_Check_Cusy(void)
{
u16 time=0;
u8 i=0;
LCD_RS=0;
LCD_RW=0;
LCD_EN=0;
while((LCD1602_DB&0x80)!=0x00)
{
time++;
if(time>1000) //实际测量会遇到有些型号的液晶BF一直为高,如果等待超时跳出循环
i=1;
}
return i;
}
/*
===================================================
函数:void LCD1602_Write_Command(u8 dat)
参数:u8 dat:写入RAM区的8位命令
输出:无
说明:写命令操作
===================================================
*/
void LCD1602_Write_Command(u8 dat)
{
LCD1602_DB=dat;
LCD_RS=0;//指令
LCD_RW=0;//写入
LCD_EN=1;//允许
LCD_EN=0;
DelayMS1602(1);
}
/*
===================================================
函数:void LCD1602_Write_Data(u8 dat)
参数:u8 dat: 写入LCD1602的8位数据
输出:无
说明:写数据操作
===================================================
*/
void LCD1602_Write_Data(u8 dat)
{
LCD1602_DB=dat;
LCD_RS=1;//数据
LCD_RW=0;//写入
LCD_EN=1;//允许
LCD_EN=0;
DelayMS1602(1);
}
/*
===================================================
函数:void LCD1602_Disp_Char(u8 x,u8 y,u8 dat)
参数:u8 x:显示的行坐标;u8 y:显示的列坐标;u8 dat:显示的字符
输出:无
说明:显示静态单个字符
===================================================
*/
void LCD1602_Disp_Char(u8 x,u8 y,u8 dat)
{
u8 address;
if(y==1)
address=0x80+x;
else
address=0xc0+x;
LCD1602_Write_Command(address);
LCD1602_Write_Data(dat);
}
/*
===================================================
函数:void LCD1602_Disp_String(u8 x,u8 y,u8 *str)
参数:u8 x:显示字符串的起始行坐标,u8 y:显示字符串的起始列坐标;u8 *str:显示的字符串
输出:无
说明:字符串显示
===================================================
*/
void LCD1602_Disp_String(u8 x,u8 y,u8 *str)
{
u8 address;
if(y==1)
address=0x80+x;
else
address=0xc0+x;
LCD1602_Write_Command(address);
while(*str)
{
LCD1602_Write_Data(*str);
str++;
}
}
/*
===================================================
函数:void LCD_Disp_Num(u8 x,u8 y,u16 number)
参数:u8 x:显示数字的起始行坐标:u8 y:显示数字的起始列坐标;u16 number:显示的的数字
输出:无
说明:显示数字,小于65536
===================================================
*/
void LCD1602_Disp_Num(u8 x,u8 y,u16 number)
{
u8 address;
if(y==1)
address=0x80+x;
else
address=0xc0+x;
LCD1602_Write_Command(address);
if(number/10000 != 0)
{
LCD1602_Write_Data(0x30 + number/10000);
LCD1602_Write_Data(0x30 + number%10000/1000);
LCD1602_Write_Data(0x30 + number%1000/100);
LCD1602_Write_Data(0x30 + number%100/10);
LCD1602_Write_Data(0x30 + number%10);
}
else if(number/1000 != 0)
{
LCD1602_Write_Data(0x30 + number/1000);
LCD1602_Write_Data(0x30 + number%1000/100);
LCD1602_Write_Data(0x30 + number%100/10);
LCD1602_Write_Data(0x30 + number%10);
}
else if(number/100 != 0)
{
LCD1602_Write_Data(0x30 + number/100);
LCD1602_Write_Data(0x30 + number%100/10);
LCD1602_Write_Data(0x30 + number%10);
}
else if(number/10 != 0)
{
LCD1602_Write_Data(0x30 + number/10);
LCD1602_Write_Data(0x30 + number%10);
}
else LCD1602_Write_Data(0x30 + number);
}
/*
===================================================
函数:void LCD1602_Init(void)
参数:无
输出:无
说明:LCD1602初始化函数
===================================================
*/
void LCD1602_Init(void)
{
LCD1602_Write_Command(0x38);//设置8位格式,2行,5x7
LCD1602_Write_Command(0x0c);//整体显示,关光标,不闪烁
LCD1602_Write_Command(0x06);//设定输入方式,增量不移位
LCD1602_Write_Command(0x01);//清除屏幕显示
InitDelayLCD1602();
DelayUS1602(10);
}