deepseek能编写程序已经不是新闻,但是我头一次使用,想着看能不能按照我的要求写个程序出来。翻出一个共阳的1.8寸数码管;理清一下思路,好让deepseek读懂要干什么活。点亮数码管无非就是按照数字的笔画顺序点灯。所以简单画个图看下。
使用的STC12C5A60S2的单片机,接线方式如图,晶振部分没有画出来。
然后打开DEEPSEEK;输入想法:
编写一段程序,用STC12C5A60S2单片机的P1口点亮一个数码管,从数字0显示到数字9,每个数字亮1S;循环先显示。数码管为共阳,a,b,c,d,e,f,e,g,dp分别对应单片机的p1.0...p1.7;回车后网页显示:以下是使用STC12C5A60S2单片机P1口控制共阳数码管显示0-9的循环程序,每个数字显示1秒:
#include <STC12C5A60S2.H> // 包含STC12C5A60S2头文件
#include <intrins.h> // 包含_nop_()函数
// 定义数码管段码(共阳,P1.0对应a段,P1.7对应dp段)
// 数字0-9的段码表:a,b,c,d,e,f,g,dp
unsigned char code LED_Code[] = {
0xC0, // 0: 1100 0000 (a,b,c,d,e,f亮)
0xF9, // 1: 1111 1001 (b,c亮)
0xA4, // 2: 1010 0100 (a,b,g,e,d亮)
0xB0, // 3: 1011 0000 (a,b,g,c,d亮)
0x99, // 4: 1001 1001 (f,g,b,c亮)
0x92, // 5: 1001 0010 (a,f,g,c,d亮)
0x82, // 6: 1000 0010 (a,f,e,d,c,g亮)
0xF8, // 7: 1111 1000 (a,b,c亮)
0x80, // 8: 1000 0000 (全部亮)
0x90, // 9: 1001 0000 (a,b,c,d,f,g亮)
0x7F // 点: 0111 1111 (仅dp亮,可用于分隔)
};
// 延时函数声明
void Delay1ms(unsigned int count);
void Delay1s(void);
// 主函数
void main(void)
{
unsigned char i = 0; // 用于计数0-9
// 初始化P1口为推挽输出模式
P1M0 = 0xFF; // P1口全部设置为推挽输出
P1M1 = 0x00;
while(1) // 无限循环
{
for(i = 0; i < 10; i++) // 循环显示0-9
{
P1 = LED_Code[ i]; // 将段码送到P1口
Delay1s(); // 延时1秒
}
}
}
// 1毫秒延时函数(基于11.0592MHz晶振)
void Delay1ms(unsigned int count)
{
unsigned int i, j;
for(i = 0; i < count; i++)
for(j = 0; j < 114; j++);
}
// 1秒延时函数
void Delay1s(void)
{
Delay1ms(1000); // 延时1000ms = 1s
}
程序说明:1. 段码定义:? 共阳数码管:段选信号为0时点亮,1时熄灭? P1.0对应a段,P1.1对应b段,...,P1.7对应dp段? 段码表按照0-9的顺序定义,每个字节的8位对应8个段2. 端口配置:? P1M0 = 0xFF; 和 P1M1 = 0x00; 将P1口设置为推挽输出模式? 推挽输出可以提供较强的驱动能力,直接驱动数码管3. 显示逻辑:? 主循环中,for循环依次取0-9的段码? 每个数字通过P1口输出,保持1秒? 显示完9后回到0重新开始如果需要更精确的延时,可以使用定时器:
把程序编译成HEX文件烧录后,运行正常,变化速度稍快,修改下延迟时间后OK;
|