lcdmain.c
#include<stc89.h>
#include"display.h"
void main(void){
Display();
}
lcd1602.c
#include <stc89.h>
#include <intrins.h>
#include "delay.h"
sbit LCD_RS = P2^7;
sbit LCD_RW = P2^6;
sbit LCD_EN = P2^5;
#define LCD_DataPort P0
unsigned char code num_table[] = "0123456789";
unsigned char code Temp_C[] = {0x18,0x1B,0x04,0x08,0x08,0x08,0x04,0x03}; //温度图标码
void LCD_IsBusy(void){ //检测是否忙
unsigned char temp = 0x80;
LCD_DataPort = 0x80;
while(temp & 0x80){
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 0;
_nop_();
LCD_EN = 1;
_nop_();
temp = LCD_DataPort;
LCD_EN = 0;
_nop_();
}
}
void LCD_WriteCommand(unsigned char Command){ //写命令
LCD_IsBusy();
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
LCD_DataPort = Command;
_nop_();
LCD_EN = 1;
_nop_();
LCD_EN = 0;
}
void LCD_WriteData(unsigned char Data){ //写数据
LCD_IsBusy();
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
LCD_DataPort = Data;
_nop_();
LCD_EN = 1;
_nop_();
LCD_EN = 0;
}
//设置光标位置
void LCD_SetCursor(unsigned char Line,unsigned char Column){
if(Line == 1){
LCD_WriteCommand(0x80 | (Column-1));
}
else if(Line == 2){
LCD_WriteCommand(0xc0 | (Column-1));
}
}
//指定位置写入字符
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char){
LCD_SetCursor(Line,Column);
LCD_WriteData(Char);
}
//指定位置写入字符串
void LCD_ShowString(unsigned char Line,unsigned char Column,char *String){
unsigned char i;
LCD_SetCursor(Line,Column);
for(i=0;String[i]!='\0';i++){
LCD_WriteData(String[i]);
}
}
//返回值=x的y次方
int LCD_Pow(int x, int y){
unsigned char i;
int Result = 1;
for (i=0;i<y;i++){
Result *= x;
}
return Result;
}
//指定位置开始显示所给数字
void LCD_ShowNum(unsigned char Line,unsigned char Column,int Number){
LCD_SetCursor(Line,Column);
LCD_WriteData(num_table[Number / 10]);
LCD_WriteData(num_table[Number % 10]);
}
//指定位置开始以有符号十进制显示所给数字
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number){
unsigned char LSB; //这函数改成了外理温度与显示温度
LCD_SetCursor(Line,Column);
if((Number&0xf800)==0x0000){
LCD_WriteData(' ');
LSB = (Number&0x000f)*0.625;
Number>>=4;
Number=Number*10;
}
LCD_WriteData(Number/LCD_Pow(10,2)%10+'0');
LCD_WriteData(Number/LCD_Pow(10,1)%10+'0');
LCD_SetCursor(2,15); //小数显示的位置
LCD_WriteData(LSB/LCD_Pow(10,0)%10+'0'); //LSB是小数位,单独外理了
}
void LCD_Init(void){ //LCD1602初始化
unsigned char i;
DelayMs(10);
LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵
DelayMs(1);
LCD_WriteCommand(0x06); //显示开,光标关,闪烁关
LCD_WriteCommand(0x0c); //数据读写操作后,光标自动加一,画面不动
LCD_WriteCommand(0x01); //光标复位,清屏
DelayMs(1);
LCD_WriteCommand(0x40); //温