刚开始做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 分
还是那个程序,我加上了config熔丝位定义,加上了晶振使用定义,再连接5110的时候,还是不行啊...
那位大神能指导一下,我该按照什么思路调试液晶屏呢,现在连这屏幕还能不能用都不知道了...
一周热门 更多>