气死我了,74hc595的驱动函数调了2天,它就是不显示,位选都成功了,就是595的驱动函数有问
编译软件ICC6.31am48单片机
位选采用138译码器实现,程序是没问题的
#include <iom48v.h>
#include <macros.h>
#include ".\head\ICC_AVRPORTBit.h"
#include ".\head\Delay.h"
#define uint8 unsigned char
//74HC595的端口定义
#define Hc595_data PORTB_PB2
#define Hc595_clkPORTB_PB1
#define Hc595_stcp PORTB_PB0//片选
//74HC138的端口定义
#define Hc138_A0PORTB_PB3
#define Hc138_A1PORTB_PB4
#define Hc138_A2PORTB_PB5
const uint8 LedDisplayCode[]=
{
0xC0,/*0*/
0xF9,/*1*/
0xA4,/*2*/
0xB0,/*3*/
0x99,/*4*/
0x92,/*5*/
0x82,/*6*/
0xF8,/*7*/
0x80,/*8*/
0x90,/*9*/
0x88,/*A*/
0x83,/*b*/
0xC6,/*C*/
0xA1,/*d*/
0x86,/*E*/
0x8E,/*F*/
0xBF,/*-*/
};
void Hc595_send_byte(unsigned char byte)
{
unsigned char i;
for(i=0;i<8;i++)
{
Hc595_data=byte&(0x80>>i);
Hc595_clk=0;
Delay_nus(5);
Hc595_clk=1;
}
Delay_nus(5);
Hc595_clk=0;
Delay_nus(5);
Hc595_stcp=0;
Delay_nus(5);
Hc595_stcp=1;
}
/*
void Hc595_send_int(uint8 data)
{
unsigned char int_l,int_h;
int_l=data; //取低4位
int_h=data>>4; //取高4位
Hc595_send_byte(int_l);
Hc595_send_byte(int_h);
Hc595_stcp=1;
Hc595_stcp=0;
}*/
void Select_LED_Bit(uint8 Bit_Num)
{
switch(Bit_Num)
{
case 0:
Hc138_A2=0;
Hc138_A1=0;
Hc138_A0=0;
break;
case 1:
Hc138_A2=0;
Hc138_A1=0;
Hc138_A0=1;
break;
case 2:
Hc138_A2=0;
Hc138_A1=1;
Hc138_A0=0;
break;
case 3:
Hc138_A2=0;
Hc138_A1=1;
Hc138_A0=1;
break;
case 4:
Hc138_A2=1;
Hc138_A1=0;
Hc138_A0=0;
break;
case 5:
Hc138_A2=1;
Hc138_A1=0;
Hc138_A0=1;
break;
case 6:
Hc138_A2=1;
Hc138_A1=1;
Hc138_A0=0;
break;
case 7:
Hc138_A2=1;
Hc138_A1=1;
Hc138_A0=1;
break;
}
}
void main()
{
uint8 i;
DDRB=0XFF;
PORTB=0XFF;
while (1)
{
//for(i=0;i<8;i++)
//{
Select_LED_Bit(7);
//Hc595_send_int(LedDisplayCode);
Hc595_send_byte(0x86);
//Delay_nms(100);
// }
}
} 都这年代了,还研究M48?我们都改51了
既然程序没有问题,贴出来看个屁啊,还是把电路也贴出来看看吧 回复【1楼】xiaobendan 仲跻东
-----------------------------------------------------------------------
1、说话太不文明了
2、51也8块以上,48也10块以上,性能却差很多,而且48也不是不可能不降了 STC的貌似4元起 mega88和48似乎降价了哦 项目上之前没办法直接全部替换掉前天又购买了几百片一片11块应该降价了不少了 早就STC 啦! 程序不想看, 你还是看看时序,还有你的电路好了。。。。 大哥们我的程序问题在哪里啊?别先讨论钱的问题啊
我刚仿真了,595的并行输出始终是高电平,这是怎么回事啊 for(i=0;i<8;i++)
{
Hc595_data=byte&(0x80>>i);
Hc595_clk=0;
Delay_nus(5);
Hc595_clk=1;
}
你这是构造下降沿.另外你的电路图呢? 595时序对么? 看看这个吧,很简单的东西。。。
74HC595驱动程序2例
程 序 匠 人 发表于 2005-11-10 20:37:00阅读全文(8125) | 回复(0) | 引用通告(4) | 编辑
给个74HC595的"慢动作"
void WriteSIOByte(unsigned char val)
{
unsigned char i;
ACC = val;
for (i = 8; i > 0; i --) {
SRCLK = 0;//拉低74HC595时钟
_rrca_();//右移一位数据
SER = CY;//发送74HC595一位串行数据
SRCLK = 1;//拉高74HC595时钟
_nop_();//延时
}
SER = 1;//释放数据总线
//以下3条指令若在多字节时,应该移入多字节全发送完后在执行此3条指令
RCLK = 0;
_nop_();//延时
RCLK = 1;//打入并行数据
}
74ls595"速射"
hotpower
for(i = 0; i < buffsize; i ++){
SBUF = siobuff;
while(TI == 0);
TI = 0;
}
RCLK = 0;
_nop_();//延时
RCLK = 1;//打入并行数据 回复【7楼】rainyss
-----------------------------------------------------------------------
http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_590750TVP27Z.jpg
(原文件名:1.jpg)
http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_590751VJLT0T.jpg
(原文件名:2.jpg) 回复【10楼】xtaens
-----------------------------------------------------------------------
看不清.看我的吧.
http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_590864PIR8EE.gif
(原文件名:无标题.gif) 回复【11楼】rainyss
-----------------------------------------------------------------------
1、电路图是没有问题的,他是一个开发版原理图
2、请问:
for(i=0;i<8;i++)
{
Hc595_data=byte&(0x80>>i);
Hc595_clk=0;
Hc595_clk=1;
}
Hc595_data 的值应该只有0和1两个值,但是假如0x40&0x50=0x40, Hc595_data=0x40;
后Hc595_data的值是0x40呢还是别的数呢(如为1),我的编译软件为ICC6.31a,Hc595_data的值与编译软件有关系吗
谢谢啊 Hc595_clk=0;
for(i=0;i<8;i++)
{
Hc595_data=byte&(0x80>>i);
Hc595_clk=1;
Hc595_clk=0;
}
还有12脚HCLK和13脚OE你都处理没有? 1、13脚我是接地了的
2、12脚的操作在下面函数的for循环后也是处理的了
void Hc595_send_byte(unsigned char byte)
{
unsigned char i;
for(i=0;i<8;i++)
{
Hc595_data=byte&(0x80>>i);
Hc595_clk=0;
Delay_nus(5);
Hc595_clk=1;
}
Delay_nus(5);
Hc595_clk=0;
Delay_nus(5);
Hc595_STCp=0;
Delay_nus(5);
Hc595_STCp=1;
} 回复【13楼】rainyss
-----------------------------------------------------------------------
Hc595_data=byte&(0x80>>i);
这句话是参考马朝老师354页的写法改的,不知改的正确与否????? void Hc595_send_byte(unsigned char byte)
{
unsigned char i;
unsigned char shift=0x80;
for(i=0;i<8;i++)
{
Hc595_clk=0;
if(byte&shift)
{Hc595_data=1;}
else
{Hc595_data=0;}
Hc595_clk=1;
shift>>=1;
}
Delay_nus(5);
Hc595_clk=0;
Delay_nus(5);
Hc595_STCp=0;
Delay_nus(5);
Hc595_STCp=1;
}
你可以这样写试试 感觉你的那个函数有问题,还有就是把延时加大 试试,另一个就是查查 并口数据出使能的地方是不是时序配合有问题。 我一直用的时候常态SCK和RCK都是低电平,改成常态高电平时有问题,后面没有去研究了 Hc595_data=byte&(0x80>>i);
Hc595_clk=0;
Delay_nus(5);
Hc595_clk=1;
这种时序个人认为是不妥的,最好是产生上升沿后返回低电平.也许各人习惯不同吧. 问题终于找出来了:
原来是Hc595_data=byte&(0x80>>i)在作怪,改成
if(byte&0x80)
Hc595_data=1;
else
Hc595_data=0;
就可以了,下面是全部的源代码,其中去掉延时程序也跑得很happy。
思考:Hc595_data=byte&(0x80>>i)在不同的编译软件上的结果是不是相同的呢(如马朝老师写的那种写法,软件为cvavr)
结论:以后为了万无一失还是写成这样吧,防止不同的编译器对他的理解不同
if(byte&0x80)
Hc595_data=1;
else
Hc595_data=0;
以上是我的观点,正确与否请大家指正
#include <iom48v.h>
#include <macros.h>
#include ".\head\ICC_AVRPORTBit.h"
#include ".\head\Delay.h"
#define uint8 unsigned char
//74HC595的端口定义
#define Hc595_data PORTB_PB2
#define Hc595_clkPORTB_PB1
#define Hc595_stcp PORTB_PB0//片选
//74HC138的端口定义
#define Hc138_A0PORTB_PB3
#define Hc138_A1PORTB_PB4
#define Hc138_A2PORTB_PB5
const uint8 LedDisplayCode[]=
{
0xC0,/*0*/
0xF9,/*1*/
0xA4,/*2*/
0xB0,/*3*/
0x99,/*4*/
0x92,/*5*/
0x82,/*6*/
0xF8,/*7*/
0x80,/*8*/
0x90,/*9*/
0x88,/*A*/
0x83,/*b*/
0xC6,/*C*/
0xA1,/*d*/
0x86,/*E*/
0x8E,/*F*/
0xBF,/*-*/
};
void Hc595_send_byte(unsigned char byte)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(byte&0x80)
Hc595_data=1;
else
Hc595_data=0;
//Hc595_data=byte&(0x80>>i);//不知道这句话为什么不行
byte <<=1;
Hc595_clk=0;
Hc595_clk=1;
}
Hc595_stcp=0;
Hc595_stcp=1;
}
/*
void Hc595_send_int(uint8 data)
{
unsigned char int_l,int_h;
int_l=data; //取低4位
int_h=data>>4; //取高4位
Hc595_send_byte(int_l);
Hc595_send_byte(int_h);
Hc595_stcp=1;
Hc595_stcp=0;
}*/
void Select_LED_Bit(uint8 Bit_Num)
{
switch(Bit_Num)
{
case 0:
Hc138_A2=0;
Hc138_A1=0;
Hc138_A0=0;
break;
case 1:
Hc138_A2=0;
Hc138_A1=0;
Hc138_A0=1;
break;
case 2:
Hc138_A2=0;
Hc138_A1=1;
Hc138_A0=0;
break;
case 3:
Hc138_A2=0;
Hc138_A1=1;
Hc138_A0=1;
break;
case 4:
Hc138_A2=1;
Hc138_A1=0;
Hc138_A0=0;
break;
case 5:
Hc138_A2=1;
Hc138_A1=0;
Hc138_A0=1;
break;
case 6:
Hc138_A2=1;
Hc138_A1=1;
Hc138_A0=0;
break;
case 7:
Hc138_A2=1;
Hc138_A1=1;
Hc138_A0=1;
break;
}
}
void main()
{
uint8 i;
DDRB=0XFF;
PORTB=0XFF;
while (1)
{
for(i=0;i<8;i++)
{
Select_LED_Bit(i);
Hc595_send_byte(LedDisplayCode);
Delay_nms(300);
}
}
} mark一下下 #include <iom8.h>
#include "SPI595.h"
__flash unsigned char Table[]={
0x03,//"0"
0x9F,//"1"
0x25,//"2"
0x0D,//"3"
0x99,//"4"
0x49,//"5"
0x41,//"6"
0x1F,//"7"
0x01,//"8"
0x09,//"9"
0x11,//"A"
0xC1,//"B"
0x63,//"C"
0x85,//"D"
0x61,//"E"
0x71,//"F"
0x91,//"H"
0xE3,//"L"
0x13,//"n"
0x83,//"u"
0x31,//"P"
0xC5,//"o"
0xFD,//"-"
0xFF,//close
};
__flash unsigned char Bit_Tab = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//NPN
unsigned char DisBuffer = {1,2,3,4,5,6,7,8};
#pragma vector = SPI_STC_vect
__interrupt void SPI_isr(void)
{
volatile static unsigned char Loop=0,LedCycle=0;
_CLI();
if(Loop == 0)
{
SPDR = Bit_Tab;
Loop = 1;
}
else
{
if(Loop == 1)
{
SPDR = Table];
Loop = 3;
}
else
{
Loop = 0;
ST_CLKHigh;
_NOP();
_NOP();
_NOP();
_NOP();
ST_CLKLow;
SPDR = 0x00;
LedCycle++;
LedCycle &= 0x7;
}
}
_SEI();
}
void SPI_MasterInit(void)
{
PORTB|= (1<<PB2) | (1<<PB5) | (1<<PB7);
DDRB |= (1<<PB2) | (1<<PB5) | (1<<PB7);
// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 2*2000.000 kHz
// SPI Clock Phase: Cycle Start
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
SPCR=0xD1;
SPSR=0x00;
_NOP();
_NOP();
SPDR = 0xff;
}
在中断里调 用的,用M8
Hc595_data=byte&(0x80>>i)在不同的编译软件上的结果是不是相同的呢
because assigning a non-bit value to a bit type is undefined in C.
writing it explicitly as you did is the right way to go.
页:
[1]