利用595芯片,向数码管输出:
void Init_595(void)
{
HC595_SER = 0;
HC595_RCK = 0;
HC595_SCK = 0;
}
void Send_595( u8 dat )
{
u8 i;
for( i=0;i<8;i++ )
{
dat <<= 1; //DAT = (DAT<<1); 最高位移入CY
HC595_SER = CY; //先把数据写到引脚上
HC595_SCK = 1; //输出上升沿的时钟信号
HC595_SCK = 0; //这样就传出了1位,循环8次,8位就传完!
}
}
接着把锁存的数据输出出去
void Display_Seg(u8 HC595_1,u8 HC595_2) //第一个595是数码管段码输出,高电平点亮,第二个595是数码管位码输出,低电平点亮
{
Send_595(HC595_1); //数码管段码输出高电平点亮
Send_595(HC595_2); //数码管位码 低电平点亮
HC595_RCK = 1; //数据输出
HC595_RCK = 0;
}
有个问题,我们周期性调度函数,不能带参数!返回值也是空
void Seg_Task(void)
{
//Display_Seg(SEG_NUM,~T_NUM); //在第一位显示0
}
暂时先这样处理..............
记得要在io.h 里声明:
这样在主函数就可以直接调用:
#include "config.h"
#include "task.h"
#include "io.h"
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void main(void)
{
Sys_init(); //系统初始化
usb_init(); //USB CDC 接口配置
IE2 |= 0x80; //使能USB中断
Timer0_Init(); //定时器初始化
Init_595(); //595端口电平初始化
EA = 1; //IE |= 0X80;
P40 = 0;
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
while(1)
{
if (bUsbOutReady) //如果接收到了数据
{
//USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done(); //
}
Task_Pro_Handler_Callback(); //执行功能函数
}
}
void Timer0_Isr(void) interrupt 1 //1MS执行一次
{
Task_Marks_Handler_Callback(); //系统计时
}
编译连接,下载后看能否显示静态的0:
数码管有输出,但是个乱码:
看看是哪里有问题:
发现之前的任务都没有屏蔽掉
这样就正常了:
当然,位也可以定义个数组:
// T_NUM是位码(要在哪一位显示数字)数组
u8 T_NUM =
{
0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80
};
下面看动态显示:
先看看流程图: