|
这是我验证过的,可以参考下啊
#include
#include
#define nop _nop_()
typedef unsigned char uint8;
typedef signed char int8;
typedef unsigned int uint16;
typedef signed int int16;
typedef unsigned long uint32;
typedef signed long int32;
sbit a0 = ACC^0;
sbit a1 = ACC^1;
sbit a2 = ACC^2;
sbit a3 = ACC^3;
sbit a4 = ACC^4;
sbit a5 = ACC^5;
sbit a6 = ACC^6;
sbit a7 = ACC^7;
#define LCD1602_DATA P0 //8位数据并行口
#define LCD1602_RS P2_0 //指令OR数据寄存器选择
#define LCD1602_RW P2_1 //读写控制
#define LCD1602_EN P2_5 //使能控制
#define LCD1602_CLR 0x01 //清屏
#define LCD1602_MODE 0x38 //8位数据,双列显示,5*7字形
#define LCD1602_ON 0x0c //开显示,关光标,光标不闪烁
#define LCD1602_ADDR_MODE 0x06 //地址递增
uint8 code self_table1[]={
0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,// 年
0x1f,0x11,0x1f,0x11,0x1f,0x11,0x15,0x17,//月
0x00,0x1f,0x11,0x1f,0x11,0x11,0x1f,0x00,// 日
0x01,0x0c,0x17,0x14,0x17,0x0c,0x01,0x00,//闹钟标志
0x10,0x18,0x1c,0x1e,0x1f,0x1c,0x18,0x10 };//三角形符号
/**********************************************************
蜂鸣器
************************************************************/
void delay_ms(uint16 count) // 延时时间count*1ms
{ uint16 i;
for(;count>0;count--)
{
for(i=0;i<110;i++)
{
nop;
}
}
}
/***********************************************************
忙检测
************************************************************/
void LCD1602_check_busy(void)
{
LCD1602_DATA = 0xff;
LCD1602_RS = 0 ;
LCD1602_RW = 1 ;
LCD1602_EN = 1 ;
while(LCD1602_DATA & 0x80) ;
LCD1602_EN = 0 ;
}
/**********************************************************
写指令
************************************************************/
void LCD1602_write_cmd(uint8 cmd)
{
LCD1602_check_busy();
LCD1602_RS = 0 ;
LCD1602_RW = 0 ;
LCD1602_DATA = cmd ;
LCD1602_EN = 1 ;
LCD1602_EN = 0 ;
}
/***********************************************************
写数据
*************************************************************/
void LCD1602_write_data(uint8 dat)
{
LCD1602_check_busy();
LCD1602_RS = 1 ;
LCD1602_RW = 0 ;
LCD1602_DATA = dat ;
LCD1602_EN = 1 ;
LCD1602_EN = 0 ;
}
/***********************************************************
1602初始化
************************************************************/
void LCD1602_init(void)
{
uint8 i ;
LCD1602_write_cmd(0x40);//CGRAM起始地址
for(i=0;i<40;i++)
LCD1602_write_data(self_table1);//写入自定义字符
LCD1602_write_cmd(LCD1602_MODE) ;
LCD1602_write_cmd(LCD1602_ON) ;
LCD1602_write_cmd(LCD1602_ADDR_MODE) ;
LCD1602_write_cmd(LCD1602_CLR) ;
}
/************************************************************
设置显示坐标
************************************************************/
void LCD1602_set_postion(uint8 x , uint8 y)
{
if(y<2)
{
y &= 0x01 ; //y值限定在0~1之间
x &= 0x0f ; //x值限定在0~15之间
if(y == 0)
x |= 0x40 ; //如果显示是在第二行,则x的值加0x40
x |= 0x80 ; //获得x的值
LCD1602_write_cmd(x) ;//写入坐标值到LCD
}
}
/************************************************************
指定位置写字符
*************************************************************/
void LCD1602_write_char(uint8 x , uint8 y , uint8 chardata)
{
LCD1602_set_postion(x,y) ;
LCD1602_write_data(chardata) ;
}
/************************************************************
指定位置写字符串
*************************************************************/
void LCD1602_write_string(uint8 x , uint8 y , uint8 *string)
{
LCD1602_set_postion(x,y) ;
while((*string) != '\0')
{
LCD1602_write_data(*string) ;
string++ ;
}
}
main()
{LCD1602_init(); //初始化
LCD1602_write_string(0,0,"hello"); //在第一行第一列显示hello
LCD1602_write_char(1,1,'f');//在第二行第二列显示f
} |
|