实际电路测试通过!仿真也有些效果!
玩过了数码管和LED点阵后开始玩LCD
就从最简单的LCD1602开始
烧录IC太麻烦了,改用仿真
之前下过好几个版本的PROTEUS,不过没用起来,昨天又下了一个,网上下了个仿真的源文件,倒也蛮好用的。
找了半天的元件,终于把原理图画好了,
可是网上下的 程序改了一下后 LCD不显示,东改改,西改改,总算工作了
原理图:
程序如下,可以仿真
/******************************************************************************
产品名称: LCD1602 驱动
使用MCU: AT89S52
编译器: Keil
编译日期:
FOSC = 12MHZ
功能描述:
修改日期及内容:
******************************************************************************/
#include<reg52.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define TRUE 1
#define FALSE 0
#define data1602 P2 // 定义LCD1602数据接口
#define disp_dot 0x2e
#define disp_V 0x56
#define disp_A 0x41
#define disp_W 0x57
uchar code disp_code[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
uint voltage_data;
uint current_data;
sbit rs1602 = P1^5;
sbit rw1602 = P1^6;
sbit e1602 = P1^7;
/*******************************************************************************
函数名称:delay(uchar time)
功能描述:延时
调用函数:
输入:time
返回值:
*******************************************************************************/
void delay(uchar n)
{
uchar i;
for(;n>0;n--)
for(i=250;i>0;i--);
}
/******************************************************************************
函数名称: write_1602(uchar wdata)
功能描述: LCD1602写入数据
调用函数: delay()
写入值 : wdata
返回值 :
******************************************************************************/
void write_1602(uchar wdata)
{
data1602 = wdata;
rs1602 = 1;
rw1602 = 0;
e1602 = 1;
delay(4);
e1602 = 0;
}
/******************************************************************************
函数名称: write_order(uchar odata)
功能描述: LCD1602写命令
调用函数: delay()
写入值 : odata
返回值 :
******************************************************************************/
void write_order(uchar odata)
{
data1602 = odata;
rs1602 = 0;
rw1602 = 0;
e1602 = 1;
delay(4);
e1602 = 0;
}
/******************************************************************************
函数名称: init_1602()
功能描述: LCD1602初始化
调用函数: write_order(uchar odata)
写入值 :
返回值 :
******************************************************************************/
void init_1602(void)
{
write_order(0x01); // 清屏幕
write_order(0x38); // 数据长度为8位,双行显示,5*7字符
write_order(0x0c); // 打开显示开关,光标不闪烁
write_order(0x06); // 地址计数递增,显示屏不移动
}
/******************************************************************************
函数名称: position(uchar row,uchar colum)
功能描述: LCD1602写位置
调用函数: write_order()
写入值 : row,colum
返回值 :
******************************************************************************/
position(uchar row,uchar colum)
{
uchar pos;
if(row==1)
{
pos="0x80"+colum;
}
else
{
pos="0xC0"+colum;
}
write_order(pos);
}
/******************************************************************************
函数名称: write_byte(uchar *s)
功能描述: LCD1602字符串
调用函数: write_1602()
写入值 : *s
返回值 :
******************************************************************************/
write_byte(uchar *s)
{
for(;*s!='\0';s++)
{
write_1602(*s);
}
}
/******************************************************************************
函数名称: disp_voltage()
功能描述:
调用函数:
写入值 :
返回值 :
******************************************************************************/
void disp_voltage(void)
{
write_order(0x89);
write_1602(disp_code[voltage_data/1000]);
write_order(0x8a);
write_1602(disp_code[voltage_data%1000/100]);
write_order(0x8c);
write_1602(disp_code[voltage_data%1000%100/10]);
write_order(0x8d);
write_1602(disp_code[voltage_data%1000%100%10]);
}
/******************************************************************************
函数名称: disp_current()
功能描述: 显示电压
调用函数:
写入值 :
返回值 :
******************************************************************************/
void disp_current(void)
{
write_order(0xc9);
write_1602(disp_code[current_data/1000]);
write_order(0xcb);
write_1602(disp_code[current_data%1000/100]);
write_order(0xcc);
write_1602(disp_code[current_data%1000%100/10]);
write_order(0xcd);
write_1602(disp_code[current_data%1000%100%10]);
}
/******************************************************************************
函数名称: disp_data()
功能描述: 显示电压电流
调用函数:
写入值 :
返回值 :
******************************************************************************/
void disp_data(void)
{
write_order(0x01);
position(1,0);
write_byte("VOLTAGE=");
position(2,0);
write_byte("CURRENT=");
position(1,11);
write_1602(disp_dot);
position(1,15);
write_1602(disp_V);
position(2,10);
write_1602(disp_dot);
position(2,15);
write_1602(disp_A);
disp_voltage();
disp_current();
}
/******************************************************************************
函数名称: main()
功能描述: 主函数
调用函数:
写入值 :
返回值 :
******************************************************************************/
void main(void)
{
init_1602();
position(1,1);
write_byte("www.555diy.com");
position(2,5);
write_byte("ksysl");
delay(250);
delay(250);
delay(250);
delay(250);
write_order(0x01);
while(1)
{
disp_data();
}
}
tengjingshu_112148725 2009-4-5 10:35
用户383241 2009-4-1 19:37
用户144681 2009-4-1 18:05
用户1480039 2009-3-31 10:29
用户383241 2009-3-30 20:00
用户199512 2009-3-30 10:44
用户518079 2009-3-28 10:49
用户383241 2009-3-27 11:56
tengjingshu_112148725 2009-3-25 20:27