pic18驱动5110,有背光但是没有显示,请大神看看程序是否有问题
如题,请大神们看看是不是程序的问题!
#include <pic18.h>
#include <stdio.h>
#include <stdlib.h>
#define uint unsigned int
#define uchar unsigned char
#define res PORTCbits.RC5
#define sce PORTCbits.RC4 //片选PORTAbits.RA0
#define dc PORTCbits.RC3 //1些数据,0写指令
#define sdin PORTCbits.RC6 //数据
#define sclk PORTCbits.RC7 //时钟
void LCD_init(void);
void init(void);
void LCD_write_byte(unsigned char dt,unsigned char command);
void delay(uint x);
void LCD_set_XY(unsigned char X,unsigned char Y);
void LCD_clear(void);
void LCD_write_char(unsigned char x,unsigned char y,unsigned char c);
void LCD_write_english_string(unsigned char X,unsigned char Y,char *s);
void main(void)
{
init();
LCD_init();//初始化LCD模块
LCD_clear();//清屏
while(1)
{
LCD_write_english_string(0,0," Welcome to ");
LCD_write_english_string(0,1," Amy studio ");
LCD_write_english_string(0,2,"amy-studio.com");
LCD_write_english_string(0,3," Nokia5110 LCD");
}
// while(1)
// {
// asm("CLRWDT");
// }
}
void init(void) //单片机初始化
{
asm("CLRWDT");
ADCON1=0x06;
TRISC=0x00;
PORTB=0x00;
}
void LCD_write_byte(unsigned char dt,unsigned char command)
{
unsigned char i;
sce = 0; //片选
dc = command; //1写数据,0写指令
for(i=0;i<8;i++) //循环传送8个bit
{
if(dt&0x80)
sdin=1;
else
sdin=0;
dt=dt<<1;
sclk = 0;
asm("CLRWDT");
asm("CLRWDT");
sclk=1; //在时钟上升沿采样
}
dc=1;
sce=1;
sdin=1;
}
void LCD_init(void) //LCD初始化
{
res=0;
delay(10);
res=1;
sce=0; //sce为高时,串行口被初始化。sce为高时忽略始时钟信号。
delay(10);
sce=1;
LCD_write_byte(0x21,0);//0b0010 0001LCD功能设置:芯片活动,水平寻址,使用扩展指令
LCD_write_byte(0xc6,0);//设置VOP值
LCD_write_byte(0x06,0);//温度校正
LCD_write_byte(0x13,0);//1:48
LCD_write_byte(0x20,0);//LCD功能设置:新品活动,水平寻址,使用基本指令
LCD_clear();
LCD_write_byte(0x0c,0);//设定显示配置:普通模式
sce=0;
}
void LCD_set_XY(unsigned char X,unsigned char Y)// 位置选择
{
LCD_write_byte(0x40|Y,0);
LCD_write_byte(0x80|X,0);
}
void LCD_clear(void) //清屏
{
unsigned char t;
unsigned char k;
LCD_set_XY(0,0);
for(t=0;t<6;t++)
{
for(k=0;k<84;k++)
{
LCD_write_byte(0x00,1);
asm("CLRWDT");
}
}
}
void LCD_write_char(unsigned char x,unsigned char y,unsigned char c)//写数据
{
unsigned char line;
c -= 32;
LCD_set_XY(x*6,y);
for(line=0;line<6;line++)
LCD_write_byte(font6x8[c][line],1);
}
void delay(uint x)//延时程序
{
uint a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
void LCD_write_english_string(unsigned char X,unsigned char Y,char *s)
{
LCD_set_XY(X,Y);
while(*s)
{
LCD_write_char(X,Y,*s);
s++;
}
}
大神何在!~
沉了啊啊啊
代码看着累,可以用论坛的代码编辑器插入,这样看着比较整洁。
- #include <pic18.h>
- #include <stdio.h>
- #include <stdlib.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define res PORTCbits.RC5
- #define sce PORTCbits.RC4 //片选PORTAbits.RA0
- #define dc PORTCbits.RC3 //1些数据,0写指令
- #define sdin PORTCbits.RC6 //数据
- #define sclk PORTCbits.RC7 //时钟
- void LCD_init(void);
- void init(void);
- void LCD_write_byte(unsigned char dt,unsigned char command);
- void delay(uint x);
- void LCD_set_XY(unsigned char X,unsigned char Y);
- void LCD_clear(void);
- void LCD_write_char(unsigned char x,unsigned char y,unsigned char c);
- void LCD_write_english_string(unsigned char X,unsigned char Y,char *s);
- void main(void)
- {
- init();
- LCD_init();//初始化LCD模块
- LCD_clear();//清屏
- while(1)
- {
- LCD_write_english_string(0,0," Welcome to ");
- LCD_write_english_string(0,1," Amy studio ");
- LCD_write_english_string(0,2,"amy-studio.com");
- LCD_write_english_string(0,3," Nokia5110 LCD");
- }
- // while(1)
- // {
- // asm("CLRWDT");
- // }
- }
- void init(void) //单片机初始化
- {
- asm("CLRWDT");
- ADCON1=0x06;
- TRISC=0x00;
- PORTB=0x00;
- }
- void LCD_write_byte(unsigned char dt,unsigned char command)
- {
- unsigned char i;
- sce = 0; //片选
- dc = command; //1写数据,0写指令
- for(i=0;i<8;i++) //循环传送8个bit
- {
- if(dt&0x80)
- sdin=1;
- else
- sdin=0;
- dt=dt<<1;
- sclk = 0;
- asm("CLRWDT");
- asm("CLRWDT");
- sclk=1; //在时钟上升沿采样
- }
- dc=1;
- sce=1;
- sdin=1;
- }
- void LCD_init(void) //LCD初始化
- {
- res=0;
- delay(10);
- res=1;
- sce=0; //sce为高时,串行口被初始化。sce为高时忽略始时钟信号。
- delay(10);
- sce=1;
- LCD_write_byte(0x21,0);//0b0010 0001LCD功能设置:芯片活动,水平寻址,使用扩展指令
- LCD_write_byte(0xc6,0);//设置VOP值
- LCD_write_byte(0x06,0);//温度校正
- LCD_write_byte(0x13,0);//1:48
- LCD_write_byte(0x20,0);//LCD功能设置:新品活动,水平寻址,使用基本指令
- LCD_clear();
- LCD_write_byte(0x0c,0);//设定显示配置:普通模式
- sce=0;
- }
- void LCD_set_XY(unsigned char X,unsigned char Y)// 位置选择
- {
- LCD_write_byte(0x40|Y,0);
- LCD_write_byte(0x80|X,0);
- }
- void LCD_clear(void) //清屏
- {
- unsigned char t;
- unsigned char k;
- LCD_set_XY(0,0);
- for(t=0;t<6;t++)
- {
- for(k=0;k<84;k++)
- {
- LCD_write_byte(0x00,1);
- asm("CLRWDT");
- }
- }
- }
- void LCD_write_char(unsigned char x,unsigned char y,unsigned char c)//写数据
- {
- unsigned char line;
- c -= 32;
- LCD_set_XY(x*6,y);
- for(line=0;line<6;line++)
- LCD_write_byte(font6x8[c][line],1);
- }
- void delay(uint x)//延时程序
- {
- uint a,b;
- for(a=x;a>0;a--)
- for(b=110;b>0;b--);
- }
- void LCD_write_english_string(unsigned char X,unsigned char Y,char *s)
- {
- LCD_set_XY(X,Y);
- while(*s)
- {
- LCD_write_char(X,Y,*s);
- s++;
- }
- }
asm("CLRWDT");有什么用?看门狗应该放在死循环中清零吧
可以将LCD的时序图也发出来。
说实话我其实不懂…这个我把它屏蔽掉了也是一样
是这个吗?程序我看了半天也没看出了头绪。这个程序我是从51那边改过来的
这条是看门狗计数器清零,建议你好好看LCD的操作时序,然后再看程序。不懂原理是看不懂程序的。
这仅仅是时序的一部分,肯定还有关于寄存器的说明。