|
#include<reg51.h>
#include<intrins.h>
typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 无符号8位整型变量 */
typedef signed char S8; /* defined for signed 8-bits integer variable 有符号8位整型变量 */
typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 无符号16位整型变量 */
typedef signed int S16; /* defined for signed 16-bits integer variable 有符号16位整型变量 */
typedef unsigned long U32; /* defined for unsigned 32-bits integer variable 无符号32位整型变量 */
typedef signed long S32; /* defined for signed 32-bits integer variable 有符号32位整型变量 */
typedef float F32; /* single precision floating point variable (32bits) 单精度浮点数(32位长度) */
typedef double F64; /* double precision floating point variable (64bits) 双精度浮点数(64位长度) */
sbit LCD_RS = P0^7;
sbit LCD_RW = P0^6;
sbit LCD_EN = P0^5;
sbit LED = P1^0;
#define Data P2
#define Data_0_time 4
//独立按键接口 可自行修改
/*****************
函数名称:delay();
函数功能:粗略延时
******************/
void delay1(U16 i)
{
U16 j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void DelayUs2x(U8 t)
{
while(--t);
}
void DelayMs(U8 t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
void Delay(U16 j)
{
U8 i;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
void Delay_10us(void)
{
U8 i;
i--;
i--;
i--;
i--;
i--;
i--;
}
/*****************
函数名称:bit lcd_busy()
函数功能:检查LCD忙状态
输入值 :无
返回值 :
******************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_EN = 1;
delay1(1);
result = (bit)(Data&0x80);
LCD_EN = 0;
return(result);
}
/*****************
函数名称:void LCD1602_WriteCmd(unsigned char cmd)
函数功能:写指令数据到LCD
输入值 :指令
返回值 :无
******************/
void LCD1602_WriteCmd(unsigned char cmd)
{
LCD_RS = 0;
LCD_EN = 0;
delay1(1);
Data = cmd;
delay1(5);
LCD_EN = 1;
delay1(5);
LCD_EN = 0;
delay1(10);
}
/*****************
函数名称:void LCD1602_WriteData(unsigned char dat)
函数功能:写显示数据到LCD
输入值 :数据
返回值 :无
******************/
void LCD1602_WriteData(U8 dat)
{
LCD_RS = 1;
LCD_EN = 0;
Data = dat;
delay1(1);
LCD_EN = 1;
delay1(1);
LCD_EN = 0;
delay1(10);
}
/*****************
函数名称:void lcd_init(void)
函数功能:LCD1602初始化函数
输入值 :无
返回值 :无
******************/
void lcd_init(void)
{
LCD_RW = 0;
delay1(15);
LCD1602_WriteCmd(0x01); //清除LCD的显示内容
LCD1602_WriteCmd(0x38); //16*2显示,5*7点阵,8位数据
delay1(5);
LCD1602_WriteCmd(0x38);
delay1(5);
LCD1602_WriteCmd(0x38);
delay1(5);
LCD1602_WriteCmd(0x0c); //开显示,不显示光标
delay1(5);
LCD1602_WriteCmd(0x01); //清除LCD的显示内容
delay1(5);
}
/*****************
函数名称:void LCD1602_WriteChar(unsigned char x,unsigned char y,unsigned char Dat)
函数功能:写单个字符到指定坐标
输入值 :x:行 (可取0~1) y:列 (可取0~15) Dat:为要显示的数据
返回值 :无
******************/
void LCD1602_WriteChar(U8 x,U8 y,U8 Dat)
{
if(x==0)
{
LCD1602_WriteCmd(0x80+y);
LCD1602_WriteData(Dat);
delay1(5);
}
if(x != 0)
{
LCD1602_WriteCmd(0x80+0x40+y);
LCD1602_WriteData(Dat);
delay1(5);
}
}
/*****************
函数名称:void LCD1602_WriteChar(unsigned char x,unsigned char y,unsigned char Dat)
函数功能:写字符串到指定坐标 (x,y)为首个字符的显示位置
输入值 :x:行 (可取0~1) y:列 (可取0~15) Dat:为要显示的数据
返回值 :无
******************/
void LCD1602_WriteString(U8 x,U8 y,U8 *String)
{
U8 i;
for(i=0;String[i]!='\0';i++)
{
LCD1602_WriteChar(x,y++,String[i]);
}
}
void init(void)
{
TMOD = 0x20; //定时器T1使用工作方式2
TH1 = 253; // 设置初值
TL1 = 253;
TR1 = 1; // 开始计时
SCON = 0x50; //工作方式1,波特率9600bps,允许接收
ES = 1;
EA = 1; // 打开所以中断
}
void main(void)
{
int a;
lcd_init();
init();
while (1)
{
LCD1602_WriteString(0,0,"GangBanHou:");
LCD1602_WriteString(1,3,"mm");
LCD1602_WriteChar(1,0,'f');
a++;
DelayMs(500);
LCD1602_WriteChar(1,1,a+'0');
}
}
|
评分
-
查看全部评分
|