打印
[AVR单片机]

12864 串行驱动 显示 求大虾 帮!!!

[复制链接]
1329|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Black残|  楼主 | 2013-7-30 10:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
怎么在AVR128  上  显示不出东西来啊

#include "LCD12864.h"
#include <iom128v.h>
#include <macros.h>
#define  uchar unsigned char
#define  uint  unsigned int

#define RS  (1<<0)
#define RW  (1<<1)
#define EN  (1<<2)

void s_ms(uint ms)
{
        for(;ms>1;ms--);
}

uchar table4[]={"PSOC3 LCD12864"};
uchar table5[]={"Serial Driver"};
uchar table6[]={"kk5290122 write"};
uchar table7[]={"in 2013-01-13 "};

/*串行写数据到LCD*/
void LCD_Serial_Send_Data(uchar serial_data)
{

        uchar i,in_data;                        //
        in_data=0xfa;                                //发送写数据控制命令
        PORTC|=RS;                        //RS=1
        for(i=0;i<8;i++)                        //发送第1个字节,将8位控制命令由高到低1位1位的送到串行数据端
                {
                        PORTC&=~EN;        //EN=0
                        PORTC&=~RW;//RW=0
                        PORTC|=EN;        //EN=1
                        in_data=in_data<<1;        //数据左移1位
                }
        in_data=serial_data;                       
        in_data&=0xf0;                        //取要发送数据命令的高4位
        for(i=0;i<8;i++)                //发送第2个字节,将8位数据的高4位由高到低1位1位的送到串行数据端
                {
                        PORTC&=~EN;        //EN=0
                        PORTC&=~RW;//RW=0
                        PORTC|=EN;        //EN=1
                        in_data=in_data<<1;        //数据左移1位
                }
        in_data=serial_data;                //
        in_data<<=4;                                //左移4位,取要发送数据命令的低4位
        for(i=0;i<8;i++)                //发送第3个字节,将8位数据的低4位由高到低1位1位的送到串行数据端
                {
                        PORTC&=~EN;        //EN=0
                        PORTC&=~RW;//RW=0
                        PORTC|=EN;        //EN=1
                        in_data=in_data<<1;        //数据左移1位
                }
        PORTC|=RS;                        //RS=1
        s_ms(10);                                //延时10ms
}

/*串行写指令到LCD*/
void LCD_Serial_Send_Command(uchar serial_cmd)
{
        uchar i,in_data;                        //
        in_data=0xf8;                                //发送写指令控制命令
        PORTC&=~RS;                        //RS=0
        for(i=0;i<8;i++)                        //发送第1个字节,将8位控制命令由高到低1位1位的送到串行数据端
                {
                        PORTC&=~EN;        //EN=0
                        PORTC&=~RW;//RW=0
                        PORTC|=EN;        //EN=1
                        in_data=in_data<<1;        //数据左移1位
                }
        in_data=serial_cmd;                       
        in_data&=0xf0;                                //取要发送指令命令的高4位
        for(i=0;i<8;i++)                //发送第2个字节,将8位指令数据的高4位由高到低1位1位的送到串行数据端
                {
                        PORTC&=~EN;        //EN=0                       
                        PORTC&=~RW;//RW=0
                        PORTC|=EN;        //EN=1
                        in_data=in_data<<1;        //数据左移1位
                }
        in_data=serial_cmd;                        //
        in_data<<=4;                                //左移4位,取要发送指令命令的低4位
        for(i=0;i<8;i++)                //发送第3个字节,将8位指令数据的低4位由高到低1位1位的送到串行数据端
                {
                        PORTC&=~EN;        //EN=0       
                        PORTC&=~RW;//RW=0
                        PORTC|=EN;        //EN=1
                        in_data=in_data<<1;        //数据左移1位
                }
        PORTC&=~RS;                        //RS=0                       
        s_ms(10);                                //延时10ms
}

void LCD_Init(void)
{
        LCD_Serial_Send_Command(0x30);        //基本指令操作
        s_ms(5);
        LCD_Serial_Send_Command(0x0c);        //显示开,关光标
        s_ms(5);
        LCD_Serial_Send_Command(0x01);        //清除液晶显示
        s_ms(5);
}

void main(void)
{
        uchar        i;
        DDRA=0xff;
        PORTA=0xff;
        DDRC=0xff;
        PORTC=0xff;
        DDRD=0xff;
        PORTD=0x00;
       
        s_ms(1000);                                //延时1s
        LCD_Init();
       
    for(;;)
    {
//设置液晶第1行的显示内容
                 LCD_Serial_Send_Command(0x80);
                 i=0;
                 while(table4[i]!='\0')
                 {
                         LCD_Serial_Send_Data(table4[i]);
                        i++;
                 }
//设置液晶第2行的显示内容
                 LCD_Serial_Send_Command(0x90);
                 i=0;
                 while(table5[i]!='\0')
                 {
                         LCD_Serial_Send_Data(table5[i]);
                        i++;
                 }
//设置液晶第3行的显示内容
                 LCD_Serial_Send_Command(0x88);
                 i=0;
                 while(table6[i]!='\0')
                 {
                         LCD_Serial_Send_Data(table6[i]);
                        i++;
                 }

//设置液晶第4行的显示内容
                 LCD_Serial_Send_Command(0x98);
                 i=0;
                 while(table7[i]!='\0')
                 {
                         LCD_Serial_Send_Data(table7[i]);
                        i++;
                 }
                 while(1);
    }       
}






相关帖子

沙发
qin552011373| | 2013-7-30 18:01 | 只看该作者
液晶设置以及初始化的正确吗

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
Black残 + 2 淡定
板凳
Black残|  楼主 | 2013-7-30 19:56 | 只看该作者
qin552011373 发表于 2013-7-30 18:01
液晶设置以及初始化的正确吗

没问题的

使用特权

评论回复
地板
Black残|  楼主 | 2013-7-31 20:41 | 只看该作者
自己写出来了   给大家分享一下吧!
#include <iom128v.h>
#include <macros.h>

#define uchar unsigned char
#define uint unsigned int
void delay_us(uint us)
{
    uint i,j;
        for(i=0;i<us;i++);
}
void LCD12864_Send(uchar Data_Command)
{
        uchar i,Save_Data_Command;
       
        PORTC|=BIT(0);                          //CS为高电平,使能CS
       
        for(i=0;i<8;i++)
        {
                if((Data_Command & 0x80)!=0)        //发送的是1
                        PORTC|=BIT(1);                  //SID为高电平
                else
                        if(((Data_Command & 0x80)==0))  //发送的是0
                                PORTC&=(~BIT(1));           //SID为低电平
               
               
                PORTC|=BIT(2);                      //SCLK为高电平
                PORTC&=(~BIT(2));                   //SCLK为低电平
               
                Data_Command<<=1;                   //完成一次发送后数据左移一位,等待第二次发送       
        }
       
        PORTC&=(~BIT(0));                       //CS为低电平,失能CS
}
void LCD12864_Write_Data(uchar Data)
{
        uchar Save_Data_1,Save_Data_2;
       
        Save_Data_1=Data & 0xf0;        //数据前四位
        Save_Data_2=(Data & 0x0f)<<4;   //数据后四位
       
        LCD12864_Send(0xfa);            // 发送第一固定字节数据指令
        LCD12864_Send(Save_Data_1);     // 发送数据前四位
        LCD12864_Send(Save_Data_2);     // 发送数据后四位       
}
void LCD12864_Write_Command(uchar Command)
{
        uchar Save_Command_1,Save_Command_2;
       
        Save_Command_1=Command & 0xf0;        //命令前四位
        Save_Command_2=(Command & 0x0f)<<4;   //命令后四位
       
        LCD12864_Send(0xf8);                  // 发送第一固定字节命令指令
        LCD12864_Send(Save_Command_1);        // 发送命令前四位
        LCD12864_Send(Save_Command_2);        // 发送命令后四位       
}
void LCD12864_Display(uchar x,uchar y,uchar *p)
{
        if(x==1)
                x=0;
        else
                if(x==2)
                        x=2;
                else
                        if(x==3)
                                x=1;
                        else
                                if(x==4)
                                        x=3;
                                       
        LCD12864_Write_Command(0x80+8*x+(y-1));
       
        while(*p)
        {
                LCD12864_Write_Data(*p);
                p++;
        }       
}
void LCD12864_Init(void)
{
    delay_us(100);                      //1us*参数,30ms
        LCD12864_Write_Command(0x01);      //清屏指令
    delay_us(1);                      //1us*参数,1ms
        LCD12864_Write_Command(0x06);      //进入设定点,游标右移指令
    delay_us(70);                      //1us*参数,70us
        LCD12864_Write_Command(0x0c);      //显示开指令
    delay_us(70);                      //1us*参数,70us
}

void main(void)
{
    DDRC|=(BIT(0)|BIT(1)|BIT(2));
        PORTC&=((~BIT(0))&(~BIT(1))&(~BIT(2)));
       
        delay_us(100);
        LCD12864_Init();
        delay_us(100);
        LCD12864_Display(1,1,"hello");
        //while(1);
}

使用特权

评论回复
5
Black残|  楼主 | 2013-7-31 20:44 | 只看该作者
求大家  回复一下嘛   我好放分结贴

使用特权

评论回复
6
qin552011373| | 2013-7-31 21:30 | 只看该作者
唔满意贴结贴

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
shenpingbing + 3 很给力!
7
2318809119| | 2013-8-31 07:55 | 只看该作者
不对,而且写的很乱很复杂。

使用特权

评论回复
8
飞言走笔| | 2013-8-31 08:28 | 只看该作者
一点一点的试啊,别一下子整这么多

使用特权

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

本版积分规则

3

主题

29

帖子

0

粉丝