呵呵 第一次发帖,感谢大家对我的帮助,特别是 ccxlslr 的耐心讲解与帮助解决了,真心的这个坛子很热情。 下面我整体编辑下!
#include <REGX52.H>
#include <stdio.h>
#include <stdarg.h>
#define uchar unsigned char
#define uint unsigned int
/* 端口定义*/
#define LCD_data P0 //数据口
sbit LCD_RS = P3^5; //寄存器选择输入
sbit LCD_RW = P3^6; //液晶读/写控制
sbit LCD_EN = P3^4; //液晶使能控制
sbit LCD_PSB = P3^7; //串/并方式控制
sbit wela= P2^7;
sbit dula= P2^6;
char a[10];
int cnt;
char rx[]={0xfe,0x51,0x30,0x40,0x20};
uchar code dis1[] = {"地址:00000123187"};
uchar code dis2[] = {"电量:123456.78"};
uchar code dis3[] = {"表号:"};
uchar code dis4[] = {"日期:"};
void Delay(uchar i)
{
uint j;
for( ;i>0;i--)
for(j=0;j<700;j++);
}
#define comm 0 //用法:在写命令的时候给零,在写数据的时候给dat 。!
#define dat 1
void wr_lcd(uchar dat_comm,uchar content) //是命令为0,数据为1
{
if(dat_comm)
LCD_RS = 1; //数据
else LCD_RS = 0; /*命令*/
LCD_RW = 0;
LCD_EN = 0;
P0 = content;
Delay(5);
LCD_EN = 1;
Delay(5);
LCD_EN = 0;
}
/*********************************************************/
/* */
/* 设定显示位置 */
/* ******************************************************/
void wr_string(uchar x,uchar y0,uchar *p) /*****写字符串********/
{
uchar pos=0;//初始化
uchar cnt=0;//传递过来的是指针 ,cnt为偏移量,然后一个字符一个字符的写入。
switch(y0)
{
case 0: pos=0x80+x;break;
case 1: pos=0x90+x;break;
case 2: pos=0x88+x;break;
case 3: pos=0x98+x;break;
default: break;
}
wr_lcd(comm,pos);//写地址
while(*(p+cnt)!='\0')//cnt指针偏移量 实现自加,一位位寻址了,
{
wr_lcd(dat,*(p+cnt));//写地址里面放的数据
//wr_lcd(dat,*p);
cnt++;
}
}
/*void wr_data(uchar x,uchar y0,uchar date )//***********************显示单个字符**********/
/*{
uchar pos=0;
switch(y0)
{
case 0: pos=0x80+x;break;
case 1: pos=0x90+x;break;
case 2: pos=0x88+x;break;
case 3: pos=0x98+x;break;
default:break;
}
wr_lcd(comm,pos);//comm为零。函数意思是移动光标到此
wr_lcd(dat,date);//写入这个数据 dat和 comm是 1,0的标志
}*/
void wr_data(uchar x,uchar y0,uchar *date )//***********************显示单个字符**********//
{
uchar pos=0;
switch(y0)
{
case 0: pos=0x80+x;break;
case 1: pos=0x90+x;break;
case 2: pos=0x88+x;break;
case 3: pos=0x98+x;break;
default:break;
}
wr_lcd(comm,pos);//comm为零。函数意思是移动光标到此
wr_lcd(dat,*date);//写入这个数据 dat和 comm是 1,0的标志
wr_lcd(dat,*(date+1));//写入这个数据 dat和 comm是 1,0的标志
}
/* LCD初始化设定 */
void lcd_init()
{
wela=0;
dula=0;
Delay(5);
LCD_PSB = 1; //并口方式
wr_lcd(comm,0x30); //基本指令操作
wr_lcd(comm,0x0C); //显示开,关光标
wr_lcd(comm,0x01); //清除LCD的显示内容
}
void LCD_hanshu()
{
lcd_init(); //初始化LCD
wr_string(0,0,dis1); /*分别为:第1列、第1行*/
wr_string(0,1,dis2); /*分别为:第1列、第2行*/
// wr_string(0,2,Serial_buf);/*表号*/
wr_string(0,3,dis4);
}
void lcd_char_printf(const char *fmt,...) /*这个函数keil自带的有,具体可以去网上查找执行过程*/
{
uchar buf[15],b;// ,c
va_list vp;
va_start(vp, fmt);
vsprintf(buf, fmt, vp);
wr_data(b,2,buf);
if(fmt<0) // 一帧数据显示完,给b赋0;一般读取下此数据,可根据自己实际添加
b=0;
b++;
}
//}
void main(void)
{
char i;
LCD_hanshu();/*液晶初始化及显示*/
for(i=0;i<5;i++)
{
lcd_char_printf("%bx",rx[i]);//执行函数
}
while(1);
}
完结。。 |