搜索
bottom↓
回复: 7
打印 上一主题 下一主题

PIC驱动HC595显示的仿真及器件迁移的问题

[复制链接]

出0入0汤圆

跳转到指定楼层
1
发表于 2014-7-21 16:31:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人初涉PIC,开发平台为MPLAB7。5+PICC,学习板为QL200,参考某一程序驱动595,使用PIC16F887芯片仿真显示通过,但使用16f690芯片替换却不能仿真;887能仿真,使用学习板硬件试验却又无显示,烦请有相关实践经验的大大们提示一句。万分多谢以下为程序。

#include "pic.h"
void mDelay(unsigned int i);
const unsigned char LEDCODE[]=
{
        0xC0,/*0*/
        0xF9,/*1*/
        0xA4,/*2*/
        0xB0,/*3*/
        0x99,/*4*/
        0x92,/*5*/
        0x82,/*6*/
        0xF8,/*7*/
        0x80,/*8*/
        0x90,/*9*/

};

#define HC595_SER   RC2
#define HC595_SH_CP RC1        //锁存脉冲
#define HC595_ST_CP RC0        //移位脉冲

void HC595_WRITE(unsigned char Data)
{
char i;
for(i=0;i<8;i++)
  {
     if(Data&0x80) HC595_SER=1;
       else HC595_SER=0;
        HC595_ST_CP=0;
        HC595_ST_CP=1;
       Data<<=1;
  }
//HC595_SH_CP=0;
//HC595_SH_CP=1;
}

void WRITE_Data(unsigned char d,unsigned char n)
{
HC595_WRITE(LEDCODE[d]);
HC595_WRITE((1<<n));
HC595_SH_CP=0;
HC595_SH_CP=1;//锁存数据输出
}

void System_Init(void)
{
//TRISB=0x00;
TRISC=0x00;
}

void main()
{
System_Init();
while(1)
{
WRITE_Data(2,0);
mDelay(10);
WRITE_Data(0,1);
mDelay(10);
WRITE_Data(1,2);
mDelay(10);
WRITE_Data(0,3);
mDelay(10);
WRITE_Data(2,4);
mDelay(10);
WRITE_Data(0,5);
mDelay(10);
WRITE_Data(1,6);
mDelay(10);
WRITE_Data(0,7);
mDelay(10);

}

}
void mDelay(unsigned int i)
{
        unsigned int a,b;
    for(a=i;a>0;a--)
     for(b=5;b>0;b--);
}




附件为两个仿真电路使用PROTEUS7。8,

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入20汤圆

2
发表于 2014-7-21 17:06:53 | 只看该作者
1:程序看似没有问题,但要优化:HC595_SH_CP  最好等数据全部输出后再操作,不要只输出一位数据就操作。
2:HC595_SH_CP 、HC595_ST_CP   这2个定义可否定义成HC595_CLK,HC595_RCK,这样容易看。
3:   HC595_ST_CP=0;
         HC595_ST_CP=1;
        Data<<=1;   
可否修改:
   HC595_ST_CP=0;
   Data<<=1;
   HC595_ST_CP=1;
4:3个IO脚,是否有上拉电阻?
5:芯片的控制字是否设置正确?
6:程序是否正确烧入MCU?
7:复位电路是否正常?
8:电源是否正确?

出0入20汤圆

3
发表于 2014-7-21 17:11:25 | 只看该作者
这是实际使用的595驱动:
//-------------------------------------
void SendTo595(unsigned char Dat){
        unsigned char j;
       
        Dat =~Dat;
        for (j=0;j<8;j++){
                Clk595=0;
                Dat595=(Dat & 0x80)>0? 1:0;
                Clk595=1;       
                Dat<<=1;                          //左移输入
        }
void LedOut(unsigned char *pLed){

        unsigned char j,n;

        n=0x01;
        for (j=0;j<6;j++){ //j=>扫描6个LED
                //-----------------------
                Rck595=0;
                SendTo595(~n);
                SendTo595(LedAsc[pLed[j]]);
                Rck595=1;
                tDelay(100);         //ab=150
                n<<=1;
        }
        Rck595=0;
        SendTo595(0xff);
        SendTo595(0);
        Rck595=1;
}

出0入0汤圆

4
 楼主| 发表于 2014-7-22 15:20:30 | 只看该作者
mon51 发表于 2014-7-21 17:06
1:程序看似没有问题,但要优化:HC595_SH_CP  最好等数据全部输出后再操作,不要只输出一位数据就操作。
2 ...

多谢MON51:
1:程序看似没有问题,但要优化:HC595_SH_CP  最好等数据全部输出后再操作,不要只输出一位数据就操作。
复:我的是
if(Data&0x80) HC595_SER=1;
       else HC595_SER=0;
       Data<<=1;
        HC595_ST_CP=0;
        HC595_ST_CP=1;//引脚模拟时钟一位一位输出

2:HC595_SH_CP 、HC595_ST_CP   这2个定义可否定义成HC595_CLK,HC595_RCK,这样容易看。
复:可以接受
3:   HC595_ST_CP=0;
         HC595_ST_CP=1;
        Data<<=1;   
可否修改:
   HC595_ST_CP=0;
   Data<<=1;
   HC595_ST_CP=1;
复:可以试一试
4:3个IO脚,是否有上拉电阻?
开始硬件没有的,后来加入了,还是不行
5:芯片的控制字是否设置正确?
初学未该如何设置,我估计应该是这里出现问题的大,因为使用887仿真可以看到效果。只是想不明白为何690芯片软件仿真却不行,这个比较难理解。

6:程序是否正确烧入MCU?
这个无问题
7:复位电路是否正常?
QL200学习板上的接插芯片应该无问题的,下同
8:电源是否正确?

出0入20汤圆

5
发表于 2014-7-22 15:23:30 | 只看该作者
本帖最后由 mon51 于 2014-7-22 15:25 编辑
dzdzwkx2013 发表于 2014-7-22 15:20
多谢MON51:
1:程序看似没有问题,但要优化:HC595_SH_CP  最好等数据全部输出后再操作,不要只输出一位 ...


你还是没有看懂我说的:每一个位不是指字节的BIT,而是指一个8位的要显示的数据位。
RCK595=0;

WRITE_Data(2,0);
mDelay(10);
WRITE_Data(0,1);
mDelay(10);
WRITE_Data(1,2);
mDelay(10);
WRITE_Data(0,3);
mDelay(10);
WRITE_Data(2,4);
mDelay(10);
WRITE_Data(0,5);
mDelay(10);
WRITE_Data(1,6);
mDelay(10);
WRITE_Data(0,7);
mDelay(10);

RCK595=1;
你的函数:
WRITE_Data();  里面不要有操作RCK595的指令!!

出0入20汤圆

6
发表于 2014-7-22 15:26:09 | 只看该作者
你自己连:HC595_SH_CP    HC595_ST_CP   都没有看清楚!!

出0入0汤圆

7
 楼主| 发表于 2014-7-22 21:02:52 | 只看该作者
现在使用PIC16F887芯片仿真显示通过及硬件887显示正常了,增加了配置字:__CONFIG(0x1832);但690还不行,估计还是配置字问题,只是不知道PIC16F690的配置字该如何写。

出0入0汤圆

8
发表于 2014-8-14 09:54:17 | 只看该作者
mark
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-6 04:01

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表