本帖最后由 芯圣电子官方QQ 于 2023-7-24 15:28 编辑
HC89F003开发板套件在3月6号晚就收到了,但近段时间公司忙现在才有时间,我收到的套件有10片HC89F003比大家多了5片好开心。但不幸的是HC89F003开发板可能和《ddllxxrr》的《HC89S003F4到了,遇到点问题》贴子遇到一样的问题。刚好我有《SSOP28转DIP的板》就手工用拖焊上焊芯片。刚好前段时间做点焊机有一块4位的LED数码管,用74LS164加9015驱动的,原用89C2051做的。看了一下HC89F003例程, 在原程序上加上设置好内部高频其他就按原来的进行编译,下载运行,LED不显示??? 用单步调试IO为本该为低电平的,但实际是有电压,不对阿,再看HC89F003的数据手册IO的默认模式为模拟输入,找到问题了,我想当然的用老AT51思维没看HC89F003的数据手册,没设置IO模式。 啊、啊、啊、最后加上IO为开漏带上拉输出就行了。 最后我的使用心得就是不要想当然,多看看数据手册吧!!!
/***
------------------------------__-----------------------------
--| INT8/AN8/P2.0 P0.7/AN7/INT7|--
--| INT5/AN5/P0.5 P0.6/AN6/INT6|--
--| Vref/INT4/AN4/P0.4 P2.1/AN9/INT9|--
--| INT3/AN3/P0.3 P2.2/AN10/INT10|--
--| FLT2/INT2/AN2/P0.2 P2.3/TDI/INT11|--
--| FLT1/INT1/AN1/P0.1 P2.4/TDO/INT12|--
--| GND P2.5/TCK/INT13|--
--| FLT0/INT0/AN0/P0.0 P2.6/TMS/INT14/PLVD|--
--| VCC P2.7/RST/INT15|--
--| XOUT/P1.1 P1.0/XIN|--
--------------------------------------------------------------
***/
#define ALLOCATE_EXTERN
#include "HC89S003F4.h"
#include <intrins.h> //_nop_();
//7段管字模 0 1 2 3 4 5 6 7 8 9 不显
uchar code Table [11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
/***Led显示缓存 *******************/
u8 disp[5]={0x0, //对应左起4位 对应右起1位 设置
0x1, //对应左起3位 对应右起2位 设置
0x5, //对应左起2位 对应右起3位 设置
0x9, //对应左起1位 对应右起4位 设置
0x04, //DP位设低4位有效为1则显示 0位为右1位
};
//**************IO分配******************************************//
sbit b1b=P0^4; //b1+ //数码管共阳极驱动
sbit b2b=P0^3; //b2+
sbit b3b=P0^2; //b3+
sbit b4b=P0^1; //b4+
sbit CLK=P0^7; //74LS164_8PIN
sbit SDA=P0^6; //74LS164_1/2PIN
void TIMER_init()
{
TCON1 = 0x00; //Tx0定时器时钟为Fosc
TMOD = 0x00; //16位重装载定时器/计数器
TH0 = 0xF5;
TL0 = 0x95; //T0定时时间2ms
IE |= 0x02; //打开T0中断
TCON |= 0x10; //使能T0
EA = 1; //打开总中断
}
void GPIO_init()
{
// P2M0 = P2M0&0xf0|0x0E; //P20设置开漏带上拉输出
P0M3=0XEE; //P06;P07设置开漏带上拉输出
P0M2= P0M0&0XF0|0X0e; //P04设置开漏带上拉输出
P0M1=0XEE; //P02;P03设置开漏带上拉输出
P0M0= P0M0&0X0F|0XE0; //P01设置开漏带上拉输出
}
void main(void)
{
while((CLKCON&0x20)!=0x20); //等待内部高频RC起振
CLKSWR = 0x51; //选择内部高频时钟为主时钟,内部高频RC0分频,Fosc=32MHz
while((CLKSWR&0xC0)!=0x40); //等待内部高频切换完成
CLKDIV = 0x01; //Fosc2分频得到Fcpu,Fcpu=16MHz
WDTCCR = 0x00; //关闭看门狗 必须要关闭,默认是打开的
GPIO_init();
TIMER_init();
while(1);
}
void TIMER0_Rpt(void) interrupt TIMER0_VECTOR
{
static u8 Channel; //LED当前显示通道
u8 i,u8Disp;
u8Disp=Table[disp[Channel]];
switch (Channel)
{ case 0: //对应数码管右起1位
{ if(disp[4]&1)
u8Disp &=0x7f; //设置DP小数点
b1b=1;b2b=1;b3b=1;b4b=0;
break;
}
case 1: //对应数码管右起2位
{ if(disp[4]&2)
u8Disp &=0x7f; //设置DP小数点
b1b=1;b2b=1;b3b=0;b4b=1;
break;
}
case 2:
{ if(disp[4]&4)
u8Disp &=0x7f; //设置DP小数点
b1b=1;b2b=0;b3b=1;b4b=1;
break;
}
case 3:
{ if(disp[4]&8)
u8Disp &=0x7f; //设置DP小数点
b1b=0;b2b=1;b3b=1;b4b=1;
break; //*/
}
}
for(i=0;i<8;i++)
{ u8Disp<<=1;SDA=CY;
CLK=1;
_nop_(); _nop_(); _nop_(); _nop_();
CLK=0;
}
Channel++;
if(Channel==4)
Channel=0;
}
|