pic与液晶屏nokia5110的问题?~~ 小白求教~~

2019-07-16 00:29发布

刚开始做pic,因为要弄ad转换所以先要给pic加上一块液晶屏,翻出来去年买的nokia5110准备装上去,结果液晶屏自带的驱动程序放pic上就不好用了,不知道是因为pic和51区别太大了? 还是我的程序写错了啊。向各路大神求助,走过路过帮帮小弟吧~~
以下是程序:
#include<P24FJ64GB004.h>
//#include<english_6x8_pixel.h>

#define uchar unsigned char
#define uint unsigned int

#define Dout 0
#define Din 1

#define LCD_RST PORTCbits.RC9
#define LCD_CE PORTCbits.RC8
#define LCD_DC PORTCbits.RC7
#define LCD_DIN PORTCbits.RC6
#define LCD_CLK PORTCbits.RC5


/*************************************************
* 名称:Delay_us(uint t)
* 作用:微秒延时函数
* 输入:t,延时时长
* 输出:无
*************************************************/
void Delay_us(uint t){
        uchar i,j;
        for(i=0;i<t;i++)
                for(j=0;j<3;j++);
}               

/*************************************************
* 名称:Delay_ms(uint t)
* 作用:毫秒延时函数
* 输入:t,延时时长
* 输出:无
*************************************************/
void Delay_ms(uint t){
                uchar i,j,k;
                for(i=0;i<t;i++)
                        for(j=0;j<13;j++)
                                for(k=0;k<243;k++);
}               

/*************************************************
* 名称:LCD_write_byte(dat,comd)
* 作用:向LCD写入一个字节数据
* 输入:dat数据内容,comd数据类型
* 输出:无
*************************************************/
void LCD_write_byte(uchar dat,uchar comd){    //向PCD8544写入一个字节
        uchar i;
        LCD_CE=0;                                                //使能LCD串行接口,开始数据传输
       
        if(comd == 0)                                                //选择数据类型
                LCD_DC=0;                                                //C/D位为低电平,输入控制命令/显示地址
        else
                LCD_DC=1;                                                //C/D位为高电平,输入显示内容

        for(i=0;i<8;i++){
                LCD_CLK = 1;                                //8位循环,按字节写入LCD
                if(dat & 0x80)
                        LCD_DIN = 1;
                else
                        LCD_DIN = 0;
                LCD_CLK = 0;       
                                        //控制LCD时钟
                dat = dat << 1;
               
        }

        LCD_CE=1;                                                //关闭LCD串行接口,数据传输结束
}       

/*************************************************
* 名称:LCD_clear()
* 作用:LCD液晶屏幕清屏
* 输入:无
* 输出:无
*************************************************/
void LCD_clear(void){
        uint i;
       
        LCD_write_byte(0x0c,0);
        LCD_write_byte(0x80,0);

        for(i=0;i<504;i++)
                LCD_write_byte(0,1);
}

/*************************************************
* 名称:LCD_init()
* 作用:初始化LCD
* 输入:无
* 输出:无
*************************************************/
void LCD_init(){
        LCD_RST = 0;                                        //向LCD_RST发送一个低电平,使LCD复位
                Delay_ms(1);
        LCD_RST = 1;
       
        LCD_CE = 0;                                                //使能LCD串行输入
                Delay_ms(1);
        LCD_CE = 1;                                                //关闭LCD串行输入,LCD串行接口初始化
                Delay_ms(1);

        LCD_write_byte(0x21,0);                        //开始向LCD写入控制命令//使用扩展命令控制LCD模式
        LCD_write_byte(0xc8,0);                        //设置偏置电压
        LCD_write_byte(0x06,0);                        //温度校正
        LCD_write_byte(0x13,0);                        //1:48
        LCD_write_byte(0x20,0);                        //使用基本命令
        LCD_clear();                                        //清屏
        LCD_write_byte(0x0c,0);                        //设定显示模式,正常显示

        LCD_CE = 0;                                                //关闭LCD串行输入接口
}
       
/*************************************************
* 名称:LCD_write_char(uchar c)
* 作用:在当前地址上(上一次写入地址进1,或默认起始地址,0x00)向LCD写入一个字符
* 输入:写入字符内容(在芯片字库中相应代码)
* 输出:无
*************************************************/
void LCD_write_char(uchar c){

        LCD_write_byte(c,1);
}       

/*************************************************
* 名称:LCD_set_xy(uchar x,uchar y)
* 作用:设定光标位置(x,y)
* 输入:x,y,坐标位置
* 输出:无
*************************************************/
void LCD_set_xy(uchar x,uchar y){
        LCD_write_byte(0x40 | x,0);                //设定行坐标
        LCD_write_byte(0x80 | y,0);                //设定列坐标
}       

/*************************************************
* 名称:LCD_write_string_en(uchar x,uchar y,char *s)
* 作用:向指定位置(x,y)写入一串英文字符
* 输入:x,y,(写入坐标),写入字符串内容(在芯片字库中相应代码)
* 输出:无
*************************************************/
void LCD_write_string_en(uchar x,uchar y,char *s){
        LCD_set_xy(x,y);

        while(*s){
                LCD_write_char(*s);
                s++;
        }
}       

/*************************************************
* 名称:main()
* 作用:主函数
* 输入:无
* 输出:无
*************************************************/
int main(void){
        //OSCCONbits.COSC=0b010;
        LCD_RST=1;       
        TRISCbits.TRISC5 = Dout;
        TRISCbits.TRISC6 = Dout;
        TRISCbits.TRISC7 = Dout;
        TRISCbits.TRISC8 = Dout;
        //TRISCbits.TRISC9 = Dout;
        Delay_ms(50);
        LCD_init();
        LCD_write_byte(0x07,1);
       

}
另外附上5110驱动芯片的中文资料手册,话说着屏真的挺好,如果没出程序问题的话,分辨率够高,还挺经济,这次如果能驱这块屏,一定要多淘一点~




驱动芯片PCD8544中文数据手册.pdf 下载积分: 积分 -1 分
753.32 KB, 下载次数: 13, 下载积分: 积分 -1 分
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。