- 打卡等级:以坛为家I
- 打卡总天数:338
- 最近打卡:2025-05-03 10:03:17
高级会员
- 积分
- 820
|
本帖最后由 lclbf 于 2023-3-29 08:39 编辑
没有对应硬件的开发箱。开始是自己搭接的数码管电路。在我的冲哥视频学习笔记(https://www.stcaimcu.com/forum.php?mod=viewthread&tid=1083&extra=)贴里面有图片。
发贴目的,希望大侠帮我指点一下!!!
我搭接的电路和开发箱电路一样,只有四位数码管。后面改用了降龙棍加金沙滩开发板学习,数码管和LED显示遇到显示不正确的问题。
下面是降龙棍和金沙滩(STC89C52)对应管脚的区别(来源降龙棍管方电路图和金沙滩开发板对比):
金沙滩+降龙棍
降龙棍和金沙滩STC89C52引脚对应
STC89C52 降龙棍
P00 P00
P01 P01
P02 P02
P03 P03
P04 P04
P05 P05
P06 P06
P07 P07
P10 P10
P11 P11
P12 P52 串100R电阻
P13 P13
P14 P14
P15 P15
P16 P16
P17 P17
P20 P20
P21 P21
P22 P22
P23 P23
P24 P24
P25 P25
P26 P26
P27 P27
P30 P46 RXD2 P30 RXD1用于USB D-下载程序
P31 P47 TXD2 P31 TXD1用于USB D+下载程序
P32 P32
P33 P33
P34 P34
P35 P35
P36 P36/WR_P42 两脚都串100R电阻 使用P36口讲其设置为弱上拉,P42设置为高阻输入;使用P42口讲其设置为弱上拉,P36设置为高阻输入
P37 P37/WR_P44 两脚都串100R电阻 使用P37口讲其设置为弱上拉,P44设置为高阻输入;使用P44口讲其设置为弱上拉,P37设置为高阻输入
下面是相关部分电路图,后面附件有原图。
数码管和LED显示部分:
单片机部分:
接口电路部分:
现在来说我遇到的问题:
数码管动态扫描显示012345,中间两位显示错误(错误显示:8.),LED显示全亮。
下面是我数码管和LED显示部分代码:
#include "seg_led.h"
u8 SegLED [21] = {
0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,
0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10,0XFF
};//共阳数码管0-9显示代码,0-9带点显示代码
u8 SegTex[7] = {0X89,0XF1,0XC7,0XA3,0X8C,0XC1,0XCE};//共阳数码管H J L o P U r显示代码
//u8 WeiLed[5] = {0XEF,0XF7,0XFB,0XFD,0XF9};//数码管位选控制最高到位到最低位
//u8 ShowLed[4] = {1,2,3,4};
u8 bdata LED_DAT = 0X0F;
sbit LED0 = LED_DAT^0; //LED0定义
sbit LED1 = LED_DAT^1; //LED1定义
sbit LED2 = LED_DAT^2; //LED2定义
sbit LED3 = LED_DAT^3; //LED3定义
sbit LED4 = LED_DAT^4; //LED4定义
sbit LED5 = LED_DAT^5; //LED5定义
sbit LED6 = LED_DAT^6; //LED6定义
sbit LED7 = LED_DAT^7; //LED7定义
/*****************************************************
函数名称:SEG_LED_Show
函数功能:循环刷新6个数码管和8个LED
入口参数:无
函数返回:无
当前版本:VER1.0
修改日期:2023.3.28
当前作者:
其他备注:
*******************************************************/
void SEG_LED_Show( void )
{
static u8 i = 0;
switch(i)
{
case 0:ADDR2=0;ADDR1=0;ADDR0=0;i++;SEG_SEG=SegLED[0];break;
case 1:ADDR2=0;ADDR1=0;ADDR0=1;i++;SEG_SEG=SegLED[1];break;
case 2:ADDR2=0;ADDR1=1;ADDR0=0;i++;SEG_SEG=SegLED[2];break;
case 3:ADDR2=0;ADDR1=1;ADDR0=1;i++;SEG_SEG=SegLED[3];break;
case 4:ADDR2=1;ADDR1=0;ADDR0=0;i++;SEG_SEG=SegLED[4];break;
case 5:ADDR2=1;ADDR1=0;ADDR0=1;i++;SEG_SEG=SegLED[5];break;
case 6:ADDR2=1;ADDR1=1;ADDR0=0;i=0;SEG_SEG=LED_DAT;break;
default:break;
}
}
主函数代码:
void main()
{
ADDR3 = 1;
ENLED = 0;
sys_init();
usb_init(); //USB初始化
Timer0_Init();
EA = 1;
while (1)
{
if( DeviceState != DEVSTATE_CONFIGURED )
continue;
if( bUsbOutReady )
{
usb_OUT_done();
}
if(TIM_10MS_Flag == 1)
{
TIM_10MS_Flag = 0;
}
}
}
中断函数(在这里实现LED和数码管扫描):
void Timer0_Isr(void) interrupt 1
{
static timcount = 0;
timcount++; //1ms+1
if(timcount>=10) //如果这个变量大于等于10,10ms计数到达
{
timcount = 0;
TIM_10MS_Flag = 1; //10ms时间到了
}
SEG_LED_Show();
}
系统初始化函数:
void sys_init()
{
WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
P0M0 = 0XFF;
P0M1 = 0X00;
P1M0 = 0X00;
P1M1 = 0X00;
P2M0 = 0X00;
P2M1 = 0X00;
P3M0 = 0X00;
P3M1 = 0X00;
P4M0 = 0X00;
P4M1 = 0X00;
P5M0 = 0XFF;
P5M1 = 0X00;
P6M0 = 0X00;
P6M1 = 0X00;
P7M0 = 0X00;
P7M1 = 0X00;
P3M0 &= ~0x03;
P3M1 |= 0x03;
//设置USB使用的时钟源
IRC48MCR = 0x80; //使能内部48M高速IRC
while (!(IRC48MCR & 0x01)); //等待时钟稳定
USBCLK = 0x00; //使用CDC功能需要使用这两行,HID功能禁用这两行。
USBCON = 0x90;
}
在初始化函数中,若是将用到的P0口和P5口设置为准双向口,数码管显示最高位和次高位位98,数码管部分亮;
若是将P0口和P5口设置为推挽输出,数码管全亮,LED全亮,LED不受初始化值控制,数码管中间两位显示0.和
设置的初始值不一样。
写到这里我突然想到还有P1也用到了,我设置成准双向口了,是不是用到的P0,P1,P5口都要设置为推挽输出,】
晚上我测试一下看是不我现在想到的问题。
|
|