OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 16961|回复: 10

求1602LCD实现动态数据显示,具有走数功能(c语言)

[复制链接]

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
发表于 2013-4-28 19:52:34 | 显示全部楼层 |阅读模式
求 1602LCD实现动态数据显示,具有走数功能
手艺人要内外兼修。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

126

主题

820

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2012-10-28
在线时间
62 小时
发表于 2013-4-28 19:58:16 | 显示全部楼层
 看看这个

液晶计数器.rar

9.76 KB, 下载次数: 2127

坚持学习!就能成功!
回复 支持 反对

使用道具 举报

126

主题

820

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2012-10-28
在线时间
62 小时
发表于 2013-4-28 19:59:22 | 显示全部楼层

/********************************************************************************
*  描述:                LCD1602 滚动显示                                       *
* 显示方式:                                                                   *
* 1、从左到右逐字显示,闪动二次,清屏。                                        *
* 2、再从右到左逐字显示,闪动二次,清屏。                                      *
* 3、周期性地重复上述显示方式。                                                *                           
********************************************************************************/

 #include <reg51.h> //51寄存器文件
 #include <intrins.h>
 
 typedef unsigned char BYTE; //用BYTE代替unsigned char
 typedef bit BOOL;  // 用BOOL代替bit
 
 sbit LCD_RS = P2^6;  //复位端           
 sbit LCD_RW = P2^5;  //写数据端
 sbit LCD_EP = P2^7;  //使能端
 
 BYTE code dis1[] = {"   WELCOME  TO   "};
 BYTE code dis2[] = {" WWW.PRECHIN.COM "};
 BYTE code dis3[] = {"   OT  EMOCLEW   "};
 BYTE code dis4[] = {" MOC.NIHCERP.WWW "};

/****************延时函数************************/ 
 delay(int ms)
 {                    //延时子程序
 int i;
 while(ms--)
 {
   for(i = 0; i< 250; i++)
   {
    _nop_();   //空执行
    _nop_();
    _nop_();
    _nop_();
   }
 }
 }

/****************侧忙函数************************/  
 BOOL lcd_bz()
 {                        
 BOOL result;
 LCD_RS = 0;
 LCD_RW = 1;
 LCD_EP = 1;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 result = (BOOL)(P0 & 0x80);  //检测P0最高位是否为1
 LCD_EP = 0;
 return result;//返回侧忙结果
 }

/****************写命令函数************************/ 
 lcd_wcmd(BYTE cmd)
 {                          // 写入指令数据到LCD
 while(lcd_bz());
 LCD_RS = 0;
 LCD_RW = 0;
 LCD_EP = 0;
 _nop_();
 _nop_();
 0 = cmd; //将8位指令通过P0口传给1602
 _nop_();
 _nop_(); //用于产生一个脉冲宽度
 _nop_();
 _nop_();
 LCD_EP = 1;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 LCD_EP = 0; 
 }
 
 lcd_pos(BYTE pos)
 {                          //设定显示位置
 lcd_wcmd(pos | 0x80);
 }

/****************写数据函数************************/ 
 lcd_wdat(BYTE dat)
 {                   //写入字符显示数据到LCD
 while(lcd_bz());
 LCD_RS = 1;
 LCD_RW = 0;
 LCD_EP = 0;
 0 = dat;  //将8位数据通过P0口传给1602
 _nop_();
 _nop_();   //用于产生一个脉冲宽度
 _nop_();
 _nop_();
 LCD_EP = 1;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 LCD_EP = 0;
 }
 
 lcd_init()
 {                   //LCD初始化设定
 lcd_wcmd(0x38);     //16*2显示,5*7点阵,8位数据
 delay(1);
 lcd_wcmd(0x0c);     //显示开,关光标
 delay(1);
 lcd_wcmd(0x06);     //移动光标
 delay(1);
 lcd_wcmd(0x01);     //清除LCD的显示内容
 delay(1);
 }

/****************主函数************************/ 
 main()
 {
     BYTE i;
     lcd_init();// 初始化LCD
     delay(10);
 
     while(1)             
    {
       lcd_wcmd(0x06);//向右移动光标
       lcd_pos(0);//设置显示位置为第一行的第1个字符
       i = 0;
      while(dis1[ i ] != '\0')
      {   //显示字符"WLCOME  TO"
        lcd_wdat(dis1[ i ]);
        i++;
        delay(30);//控制两字之间显示速度
      }
       lcd_pos(0x40);//设置显示位置为第二行第1个字符
       i = 0;
      while(dis2[ i ] != '\0')
      {
        lcd_wdat(dis2[ i ]);//显示字符" WWW.PRECHIN.COM  "
        i++;
        delay(30);//控制两字之间显示速度
      }
       delay(800);//控制停留时间
 
       lcd_wcmd(0x01);//清除LCD的显示内容
       delay(1);
       lcd_wcmd(0x04);//向左移动光标
     
       lcd_pos(15);//设置显示位置为第一行的第16个字符
       i = 0;
      while(dis3[ i ] != '\0')
      {                 //显示字符"WLCOME  TO"
        lcd_wdat(dis3[ i ]);
        i++;
        delay(30);          //控制两字之间显示速度
      }
       lcd_pos(0x4F);      //设置显示位置为第二行的第16个字符
       i = 0;
      while(dis4[ i ] != '\0')
      {
        lcd_wdat(dis4[ i ]);  //显示字符" WWW.PRECHIN.COM  "
        i++;
        delay(30);       //控制两字之间显示速度
      }
       delay(800);       //控制停留时间
 
       lcd_wcmd(0x01);   //清除LCD的显示内容
       delay(200);       //控制两屏转换时间
          
    }
 }
 
 

坚持学习!就能成功!
回复 支持 反对

使用道具 举报

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
 楼主| 发表于 2013-4-28 20:02:00 | 显示全部楼层
谢谢!非常感谢!
手艺人要内外兼修。
回复 支持 反对

使用道具 举报

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
 楼主| 发表于 2013-4-28 20:10:14 | 显示全部楼层
下载进去后,1602没有任何显示!
手艺人要内外兼修。
回复 支持 反对

使用道具 举报

126

主题

820

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2012-10-28
在线时间
62 小时
发表于 2013-4-28 20:11:23 | 显示全部楼层

注意IO口
坚持学习!就能成功!
回复 支持 反对

使用道具 举报

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
 楼主| 发表于 2013-4-28 20:20:12 | 显示全部楼层
哦,头晕了!谢谢!我试一试!
手艺人要内外兼修。
回复 支持 反对

使用道具 举报

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
 楼主| 发表于 2013-4-28 20:22:13 | 显示全部楼层
成功了!不过我是想要数字秒表类的,走数。
手艺人要内外兼修。
回复 支持 反对

使用道具 举报

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
 楼主| 发表于 2013-4-28 20:25:43 | 显示全部楼层
液晶计数器.rar (文件大小: 10 KB 下载次数:2次) ,下载后没有.c源文件,.hex文件打开之后什么也没有。
手艺人要内外兼修。
回复 支持 反对

使用道具 举报

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
 楼主| 发表于 2013-4-28 20:28:32 | 显示全部楼层
我觉得这个程序比较简单简短


#include <reg52.h>
#include <intrins.h> 

typedef unsigned char uint8;

sbit RS = 1^0 ;
sbit RW = 1^1 ;
sbit EN = 1^5 ;
sbit BUSY = 0^7;


unsigned char code word1[]={"Welcome to"};     
unsigned char code word2[]={"wuhan"};


/**
 * 等待繁忙标志,检测状态字stat7位是否繁忙?
*/
void wait(void)  //读命令函数,检测液晶硬件状态就是读取硬件状态,是命令函数。D7位=0时才可以往液晶写数据。
{
P0 = 0xFF;

do                       
        {                                                         
RS = 0;                                            
RW = 1;
EN = 0;
EN = 1;
}while (BUSY == 1); //当busy==1时,就不断执行do大括号的内容语句,直到busy即P0.7=0为止。
EN = 0;              //do大括号的内容语句:是1602“读状态”时序模式输入,输出的是D0-D7状态字。
}                          //执行完本句,P0口的每一位就反应出通过本程序读出的液晶当前状态。

/**
 * 写数据
*/
void w_dat(uint8 dat)
{
wait();
EN = 0;
P0 = dat;
RS = 1;
RW = 0;
EN = 1;
EN = 0;
}

/**
 * 写命令
*/
void w_cmd(uint8 cmd)
{
wait();
EN = 0;
P0 = cmd;
RS = 0;
RW = 0;
EN = 1;
EN = 0;
}

/**
 * 发送字符串到LCD
*/
void w_string(uint8 addr_start, uint8 *p)
{
w_cmd(addr_start);  //addr_start就是1602的0x80地址
while (*p != '\0')
{
w_dat(*p++);  //即把指针变量p所指向的内容(数组字符)按顺序逐个写到P0口!
}
}


/**
 * 初始化1602
*/
void Init_LCD1602(void)
{
w_cmd(0x38);  // 16*2显示,5*7点阵,8位数据接口
w_cmd(0x0C);  // 显示器开、光标开、光标允许闪烁
w_cmd(0x06);  // 文字不动,光标自动右移。此处只能是0x06!
w_cmd(0x01);  // 清屏
}


main()
{

Init_LCD1602();

w_string(0x80,word1); //把world1数组内容写到1602第一行,从第一位开始
w_string(0xC0,word2);  //把world2数组内容写到1602第二行地址起始位0xc0.即(0x80+0x40)=0xc0。

while (1);
}
手艺人要内外兼修。
回复 支持 反对

使用道具 举报

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
 楼主| 发表于 2013-4-28 20:30:12 | 显示全部楼层
请发一个走数(动态显示数字)的.c        谢谢!
手艺人要内外兼修。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 11:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表