21ic电子技术开发论坛 单片机与嵌入式系统 侃单片机论坛 [51mcu]12864+键盘 请教大神一下
发新帖我要提问
返回列表
打印

[51mcu]12864+键盘 请教大神一下

[复制链接]
1254|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
guizigu|  楼主 | 2013-7-19 21:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 guizigu 于 2013-7-19 21:12 编辑

/*
12864LCD (ST7920)驱动程序

*/

#include <REGx51.H>
  //引脚定义
#define CS    P2_0        //片选 高电平有效 单片LCD使用时可固定高电平
#define SID   P2_1        //数据
#define SCLK  P2_2        //时钟
#define PSB   P2_3        //低电平时表示用串口驱动,可固定低电平
#define RESET P2_4        //LCD复位,LCD模块自带复位电路。可不接
sbit K1=P1^4;
char flag=0;
unsigned char i;

void write(bit start, unsigned char ddata);
void sendbyte(unsigned char bbyte);
void delaynms(unsigned int di);
void lcdinit(void);
void lcdtest(void);
void lcdcls(void);
char key_detection();

unsigned char code ma[] ={"  汉字显示LCD   "};
unsigned char code ma2[]={"自带字库图文混排"};
unsigned char code ma3[]={"控制IC:ST7920  "};
unsigned char code ma4[]={"功能强大使用方便"};

/*初始化*/
void lcdinit(void)         
{
  delaynms(10); //启动等待,等LCM讲入工作状态
  PSB=0; ;            //串口驱动模式
  RESET=0; delaynms(1); RESET=1; // 复位LCD
  CS=1;
  write(0,0x30);  //8 位介面,基本指令集
  write(0,0x0c);  //显示打开,光标关,反白关
  write(0,0x01);  //清屏,将DDRAM的地址计数器归零  
}

/*写指令或数据*/
void write(bit start, unsigned char ddata) //写指令或数据
{
  unsigned char start_data,Hdata,Ldata;
  if(start==0) start_data=0xf8;         //写指令
    else       start_data=0xfa;  //写数据
  
  Hdata=ddata&0xf0;                  //取高四位
  Ldata=(ddata<<4)&0xf0;  //取低四位
  sendbyte(start_data);          //发送起始信号
  delaynms(5); //延时是必须的
  sendbyte(Hdata);              //发送高四位
  delaynms(1);  //延时是必须的
  sendbyte(Ldata);                  //发送低四位
  delaynms(1);  //延时是必须的
}

/*发送一个字节*/
void sendbyte(unsigned char bbyte) //发送一个字节
{
        unsigned char i;
        for(i=0;i<8;i++)
                   {
                           SID=bbyte&0x80; //取出最高位
                           SCLK=1;
                           SCLK=0;
                           bbyte<<=1; //左移
                   }  
}

/*延时*/
void delaynms(unsigned int di) //延时
{
        unsigned int da,db;
        for(da=0;da<di;da++)
        for(db=0;db<10;db++);
}

/*图形方式下屏幕全黑*/
void lcdtest(void)        //
{
        unsigned char i,j;
        for(i=0;i<32;i++)
            {
                          write(0,0x80+i);write(0,0x80);
                    for(j=0;j<16;j++) write(1,0xff);
                  }

         for(i=0;i<32;i++)
          {
            write(0,0x80+i);write(0,0x88);
                   for(j=0;j<16;j++) write(1,0xff);
          }
}

/*图形方式下清屏*/
void lcdcls(void)  //
{
        unsigned char i,j;
        for(i=0;i<32;i++)
        {
                write(0,0x80+i);write(0,0x80);
                    for(j=0;j<16;j++) write(1,0x00);
        }

        for(i=0;i<32;i++)
        {
                 write(0,0x80+i);write(0,0x88);
                    for(j=0;j<16;j++) write(1,0x00);
        }
}


/*按键检测*/
char key_detection()
{

          if(K1==0)   
    {
          delaynms(20);     
          if(K1==0)
                    flag++;               
        }
}

/*中断 产生显示变化*/
void T1ISR(void) interrupt 0
//void exter() interrupt 0
{

        switch(flag)
        {        
                 case 1:
                        write(0,0x80); for(i=0;i<16;i++)  write(1,ma);
                        break;
                case 2:
                        write(0,0x90); for(i=0;i<16;i++)  write(1,ma2);
                        break;
                case 3:
                        write(0,0x88); for(i=0;i<16;i++)  write(1,ma3);
                        break;
                case 4:
                        write(0,0x98); for(i=0;i<16;i++)  write(1,ma4);
                        break;                        
        }

}

/*主函数*/
void main(void)
{
//        EA=1;
//        ES=1;
//        IT0=1;
        //TMOD=0X01;
        //TR0=1;

        EA=1;
        EX0=1;
        IT0=1;
               
        lcdinit();
        
        while(1)
        {
                key_detection();
               
                 if(K1==0)
                {
                        write(0,0x36); //图形方式
                         lcdtest();
                         lcdcls();
                }
        }
}

想实现的功能很简单,就是按一下,显示一点内容.不知道是中断还是哪里出了问题,一直调不好.望高手指正一下.


相关帖子

沙发
水门王| | 2013-7-23 14:18 | 只看该作者
这个好像是锐志带的程序修改的,这个好像你从中改数都么有反映。自己找下12864的指令表把

使用特权

评论回复
板凳
woshiaokeman| | 2013-7-26 19:28 | 只看该作者
首先我觉得你应该先确保你的显示函数是对的。。不然这个一句句话看得看死人。。。

使用特权

评论回复
地板
NE5532| | 2013-7-26 21:22 | 只看该作者
写这么多再一起来调?我都不敢,不要说你了。

使用特权

评论回复
5
z755924843| | 2013-7-26 21:43 | 只看该作者
不行就用示波器 一个一个引脚的看波形。

使用特权

评论回复
6
限量_个性。| | 2013-7-26 21:56 | 只看该作者
楼主调程序时应该先调不加按键时在12864上显示出来 然后再加按键调  实在不行可以针对某个部分向大家求助  这样一堆代码  有点吓人呐  ~

使用特权

评论回复
7
guizigu|  楼主 | 2013-8-2 08:56 | 只看该作者
限量_个性。 发表于 2013-7-26 21:56
楼主调程序时应该先调不加按键时在12864上显示出来 然后再加按键调  实在不行可以针对某个部分向大家求助   ...

恩··自己慢慢来,谢谢了

使用特权

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

本版积分规则

1

主题

2

帖子

0

粉丝
关闭 热门推荐
快速回复 在线客服 返回列表 返回顶部