原创 12864画点程序

2010-6-15 09:22 4747 7 8 分类: MCU/ 嵌入式

只是在前一个驱动程序上加了俩子函数。


#include <reg52.h>
#include <intrins.h>
#include <math.h>
//------------定义接口-------------//
sbit RS="P2"^5 ;
sbit RW="P2"^6 ;
sbit E="P2"^7 ;
sbit RES="P2"^1 ;
#define Lcd_Bus P1
// P1 接 LCM
#define uchar unsigned char
#define FIRST_ADDR 0
//定义字符/汉字显示起始位置
/*------------------检查忙位-----------------------------*/
void chk_busy()
{
    RS="0" ;
    RW="1" ;
    E="1" ;
    Lcd_Bus=0xff ;
    while((Lcd_Bus&0x80)==0x80);
    E="0" ;
}
/*------------------延时子程序-----------------------------*/
void delay(unsigned int t)
{
    unsigned int i,j ;
    for(i=0;i<t;i++)
    for(j=0;j<10;j++);
}


/*------------------写命令到LCD------------------------------*/
void write_com(unsigned char cmdcode)
{
    chk_busy();
    RS="0" ;
    RW="0" ;
    E="1" ;
    Lcd_Bus=cmdcode ;
    delay(5);
    //------------------在数据写入的时候加入适当的延时
    E="0" ;
    delay(5);
}


/*-------------------写数据到LCD----------------------------*/
void write_data(unsigned char Dispdata)
{
    chk_busy();
    RS="1" ;
    RW="0" ;
    E="1" ;
    Lcd_Bus=Dispdata ;
    delay(5);
    //------------------在数据写入的时候加入适当的延时
    E="0" ;
    delay(5);
}
/*------------------初始化LCD屏--------------------------*/
void lcdreset()
{
    delay(2000);
    write_com(0x30);
    delay(10);
    //选择基本指令集
    write_com(0x30);
    //选择8bit数据流
    delay(5);
    write_com(0x0c);
    //开显示(无游标、不反白)
    delay(10);
    write_com(0x01);
    //清除显示,并且设定地址指针为00H
    delay(500);
    write_com(0x06);
    //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位
    delay(0);
}
/*------------------显示字符串--------------------------*/
void hzkdis(unsigned char code*s)
{
    while(*s>0)
    {
        write_data(*s);
        s++;
        delay(50);
    }
}
/*------------------首屏显示--------------------------*/
void ceshi()
{
    write_com(0x01);
    //清除显示,并且设定地址指针为00H
    delay(5);
   
    write_com(0x80);
    //第一行(如果是地址是:80H,即LCD的第一行的第一个位置显示)
    hzkdis("中国计量学院");
   
    write_com(0x90);
    //第二行(如果是地址是:90H,即LCD的第二行的第一个位置显示)
    hzkdis("光电学院");
   
    write_com(0x88);
    //第三行(如果是地址是:88H,即LCD的第二行的第一个位置显示)
    hzkdis("06光信2");
   
    write_com(0x98);
    //第四行(如果是地址是:98H,即LCD的第二行的第一个位置显示)
    hzkdis("测试程序");
}
//------------------清整个GDRAM空间----------------------------
void clrgdram()
{
    unsigned char x,y ;
    for(y=0;y<64;y++)
    for(x=0;x<16;x++)
    {
        write_com(0x34);
        write_com(y+0x80);
        //行地址
        write_com(x+0x80);
        //列地址
        write_com(0x30);
        write_data(0x00);
        write_data(0x00);
    }
}
//------------------------------------------------------------
void clrscreen()
{
    write_com(0x01);
    delay(10);
}
unsigned char ReadByte(void)
{
    unsigned char byReturnValue ;
    chk_busy();
    Lcd_Bus=0xff ;
    RS="1" ;
    RW="1" ;
    E="0" ;
    E="1" ;
    byReturnValue="Lcd"_Bus ;
    E="0" ;
   
    return byReturnValue ;
}


//增加画点子程序
void DrawPoint(unsigned char X,unsigned char Y,unsigned char Color)
{
    unsigned char Row,Tier,Tier_bit ;
    unsigned char ReadOldH,ReadOldL ;
    write_com(0x34);
    write_com(0x36);
    Tier="X">>4 ;
    Tier_bit=X&0x0f ;
    if(Y<32)
    {
        Row="Y" ;
    }
    else
    {
        Row="Y-32" ;
        Tier+=8 ;
    }
    write_com(Row+0x80);
    write_com(Tier+0x80);
    ReadByte();
    ReadOldH="ReadByte"();
    ReadOldL="ReadByte"();
    write_com(Row+0x80);
    write_com(Tier+0x80);
    if(Tier_bit<8)
    {
        switch(Color)
        {
            case 0 :
            ReadOldH&=(~(0x01<<(7-Tier_bit)));
            break ;
            case 1 :
            ReadOldH|=(0x01<<(7-Tier_bit));
            break ;
            case 2 :
            ReadOldH^=(0x01<<(7-Tier_bit));
            break ;
            default :
            break ;
        }
        write_data(ReadOldH);
        write_data(ReadOldL);
    }
    else
    {
        switch(Color)
        {
            case 0 :
            ReadOldL&=(~(0x01<<(15-Tier_bit)));
            break ;
            case 1 :
            ReadOldL|=(0x01<<(15-Tier_bit));
            break ;
            case 2 :
            ReadOldL^=(0x01<<(15-Tier_bit));
            break ;
            default :
            break ;
        }
        write_data(ReadOldH);
        write_data(ReadOldL);
    }
    write_com(0x30);
}
void main(void)
{
    uchar i,j,colour=1 ;
    // uint ADzhi;
    RW="0" ;
    lcdreset();
    ceshi();
    clrgdram();
    delay(5000);
    clrscreen();
    for(i=4;i<124;i++)
    {
         j="35-27"*sin((i-4)*3.14/30);
        //正弦波显示
         DrawPoint(i,j,colour);
       
    }
    delay(5000);
    while(1);
   
}

文章评论1条评论)

登录后参与讨论

用户377235 2013-6-22 10:46

用不了啊

13510179723_912348475 2012-7-27 23:24

楼上分析得有道理。怎么能用两个电阻分压出来的5V驱动线圈!

用户1548781 2012-7-27 09:25

想了下,会不会可能是下面几个问题:1、呼叫信号的驱动能力太弱;2、呼叫信号到来时驱动信号线的电平可能是变化波形,而不是保持一段时间的高电平;3、用两个电阻分压出来的5V来驱动线圈这个应该是不行的吧(电阻特别小除外);4、主板坏了可能是因为继电器线圈突然断电产生的感应电压把主板上的某部件击穿了。是不是可以这样,先确定下信号线有无呼叫时的信号形式,若是PWM波类似的信号,可在信号线和地之间加一个电容,然后信号线接一个三极管基极,三极管E和C极接开锁信号的两端(C接高电平的那端),把继电器省去。 没测试过,随便写写,希望有用,呵呵~

用户403664 2012-7-23 10:35

哈哈,估计你要进“必须紧密关注的捣蛋同学”黑名单了

13510179723_912348475 2012-7-21 23:39

根本打不开门。我失望地回到寝室听到一个更让人失望的消息:隔壁室友说楼下门禁系统的主板坏了,他亲自问的那个师傅。希望不是我搞坏的。呵呵!
相关推荐阅读
用户196131 2010-06-03 09:20
如何使用电烙铁
在电子制作中,元器件的连接处需要焊接。焊接的质量对制作的质量影响极大。所以,学习电于制作技术,必须掌握焊接技术,练好焊接基本功。一、焊接工具1、电烙铁电烙铁是最常用的焊接工具。我们使用20W内热式电烙...
用户196131 2010-05-06 20:26
74HC595驱动程序
74HC595时序图如下#include <reg52.h>       //52芯片管脚定义头文件#include <intrins.h> //内部包含延时函数 _nop_(...
用户196131 2010-04-28 16:05
阳历转阴历的程序
这两天在做一个万年历,需要显示阴历内容,需要知道阴历和阳历之间的计算关系,在网上找了程序,做了一些调整,现在已经测试成功了。bit c_moon;data uchar year_moon,month_...
用户196131 2010-04-26 16:04
六维空间
六维空间(http://bt.neu6.edu.cn/)于08年9月7日成立,取IPv6中“v6”的谐音,代表新的协议和下载体验,也寓意论坛包容各方优秀资源。目前论坛的各种资源,尤其是高清资源不断丰富...
用户196131 2010-04-17 09:15
牛人做的摩托车
 牛人用废弃的元件做的摩托车给大家欣赏一下!...
我要评论
1
7
关闭 站长推荐上一条 /2 下一条