原创 lcd1602使用

2009-8-31 14:59 4538 7 16 分类: MCU/ 嵌入式

实际电路测试通过!仿真也有些效果!


玩过了数码管和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();
   }
}

PARTNER CONTENT

文章评论9条评论)

登录后参与讨论

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

有总线方式和模拟口线方式
相关推荐阅读
用户383241 2009-06-02 20:59
ADC LTC1865 的PROTEUS仿真
在PROTEUS的库文件中找到了这颗ADC,16BIT,感觉不错https://static.assets-stash.eet-china.com/album/old-resources/2009/4...
用户383241 2009-06-02 20:59
秀一下DIY的0-30V可调电源
0-30V可调...
用户383241 2009-04-05 10:24
盲人探路器(三)
本例介绍的盲人探路器(三)与前两例不同之处是采用廉价的红外线接近反射感测模块制成,这种电子手杖可以在1.5m的范围内感测到前方障碍物的位置,大大有利于盲人的出行。 工作原理盲人探路器(三)的电路如图所...
用户383241 2009-04-05 10:21
LED点阵屏电子钟
 ...
用户383241 2009-03-15 21:24
盲人探路器(二)
本例介绍的盲人探路器与上例不同之处有两点:一是采用全集成化结构;二是它的超声波发射电路以LM567中压控振荡器的振荡输出作为超声波发射器的振荡频率。这不仅省去了专设的振荡电路,而且更有利于电路的调整。...
EE直播间
更多
我要评论
9
7
关闭 站长推荐上一条 /3 下一条