[PIC®/AVR®/dsPIC®产品]

pic18f66k80驱动LCM12864R疑问

[复制链接]
800|3
手机看帖
扫描二维码
随时随地手机跟帖
渔夫的烟斗|  楼主 | 2017-8-25 19:36 | 显示全部楼层 |阅读模式
本帖最后由 渔夫的烟斗 于 2017-8-25 19:39 编辑

MAIN.C
/*
* File:   main.c
* Author: Administrator
*
* Created on 2017?8?23?, ??4:38
*/

#pragma config FOSC=HS1
#pragma config WDTEN=OFF
#pragma config PLLCFG = OFF
#include <xc.h>
#include "delay.h"
#include "lcd.h"
#include "port.h"
#include <pic18f66k80.h>

char ta[]={"================"};
void main(void)
{
   
   
    port();
    PORTG=0X00;
    PORTB=0X00;
    rst=1;
   LcdInit();
//   
    while(1)
    {
//  sendByte(0xaa);
//        sendCom(0x81);
//        LcdInit();
//         position(1,1);
//         position(1,2);
//         position(1,3);
//         position(1,4);
//        sendCom(0x55);
        position(1,1);
       LcdString("dddddd");
                position(2,1);
       sendDat('H');
               
       delay5ms(100);
         
    }
}

LCD.H
/* 
* File:   LCD.c
* Author: Administrator
*
* Created on 2017?8?3?, ??9:10
*/

#include <stdio.h>
#include <stdlib.h>
#include "lcd.h"
#include "port.h"
void sendByte(char send)
{
    char n;
    for(n=0;n<8;n++)
    {
        slk=1;
        if((send&0x80)==0x80)
            sid=1;
        else
            sid=0;
        delay25us(1);
        slk=0;
        delay25us(1);
        send=send<<1;
        
    }
   
  

}
void sendCom(char com)
{
  
    char comh,coml;
    comh=com&0xf0;
    coml=((com&0x0f)<<4);
    cs=1;
    sendByte(0xf8);
   
    sendByte(comh);
   
    sendByte(coml);
    delay25us(16);
    cs=0;
   
}
void sendDat(char dat)
{   
   
    char dath,datl;
    dath=dat&0xf0;
    datl=((dat&0x0f)<<4);
    cs=1;
    sendByte(0xfa);
   
    sendByte(dath);
   
    sendByte(datl);
    delay25us(16);
    cs=0;
   

}
void position(char x,char y)
{
    char pos;
    if(x==1)
        pos=0x80+y;
    if(x==2)
        pos=0x90+y;
    if(x==3)
        pos=0x88+y;
    if(x==4)
        pos=0x98+y;
     sendCom(pos);


}
void LcdInit()
{
   
    psb=0;
   
    rst=1;
    sendCom(0x30);
    sendCom(0x0c);
   
   
        sendCom(0x01);
    delay25us(10);
        sendCom(0x02);
        sendCom(0x06);
        sendCom(0x0c);
        sendCom(0x14);
   

}
void LcdString(char *p)
{
        while(*p!='\0')
        {
                sendDat(*p);
                p++;
        }


}

DELAY.H
/* 
* File:   delay.c
* Author: Administrator
*
* Created on 2017Äê8ÔÂ3ÈÕ, ÉÏÎç9:11
*/

#include "DELAY.h"
void delay25us(char aa)
{
    char i;
    while(aa--)
        
                for(i=0;i<40;i++);

}
void delay10us(char cc)
{
    char i;
    while(cc--)
        
                for(i=0;i<16;i++);

}
void delay5ms(int bb)
{
    int i;
    while(bb--)
        
                for(i=0;i<800;i++);//400-->2.5MS


}

PORT.H
/* 
* File:   port.h
* Author: Administrator
*
* Created on 2017?8?23?, ??4:39
*/

#ifndef PORT_H
#define        PORT_H
#include <pic18f66k80.h>
#define cs LATGbits.LATG0
#define sid LATGbits.LATG1
#define slk LATGbits.LATG2
#define psb LATGbits.LATG3
#define rst LATBbits.LATB0


void port();



#endif        /* PORT_H */

大体上代码就是如上,这个代码在STC单片机上验证通过可以显示,但是在PIC18F66K80上却不能正确运行【编译没有问题】。
因为第一次使用PIC芯片,对GPIO的操作不是很透彻。只会一般的操作。
https://git.oschina.net/deja/mplab_lcd12864.git  详细代码<<<<
本来这块板是画来学CAN的,但显示部份没能处理成功,CAN学习部分搁浅到现在。

MCU.pdf

49.52 KB

can_t.pdf

935.92 KB

yulin0668| | 2017-8-26 13:56 | 显示全部楼层
我还没用过PIC的,现在公司要用PIC,特此来学习

使用特权

评论回复
yqdeso| | 2017-8-29 12:17 | 显示全部楼层
main.c  23  24行不正确

使用特权

评论回复
yqdeso| | 2017-8-29 12:18 | 显示全部楼层
yqdeso 发表于 2017-8-29 12:17
main.c  23  24行不正确

STC是准双向口吧?不需要单独设置GPIO的方向,但PIC是需要的。
在PIC中,设备端口方向是用TRISX寄存器来设置的,X就是A B  C  D端口号

使用特权

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

本版积分规则

37

主题

178

帖子

2

粉丝