微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于自己写程序的问题

关于自己写程序的问题

时间:10-02 整理:3721RD 点击:
最近在写12864LCD 的 显示程序。
以前用并行通信,做出来了,但是这次改串行,写程序太难了。

通过这件事,我想问问高手,如何才能靠自己写出LCD驱动程序?
有哪些步骤,需要哪些资料呢?

(之前用并行的是拿别人的程序,改改IO口直接就用)

抽象,分层。

能否  具体一点?
请指教.

串行通信需要用到单片机的串行模块, 还要你要熟悉12864串行通信的要求,和 注意他的通信协议.....

其实,这个很简单嘛!lcd12864  or 12232 or  1602 都一样的,首先是显示器初始化的函数(主要为了设置显示要求的);
其次是   向显示器  写数据 ,,写命令的函数(一般情况下,他们是分开的,也就就是两个函数),最后就是;;设置显示位置的函数,和,,具体的显示函数(专门负责显示 的内容),,,,如果你是初学者,,建议不要自己写,,,何不先在网上找个程序,最好能显示的程序,,实验下,待试验后,,再进行专门研究下,看看显示器到底是如何工作的。这样会学的快些!
学的好!

#include<reg52.h>
sbit    LCD_A0   =  P2^2;    //control/data select signal
sbit    LCD_SCL  =  P2^3;    //serial data clock input
sbit    LCD_SI   =  P2^4;    //serial data input
typedef unsigned int  uint;
typedef unsigned char uchar;
//name: to send(write) one byte data or commade
//high bit first
void LCD_WR_BYTE(uchar bd)        //    8bit input
{   
uchar a;
     for(a=0;a<8;a++)
     {
             if(bd&0x80)
             {
                 LCD_SI=1;   
             }
             else
             {
                 LCD_SI=0;
             }
             bd<<=1;
         LCD_SCL=0;
         LCD_SCL=1;
         LCD_SCL=0;
         LCD_SI=0;
     }
}
void LCD_WR_DATA(uchar adat)      //DATA INPUT
{
uchar hd,ld;
LCD_A0=1; //H display data
LCD_WR_BYTE(0xfa);
hd=adat&0xf0;
ld=adat&0x0f;
ld<<=4;
LCD_WR_BYTE(hd);
LCD_WR_BYTE(ld);
}
void LCD_WR_COM(uchar acom)        /COMMAND INPUT
{
uchar hcm,lcm;
LCD_A0=0;  //L  control data
LCD_WR_BYTE(0xf8);
hcm=acom&0xf0;
lcm=acom&0x0f;
lcm<<=4;
LCD_WR_BYTE(hcm);
LCD_WR_BYTE(lcm);
}
void main()
{
uchar a;

   LCD_WR_DATA(0x30);         //DISPLAY     ‘0’
//  LCD_WR_COM(0x01);           //CLEAR ALL
  while(1);
}

今天参考网上资料,写出这个小程序。
但是我调试好久,最后显示结果仍然不正确。  求大哥大姐们帮我看看,通信有没有问题。没问题的话我自己再调试。
(我发现,发送的命令COM函数是无效的,发送的DATA可以显示,只是乱码)

   感谢大家解答我的问题。

给你一个作参考
/********************************************************************
* 文件名  : 串行12864显示.c
* 描述    :  该程序实现了12864以串行的方式进行通信。
             液晶上的R9。R10决定液晶的串行或者并行通讯方式。
             液晶上的PSB已经拉为高电平。如果使用串行,需要取掉R9。
* 版本号  : 2.0
***********************************************************************/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int
sbit CS=P2^5;            //片选信号
sbit SID=P2^6;                //数据信号
sbit SCLK=P2^7;                //时钟信号
sbit RST=P2^2;                //复位信号
sbit CH = P2^4;                //并行、串行选择信号
/********************************************************************
* 名称 : delay()
* 功能 : 延时,延时时间为 100us * t。这是通过软件延时,有一定误差。
* 输入 : t
* 输出 : 无
***********************************************************************/
void delay(unsigned int t)
{
        unsigned int i,j;
        for(i=0; i<t;  i++)
    for(j=0; j<10; j++);
}
/********************************************************************
* 名称 : sendbyte()
* 功能 : 按照液晶的串口通信协议,发送数据
* 输入 : zdata
* 输出 : 无
***********************************************************************/
void sendbyte(unsigned char zdata)
{
        unsigned int i;
        for(i=0; i<8; i++)
        {
                if((zdata << i) & 0x80)
                {
                        SID = 1;
                }
                else
                {
                        SID = 0;
                }
                SCLK = 0;
                SCLK = 1;
        }
}
/********************************************************************
* 名称 : write_com()
* 功能 : 写串口指令
* 输入 : cmdcode
* 输出 : 无
***********************************************************************/
void write_com(unsigned char cmdcode)
{
        CS = 1;
        sendbyte(0xf8);
        sendbyte(cmdcode & 0xf0);
        sendbyte((cmdcode << 4) & 0xf0);
        delay(2);
}
/********************************************************************
* 名称 : write_data()
* 功能 : 写串口指令
* 输入 : cmdcode
* 输出 : 无
***********************************************************************/
void write_data(unsigned char Dispdata)
{
        CS = 1;
        sendbyte(0xfa);
        sendbyte(Dispdata & 0xf0);
        sendbyte((Dispdata << 4) & 0xf0);
        delay(2);
}
/********************************************************************
* 名称 : lcdinit()
* 功能 : 初始化函数
* 输入 : cmdcode
* 输出 : 无
***********************************************************************/
void lcdinit()
{  
        RST = 0;
        delay(100);
        RST = 1;
        delay(20000);
        write_com(0x30);
        delay(50);
        write_com(0x0c);
        delay(50);
}
/********************************************************************
* 名称 : hzkdis()
* 功能 : 显示字符串
* 输入 : *s
* 输出 : 无
***********************************************************************/
void hzkdis(unsigned char code *s)
{  
        while(*s > 0)
    {
                write_data(*s);
                s++;
                delay(50);
    }
}
/********************************************************************
* 名称 : Test()
* 功能 : 显示子函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Test()
{  
        write_com(0x03);
        delay(50);   
        write_com(0x81);
        hzkdis("   MAC-51");
        write_com(0x91);
        hzkdis("单片机学习");
        write_com(0x89);
        hzkdis("          ");
        write_com(0x98);
        hzkdis("    串行通信");
}

/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main()
{
        CH = 0;
        delay(1);
        lcdinit();
        delay(10);
        while(1)
        {
                Test();
                delay(5000);
        }
}

感谢感谢

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top