[求助] 16位PIC单片机

shimingyan1992   2017-1-9 17:13 楼主
#define SCL_1  PORTAbits.RA11  //74ls164
#define SDA_1  PORTAbits.RA10
#define E      PORTBbits.RB13    //lcd
#define RS     PORTBbits.RB12
#define LCD    PORTBbits.RB11
void delay_us(unsigned int j)
{
   unsigned int i;
   for(i=0;i++;i    {
    Nop();   
   }
}
void __delay_ms(unsigned int i)              
{
  unsigned int j;
  for(;i>0;i--)
  for(j=0;j<130;j++);                     
}
void write_command(unsigned char data)//lcd写指令
{
  unsigned char i ,temp;
  for(i=0;i<8;i++)
{
   temp=data;
   temp&=0x80;
   if(temp==0x80)
   SDA_1=1;
     else
      SDA_1=0;
      data=data<<1;
      SCL_1=0;
    // __delay_us(1);
      delay_us(1);
      SCL_1=1;
}
  RS=0;
  E=1;
//  __delay_us(1);
    delay_us(1);

   E=0;
}
void write_data(unsigned char data) //lcd写数据
{
    unsigned char i ,temp;
    for(i=0;i<8;i++)
    {
      temp=data;
      temp&=0x80;
      if(temp==0x80)
        SDA_1=1;
        else
         SDA_1=0;
         data=data<<1;
         SCL_1=0;
        //__delay_us(1);
         delay_us(1);
         SCL_1=1;
     }
      RS=1;
      E=1;
//  __delay_us(1);
     delay_us(1);
      E=0;
}
void lcd_write_char(unsigned char x, unsigned char y,unsigned char dat)
{

     write_data(dat);

}
void lcd_init(void)
{
    write_command(0x01);  /*清除显示*/
    __delay_ms(10);
    write_command(0x38);  /*设置 8 位格式,2 行,5*7*/
    __delay_ms(10);
    write_command(0x0c);  /*整体显示,关光标,不闪烁*/
    __delay_ms(10);
    write_command(0x06);  /*设定输入方式,增量不移位*/
    __delay_ms(10);
}
void display2(void)
{
write_command(0xc0);  /*初始位置*/
lcd_write_char(0,2‘2’);
          lcd_write_char(1,2,‘3’);
          lcd_write_char(2,2,'.');
}
void init(void)
{
        PORTA=0x0000;
        TRISA=0x0000;
        PORTB=0x0000;
        TRISB=0xc000;  ///RB14 RB15  为输入
        PORTC=0x0000;
        TRISC=0x0001;  ////RC0为输入
        lcd_init();             ////液晶屏显示初始化
void main(void)
{
  init();
  while(1)
{
      write_command(0x38);  /*设置 8 位格式, 2行, 5*7*/
      write_command(0x0c);  /*整体显示,关光标,不闪烁*/
      write_command(0x06);  /*设定输入方式,增量不移位*/
       LCD=1;
       display2();
}
之前改程序用在PIC18F2420上能正常驱动1602正常显示(SDL_1    SCL_1 用的是74LS164)  但是现在把该程序用在PIC24FV32KA304上时显示屏不能正常显示 屏幕出现闪动     不知道是为什么?    与配置位和端口复用有关吗

回复评论 (11)

两个芯片的时钟一样吗?
点赞  2017-1-9 18:07
您是指的晶振频率这一块吗?
点赞  2017-1-9 18:29
引用: suoma 发表于 2017-1-9 18:07
两个芯片的时钟一样吗?

晶振不是一样的  2420用的4M   PIC24FV32KA304用的8M  我之前给2420换过8M的晶振也能正常显示
点赞  2017-1-9 18:30
除了单片机本身,对外的接口,连接的电路,两种情况是否一样。先确保一样。再看两种情况的时序是否一致,你说复用是不是和屏幕通信的io复用了别的功能? 看复用有没有破坏原有时序,先把其它功能去掉,看看效果。
点赞  2017-1-9 20:25
引用: ienglgge 发表于 2017-1-9 20:25
除了单片机本身,对外的接口,连接的电路,两种情况是否一样。先确保一样。再看两种情况的时序是否一致,你 ...

我感觉是时序的事   我测了一下 8M晶振 我的一条空指令大约是4us    不是1us吗
点赞  2017-1-10 11:40
引用: shimingyan1992 发表于 2017-1-10 11:40
我感觉是时序的事   我测了一下 8M晶振 我的一条空指令大约是4us    不是1us吗

cpu的主频和晶振频率不见得一样。要看对应的配置寄存器。分频,倍频什么的。既然能看波形,就把正常和不正常的波形都看看,就比较出区别来了。
点赞  2017-1-10 13:24
引用: ienglgge 发表于 2017-1-10 13:24
cpu的主频和晶振频率不见得一样。要看对应的配置寄存器。分频,倍频什么的。既然能看波形,就把正常和不 ...

我用的75LS164 发现不正常的时钟脉冲有丢失   我用的16位的PIC 8M晶振   配置字该如何设置啊
点赞  2017-1-10 13:41
引用: ienglgge 发表于 2017-1-10 13:24
cpu的主频和晶振频率不见得一样。要看对应的配置寄存器。分频,倍频什么的。既然能看波形,就把正常和不 ...

我用的75LS164 发现不正常的时钟脉冲有丢失   我用的16位的PIC 8M晶振   配置字该如何设置啊
点赞  2017-1-10 13:41
引用: shimingyan1992 发表于 2017-1-10 13:41
我用的75LS164 发现不正常的时钟脉冲有丢失   我用的16位的PIC 8M晶振   配置字该如何设置啊

看手册关于时钟配置的部分啊,时钟树框图,还有选择时钟源,频率的设置。我给你的别的型号的手册中,相关内容的截图,你找你的手册里,肯定有这些东西,哪个寄存器,哪个位怎么配,都有说明。好好找找。
  • QQ截图20170110212855.png
  • QQ截图20170110213048.png
  • QQ截图20170110213136.png
点赞  2017-1-10 21:33
用示波器看看三个IO口的波形和原来板子的区别,在对症下药
点赞  2017-1-18 22:48
首先确认配置端口是否正确,一般换芯片都是配置出现问题的多。
点赞  2017-2-4 11:30
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复