hl1200aa
发表于 2023-11-19 11:42:26
安装好keil4, 按照视频往keil添加MCU,写个点亮dp的文件。
这个板子设计得有点奇葩,明明可以用硬件led驱动数码管,但却选择了软驱,可能大神的想法和我们不同吧。
延时用isp工具算的,一秒闪一次。
attach://27286.png
attach://27287.jpg
/*********************************************************/
#define MAIN_Fosc 11059200L //定义主时钟
#include "STC8Gxxx.h"
/************* 功能说明 *************
点灯程序
板载一个两位8字共阳模块
G1 pin16 p3.5
G2 pin17 p3.6
a pin20 p1.1
b pin3p1.4
c pin5p1.6
d pin4p1.5
e pin1p1.2
f pin2p1.3
g pin6p1.7
dp pin7 p5.4
这次先点dp
G1 G2 设置为高电平 推挽输出 p3.5 p3.6 p3m1=00000000b p3m0=01100000b
dp设置为低电平 开漏输出 p5.4 p5m1=00010000b p5m0=00010000b
按正常来说,应该用p1口做led驱动的com口,用p3口做led驱动的seg口
以利用单片机里面的led硬件驱动
这个电路板设计得有点奇葩
******************************************/
/************* 本地常量声明 **************/
/************* 本地变量声明 **************/
/************* 本地函数声明 **************/
/****************外部函数声明和外部变量声明 *****************/
/**********************************************/
void Delay100ms(void) //@11.0592MHz
{
unsigned char data i, j, k;
_nop_();
_nop_();
i = 5;
j = 52;
k = 195;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main(void)
{
int time100ms = 0;
P_SW2 |= 0x80; //允许访问XSFR(扩展特殊功能寄存器)
P3M1 = 0x00;
P3M0 = 0x60;
P5M1 = 0x10;
P5M0 = 0x10;
P35 = 1;
P54 = 0;
while (1)
{
for(time100ms = 10; time100ms > 0; time100ms--)
{
Delay100ms();
}
P54 = 1;
for(time100ms = 10; time100ms > 0; time100ms--)
{
Delay100ms();
}
P54 = 0;
}
}
hl1200aa
发表于 2023-12-9 16:52:53
本帖最后由 hl1200aa 于 2023-12-9 17:25 编辑
根据电路图分配单片机资源
P10 传感器输入输入高阻
P11 seg_a输出开漏输出
P12 seg_e输出开漏输出
P13 seg_f输出开漏输出
P14 seg_b输出开漏输出
P15 seg_d输出开漏输出
P16 seg_c输出开漏输出
P17 seg_g输出开漏输出
P0M0 = 11111110B 0xfe
P0M1 = 11111110B 0xfe
P30 RX 不分配
P31 TX 不分配
P32 NO2输入 弱上拉
P33 1输出, 推挽输出,缺省高电平。
P34 2输出, 推挽输出,缺省高电平。
P35 数码管共阳G1, 推挽输出
P36 数码管共阳G2, 推挽输出
P37 红外管输出,推挽输出
P3M0 = 11111000B 0xf8
P3M1 = 00000100B 0x04
P54seg_dp输出开漏输出
P55 NO1输入 弱上拉
P5M0 = 00010000B 0x00
P5M1 = 00010000B 0x10
_奶咖君_
发表于 2023-12-9 17:48:12
可真行,向人家要固件。。你怎么不发给人家让人家修呢。。
hl1200aa
发表于 2023-12-9 19:18:52
/*********************************************************/
#define MAIN_Fosc 11059200L //定义主时钟
#include "STC8Gxxx.h"
/************* 功能说明 *************
点灯程序
板载一个两位8字共阳模块
G1 pin16 p3.5
G2 pin17 p3.6
a pin20 p1.1
b pin3p1.4
c pin5p1.6
d pin4p1.5
e pin1p1.2
f pin2p1.3
g pin6p1.7
dp pin7 p5.4
这次先点 G1和dp
G1 G2 设置为高电平 推挽输出 p3.5 p3.6 p3m1=00000000b p3m0=01100000b
dp设置为低电平 开漏输出 p5.4 p5m1=00010000b p5m0=00010000b
按正常来说,应该用p1口做led驱动的com口,用p3口做led驱动的seg口
以利用单片机里面的led硬件驱动
这个电路板设计得有点奇葩
******************************************/
/************* 本地常量声明 **************/
/************* 本地变量声明 **************/
/************* 本地函数声明 **************/
/****************外部函数声明和外部变量声明 *****************/
/**********************************************/
/*
void Delay100ms(void) //@11.0592MHz
{
unsigned char data i, j, k;
_nop_();
_nop_();
i = 5;
j = 52;
k = 195;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
*/
void main(void)
{
int time100ms = 0;
P_SW2 |= 0x80; //允许访问XSFR(扩展特殊功能寄存器)
P1M1 = 0xff;
P1M0 = 0xfe;
P3M1 = 0x80;
P3M0 = 0xf8;
P5M1 = 0x10;
P5M0 = 0x10;
P35 = 1;
P35 = 0;
P36 = 1;
P36 = 0;
P54 = 1;
P54 = 0;
P1 = P1 | 0xfe;
P1 = P1 & 0x01;
P35 = 1;
P36 = 1;
P35 = 0;
P36 = 0;
//P37 = 0;
//P37 = 1;
while (1)
{
/*
for(time100ms = 10; time100ms > 0; time100ms--)
{
Delay100ms();
}
P54 = 1;
P1 = P1 | 0xfe;
for(time100ms = 10; time100ms > 0; time100ms--)
{
Delay100ms();
}
P54 = 0;
P1 = P1 & 0x01;
*/
if(P55 == 1)// NO1 按下按键高电平
{
P35 = 1;//点亮1号数码管
}
else
{
P35 = 0;
}
if(P32 == 1)// NO2 按下按键高电平
{
P37 = 0;//启动红外管
if(P10 == 0)//传感器收到红外电平为底,关闭输出
{
P36 = 0;//
}
else//否则点亮2号数码管
{
P36 = 1;
}
}
else
{
P37 = 1;//关闭红外管
P36 = 0;
}
}
}
/**********************************************/
xxkj2010
发表于 2023-12-9 19:47:21
gentleman 发表于 2023-11-15 12:10
你向厂家要/买几片 写好程序的芯片 不就行了。
当然,你有能力坚持学下去更好。
买几片写好程序的芯片?估计价格不便宜吧。
xxkj2010
发表于 2023-12-9 19:48:04
估计得自己摸索工作原理,自己编程烧录程序。
hl1200aa
发表于 2023-12-10 00:47:28
/*********************************************************/
#define MAIN_Fosc 11059200L //定义主时钟
#include "STC8Gxxx.h"
/************* 功能说明 *************
整体布局
功能 管脚 用途 输入输出 类型 PXM1PXM0
P10 PIN19 传感器输入 输入 高阻 1 0
P11 PIN20 seg_a 输出 开漏输出1 1
P12 PIN1 seg_e 输出 开漏输出1 1
P13 PIN2 seg_f 输出 开漏输出1 1
P14 PIN3 seg_b 输出 开漏输出1 1
P15 PIN4 seg_d 输出 开漏输出1 1
P16 PIN5 seg_c 输出 开漏输出1 1
P17 PIN6 seg_g 输出 开漏输出1 1
P0M1 = 11111110B 0xff
P0M0 = 11111110B 0xfe
功能 管脚 用途 输入输出 类型 PXM1PXM0
P30 PIN11 RX不分配 0 0
P31 PIN12 TX不分配 0 0
P32 PIN13 NO2输入 输入 准双口 0 0 设置为高电平
P33 PIN14 NO1输出 输出 推挽输出0 1 缺省高电平。
P34 PIN15 NO2输出 输出 推挽输出0 1 缺省高电平。
P35 PIN16 数码管共阳G1 输出 推挽输出0 1
P36 PIN17 数码管共阳G2 输出 推挽输出0 1
P37 PIN18 红外管输出 输出 开漏输出1 1 0发光,1灭光
P3M1 = 1000 0000B 0x80
P3M0 = 1111 1000B 0xf8
功能 管脚 用途 输入输出 类型 PXM1PXM0
P54 PIN7 seg_dp 输出 开漏输出1 1
P55 PIN9 NO1输入 输入 准双口 0 0 设置为高电平
P5M0 = 0001 0000B 0x10
P5M1 = 0001 0000B 0x10
******************************************/
/************* 本地常量声明 **************/
#define NO1_IN_ON (P55 == 1)
#define NO2_IN_ON (P32 == 1)
#define NO1_OPEN (P33 = 0)
#define NO1_CLOSE (P33 = 1)
#define NO2_OPEN (P34 = 0)
#define NO2_CLOSE (P34 = 1)
#define IR_ON (P37 = 0)
#define IR_OFF (P37 = 1)
#define G1_ON (P35 = 1)
#define G1_OFF (P35 = 0)
#define G2_ON (P36 = 1)
#define G2_OFF (P36 = 0)
#define SENSOR_ON(P10 == 0)
/************* 本地变量声明 **************/
/************* 本地函数声明 **************/
/****************外部函数声明和外部变量声明 *****************/
/**********************************************/
void Delay100ms(void) //@11.0592MHz
{
unsigned char data i, j, k;
_nop_();
_nop_();
i = 5;
j = 52;
k = 195;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main(void)
{
int time100ms = 0;
char statu_g1 = 0;
char statu_g2 = 0;
P_SW2 |= 0x80; //允许访问XSFR(扩展特殊功能寄存器)
//设置管脚模式
P1M1 = 0xff;
P1M0 = 0xfe;
P3M1 = 0x80;
P3M0 = 0xf8;
P5M1 = 0x10;
P5M0 = 0x10;
//P32, P55设置上拉电阻
P32 = 1;
P55 = 1;
//关闭开关
NO1_CLOSE;
NO2_CLOSE;
//关闭IR
IR_OFF;
//关闭G1,G2
G1_OFF;
G2_OFF;
//全部打开数码管的seg
P1 &= 0x01;
P54 = 0;
G1_ON;
G2_ON;
for(time100ms = 10; time100ms > 0; time100ms--)
{
Delay100ms();
}
G1_OFF;
G2_OFF;
while (1)
{
/*
for(time100ms = 10; time100ms > 0; time100ms--)
{
Delay100ms();
}
P54 = 1;
P1 = P1 | 0xfe;
for(time100ms = 10; time100ms > 0; time100ms--)
{
Delay100ms();
}
P54 = 0;
P1 = P1 & 0x01;
*/
if(NO1_IN_ON)// NO1 按下按键高电平
{
//如果G2处于关闭状态
if (statu_g2 == 0)
{
G1_ON;//点亮1号数码管
statu_g1 = 1; //改g1状态
IR_ON; //打开红外
}
}
if(NO2_IN_ON)// NO2 按下按键高电平
{
//如果G1处于关闭状态
if (statu_g1 == 0)
{
G2_ON;//点亮2号数码管
statu_g2 = 1;
IR_ON; //打开红外
}
}
if(SENSOR_ON)
{
//关闭红外
IR_OFF;
//关闭数码管
G1_OFF;
G2_OFF;
//改状态
statu_g1 = 0;
statu_g2 = 0;
}
}
}
/**********************************************/
hl1200aa
发表于 2023-12-10 00:53:18
效果
attach://29150.mp4
shanmudadao
发表于 2023-12-10 09:34:27
楼主也是个牛人啊
NTC
发表于 2023-12-10 11:32:21
牛人,修个件,搞成开发了。