找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1914|回复: 1
打印 上一主题 下一主题
收起左侧

LCD12864问题?根据以下图片观点,我写的程序为什么不能运行?

[复制链接]
跳转到指定楼层
楼主
本帖最后由 king@ 于 2016-12-3 23:08 编辑

#include<reg52.h>
/* ***************************************************** */
// 起别名
/* ***************************************************** */
typedef unsigned char uChar8;
typedef unsigned int uInt16;
/* ***************************************************** */
// 字符串定义
/* ***************************************************** */
uChar8 code TAB1[]="  Hello 王勃    ";
uChar8 code TAB2[]="滕王阁序";
uChar8 code TAB3[]="落霞与孤鹜齐飞;";
uChar8 code TAB4[]="秋水共长天一色。";
/* ***************************************************** */
// 位定义
/* ***************************************************** */
sbit RS = P0^3;        //数据/命令选择端(H/L)
sbit RW = P0^2;        //数/写选择端(H/L)
sbit EN = P0^1;        //使能信号
/* ***************************************************** */
// 函数名称:DelayMS()
// 函数功能:延时毫秒数(ValMS)
// 入口参数:无
// 出口参数:无
/* ***************************************************** */
void DelayMS(uInt16 ValMS)
{
        uInt16 uiVal,ujVal;
        for(uiVal = 0; uiVal < ValMS; uiVal++)
                for(ujVal = 0; ujVal < 121; ujVal++);
}
/* ***************************************************** */
// 函数名称:DectectBusyBit()
// 函数功能:检测状态标志位(判断是忙/闲)
// 入口参数:无
// 出口参数:无
/* ***************************************************** */
void DectectBusyBit(void)
{   
        P3 = 0xff;                        // 读状态值时,先赋高电平                    
        RS = 0;
        RW = 1;
        EN = 1;
        DelayMS(1);
        while(P0 & 0x80);        // 若LCD忙,停止到这里,否则走起
        EN = 0;                                // 之后将EN初始化为低电平
}
/* ***************************************************** */
// 函数名称:WrComLCD()
// 函数功能:LCD写指令
// 入口参数:指令(ComVal)
// 出口参数:无
/* ***************************************************** */
void WrComLCD(uChar8 ComVal)
{
        DectectBusyBit();
        RS = 0;
        RW = 0;
        EN = 1;
        P3 = ComVal;
        DelayMS(1);
        EN = 0;        
}
/* ***************************************************** */
// 函数名称:WrDatLCD()
// 函数功能:LCD写数据
// 入口参数:数据(DatVal)
// 出口参数:无
/* ***************************************************** */
void WrDatLCD(uChar8 DatVal)
{
        DectectBusyBit();
        RS = 1;
        RW = 0;
        EN = 1;
        P3 = DatVal;
        DelayMS(1);
        EN = 0;        
}
/* ***************************************************** */
// 函数名称:PosLCD()
// 函数功能:输入定位
// 入口参数:无
// 出口参数:无
/* ***************************************************** */
void PosLCD(uChar8 X,uChar8 Y)
{
        uChar8 ucPos;
        if(X == 1)
        { X = 0x80; }                          //第一行
        else if(X == 2)
        { X = 0x90; }                          //第二行
        else if(X == 3)
        { X = 0x88; }                          //第三行
        else if(X == 4)
        { X = 0x98; }                        //第四行
        ucPos = X + Y;                        //计算地址
        WrComLCD(ucPos);                 //显示地址
}
/* ***************************************************** */
// 函数名称:LCD_Init()
// 函数功能:LCD初始化
// 入口参数:无
// 出口参数:无
/* ***************************************************** */
void LCD_Init(void)
{
        WrComLCD(0x30);            // 8位数据端口、选择基本指令
        DelayMS(10);
        WrComLCD(0x01);            // 显示清屏
        DelayMS(10);   
        WrComLCD(0x0C);            // 显示设定:整体显示、游标关、不反白
        DelayMS(10);
}
/* ***************************************************** */
// 函数名称:main()
// 函数功能:显示定义字符串
// 入口参数:无
// 出口参数:无
/* ***************************************************** */
void main(void)
{
        uChar8 ucVal;
        LCD_Init();
        DelayMS(5);
        PosLCD(1,0);                                // 选择第一行、第一列
        while(TAB1[ucVal] != '\0')
        {
                WrDatLCD(TAB1[ucVal]);
                ucVal++;
        }
        ucVal = 0;
        PosLCD(2,0);                                // 选择第二行、第一列
        while(TAB2[ucVal] != '\0')
        {
                WrDatLCD(TAB2[ucVal]);
                ucVal++;
        }
        ucVal = 0;
        PosLCD(3,0);                                // 选择第三行、第一列
        while(TAB3[ucVal] != '\0')
        {
                WrDatLCD(TAB3[ucVal]);
                ucVal++;
        }
        ucVal = 0;
        PosLCD(4,0);                                // 选择第四行、第一列
        while(TAB4[ucVal] != '\0')
        {
                WrDatLCD(TAB4[ucVal]);
                ucVal++;
        }
        while(1);
}

QQ截图20161203230057.png (11.63 KB, 下载次数: 61)

QQ截图20161203230057.png

QQ截图20161203230752.png (93.68 KB, 下载次数: 68)

QQ截图20161203230752.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:102056 发表于 2016-12-3 23:33 | 只看该作者
请问在protues里面的元件库里是否有 st7920这块12864的LCD元件,如果没有,在哪里可以找到?
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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