打印

12864液晶显示字符表出问题了

[复制链接]
6580|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
爬山虎1234|  楼主 | 2013-3-7 15:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大虾好 小弟在做12864液晶显示字符表的时候遇到一个问题 就是最后一行的“while(1)”,如果不要,液晶显示字符,不停的刷新(初始化),但是加了while(1)之后,小弟认为应该停住啊,也就是一直显示字符 ,不会刷新了,但是下载程序之后,结果什么都不显示了。我就不知道什么原因了,各位大侠帮忙看看,谢谢。板子是郭天祥老师的TX-1C。
#include<reg52.h>
#include<intrins.h>
#include<stdlib.h>
#define uint unsigned int
#define ucha unsigned char
#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^6;            //关闭数码管位选
sbit dula=P2^7;            //关闭数码管段选
/******************************
//延时xms
******************************/
void delayms(uint x)  
{
while(x--)
{
  uint i;
  for(i=150;i>0;i--)
  {
   _nop_();
   _nop_();  
  }
}
}
/*********************************
//检查LCD是否忙
*********************************/
bit lcd_busy()
{                          
    bit result;
    LCD_RS = 0;
    LCD_RW = 1;
    LCD_EN = 1;
    delayms(1);
    result = (bit)(P0&0x80);
    LCD_EN = 0;
    return(result);
}
/**********************************
//写指令数据到LCD
//RS=L,RW=L,E=高脉冲,D0-D7=指令码
**********************************/
void write_cmd(ucha cmd)
{
while(lcd_busy());
LCD_RS=0;
LCD_RW=0;
LCD_EN=0;
P0=cmd;
delayms(1);
LCD_EN=1;
delayms(1);
LCD_EN=0;
}
/**********************************
//写显示数据到LCD
//RS=H,RW=L,E=高脉冲,D0-D7=数据
**********************************/
void write_dat(ucha dat)
{
while(lcd_busy());
LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
P0=dat;
delayms(1);
LCD_EN=1;
delayms(1);
LCD_EN=0;
}
/*************************
//LCD初始化
*************************/
void init_lcd()
{
LCD_PSB=1;         //并口方式
write_cmd(0x30);   //基本指令操作
delayms(1);
write_cmd(0x20);   //地址归位
delayms(1);
write_cmd(0x0c);   //显示开,关光标
delayms(1);
  write_cmd(0x01);   //清除LCD显示内容
delayms(2);
write_cmd(0x06);   //游标右移
delayms(1);
write_cmd(0x80);   //设定显示起始位置
}
/************************
//主函数
************************/
void main()
{
ucha i;
wela=0;
dula=0;
delayms(1);
init_lcd();
write_cmd(0x80);
for(i=0;i<16;i++)
  write_dat(0x00+i);
write_cmd(0x90);
for(i=0;i<16;i++)
  write_dat(0x10+i);
write_cmd(0x88);
for(i=0;i<16;i++)
  write_dat(0x20+i);
write_cmd(0x98);
for(i=0;i<16;i++)
  write_dat(0x30+i);
while(1);        //就是这个东东了      
}

相关帖子

沙发
爬山虎1234|  楼主 | 2013-3-7 15:06 | 只看该作者
自己顶个先

使用特权

评论回复
板凳
dirtwillfly| | 2013-3-7 15:14 | 只看该作者
本帖最后由 dirtwillfly 于 2013-3-7 15:25 编辑

你去看看他的视频,怎么讲的。http://dl.21ic.com/download/pcb-rar-ic-108871.html

使用特权

评论回复
地板
jdzhang1| | 2013-3-7 15:20 | 只看该作者

使用特权

评论回复
5
爬山虎1234|  楼主 | 2013-3-7 15:33 | 只看该作者
dirtwillfly 发表于 2013-3-7 15:14
你去看看他的视频,怎么讲的。http://dl.21ic.com/download/pcb-rar-ic-108871.html

这个是PCB视频啊 貌似以前看过 好像没有提到12864吧

使用特权

评论回复
6
爬山虎1234|  楼主 | 2013-3-7 15:34 | 只看该作者
dirtwillfly 发表于 2013-3-7 15:14
你去看看他的视频,怎么讲的。http://dl.21ic.com/download/pcb-rar-ic-108871.html

谢谢

使用特权

评论回复
7
爬山虎1234|  楼主 | 2013-3-7 15:43 | 只看该作者
dirtwillfly 发表于 2013-3-7 15:14
你去看看他的视频,怎么讲的。http://dl.21ic.com/download/pcb-rar-ic-108871.html

你好 随便请教一下 就是我要调试程序 比如单步执行 在液晶显示上就能实时的体现这条语句的执行结果,应该用什么软件呢,keil可以吗?谢谢

使用特权

评论回复
8
dirtwillfly| | 2013-3-7 15:53 | 只看该作者
爬山虎1234 发表于 2013-3-7 15:43
你好 随便请教一下 就是我要调试程序 比如单步执行 在液晶显示上就能实时的体现这条语句的执行结果,应该 ...

汗,我发错视频键接了么
学习51单片机,一般就是用KEIL
郭天祥有个教51的视频,就是用的KEIL

使用特权

评论回复
9
爬山虎1234|  楼主 | 2013-3-7 16:02 | 只看该作者
dirtwillfly 发表于 2013-3-7 15:53
汗,我发错视频键接了么
学习51单片机,一般就是用KEIL
郭天祥有个教51的视频,就是用的KEIL ...

嗯 我就是看他的视频现在在学习单片机,现在12864出的问题搞不懂了,大侠能否指点一二?还有就是我现在调程序嘛,比如单步执行一条指令 像清屏,执行完以后我马上就能在液晶上看到清屏的效果,液晶与指令同步显示的,而不用下载,上电什么的,keil可以嘛?对keil不太熟悉,应该怎么设置啊? 谢谢

使用特权

评论回复
10
CORDOR| | 2013-3-7 16:06 | 只看该作者
KEIL 也是可以的

使用特权

评论回复
11
爬山虎1234|  楼主 | 2013-3-7 16:09 | 只看该作者
CORDOR 发表于 2013-3-7 16:06
KEIL 也是可以的

你好 应该怎么设置 谢谢

使用特权

评论回复
12
爬山虎1234|  楼主 | 2013-3-7 16:20 | 只看该作者
CORDOR 发表于 2013-3-7 16:06
KEIL 也是可以的

你好 是不是烧写器的问题啊,现在用的是STC-ISP,keil是有单步执行但是这个STC必须要冷启动貌似

使用特权

评论回复
13
cher_ji| | 2013-3-7 16:52 | 只看该作者
最后那个while(1);  你把;去掉试试,分号让程序死在这里了

使用特权

评论回复
14
爬山虎1234|  楼主 | 2013-3-7 17:08 | 只看该作者
cher_ji 发表于 2013-3-7 16:52
最后那个while(1);  你把;去掉试试,分号让程序死在这里了

你好  我的本意就是让程序停在这里,前面的语句是显示字符表的,执行到while(1)停住,然后字符就会一直显示,不会刷新(初始化),但是现在加了“while(1);”结果什么都不显示了:L

使用特权

评论回复
15
储小勇_526| | 2013-3-8 09:05 | 只看该作者
难道不刷新就会一直显示?只玩过1602。。。。

使用特权

评论回复
16
爬山虎1234|  楼主 | 2013-3-8 09:40 | 只看该作者
dwh000 发表于 2013-3-8 08:19
51想仿真的话需要买仿真器,你那个是下载器,只能下载程序,不能单步调试!

哦 这个样子的说 懂了  谢谢

使用特权

评论回复
17
爬山虎1234|  楼主 | 2013-3-8 09:43 | 只看该作者
储小勇_526 发表于 2013-3-8 09:05
难道不刷新就会一直显示?只玩过1602。。。。

你好 个人觉得应该这样吧,写进去之后就让程序停住,没有覆盖,也没有清屏,现在加了while(1),什么都不显示了:L

使用特权

评论回复
18
zhaoyu2005| | 2013-3-8 10:19 | 只看该作者
先把液晶有关的地方的延时增大到原来的10倍甚至更长,然后再下载程序看看,目前看应该是没初始化好,或者命令执行时间不够。通常的12864液晶,驱动芯片的命令执行很慢,印象中有的命令超过10mS
因为是stc单片机,所以要注意指令速度,然后调整延时子程序

使用特权

评论回复
19
爬山虎1234|  楼主 | 2013-3-8 11:43 | 只看该作者
zhaoyu2005 发表于 2013-3-8 10:19
先把液晶有关的地方的延时增大到原来的10倍甚至更长,然后再下载程序看看,目前看应该是没初始化好,或者命 ...

嗯 好的 谢谢你

使用特权

评论回复
20
爬山虎1234|  楼主 | 2013-3-8 13:37 | 只看该作者
zhaoyu2005 发表于 2013-3-8 10:19
先把液晶有关的地方的延时增大到原来的10倍甚至更长,然后再下载程序看看,目前看应该是没初始化好,或者命 ...

你好  仔细看了看ST7920液晶驱动器的datasheet,按照资料上的初始化步骤,发现初始化的时候需要写两次选择基本指令集,上面程序只写了一次,还有不要地址归位指令,改掉以后,ok啦,:D  太兴奋了  

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

203

帖子

0

粉丝