fei2568
发表于 2024-12-16 12:49:51
<p>上面代码数码管闪的原因找到了,P32是数码管数字芯片595的时钟线</p>
<p>无语了</p>
fei2568
发表于 2024-12-16 18:54:48
<p>第8集 下面代码是周期性调度任务的代码</p>
<p>led1 300ms反转一次;</p>
<p>led2 600ms反转一次;</p>
<p>led3 900ms反转一次;</p>
<pre><code>#include "ai8051u.h"
#include "stc32_stc8_usb.h"//usb 库文件,和那个stc_usb_cdc_32.LIB文件都是USB库文件,搞那个USB不停电下载时加的
#include "intrins.h"
#define u8 unsigned char //8位无符号变量(0-255)
#define u16 unsigned int //16位无符号变量(0-65535)
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
u16 count_300=0;
u16 count_600=0;
u16 count_900=0;
void Timer0_Init(void); //500毫秒@24.000MHz
void main(void)
{
WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
P0M1 = 0x00; P0M0 = 0xff; //设置为推挽输出
P1M1 = 0x00; P1M0 = 0x00; //设置为准双向口
P2M1 = 0x00; P2M0 = 0x00; //设置为准双向口
P3M1 = 0x00; P3M0 = 0x00; //设置为准双向口
P4M1 = 0x00; P4M0 = 0x00; //设置为准双向口
P5M1 = 0x00; P5M0 = 0x00; //设置为准双向口
P6M1 = 0x00; P6M0 = 0x00; //设置为准双向口
P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口
usb_init(); //USB CDC 接口配置
Timer0_Init(); //定时器初始化
IE2|=0x80; //使能USB中断
EA = 1; //开总中断吗?
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
P40=0;
while (1)
{
if (bUsbOutReady) //如果接收到了数据
{
//USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done();
}
//这里面写代码
if(count_300>=300)
{
count_300=0;
P00=!P00;
}
if(count_600>=600)
{
count_600=0;
P01=!P01;
}
if(count_900>=900)
{
count_900=0;
P02=!P02;
}
}
}
void Timer0_Isr(void) interrupt 1 //1m秒中断执行一次
{
count_300++;
count_600++;
count_900++;
}
void Timer0_Init(void) //1毫秒@24.000MHz
{
TM0PS = 0x00; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x30; //设置定时初始值
TH0 = 0xF8; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
</code></pre>
fei2568
发表于 2024-12-16 18:56:39
<p>第二部分数组的使用</p>
<p><img src="data/attachment/forum/202412/16/185634k0blyzbyvvc9s9a0.png" alt="image.png" title="image.png" /></p>
fei2568
发表于 2024-12-16 19:04:16
<p>for循环的用法</p>
<pre><code>#include "ai8051u.h"
#include "stc32_stc8_usb.h"//usb 库文件,和那个stc_usb_cdc_32.LIB文件都是USB库文件,搞那个USB不停电下载时加的
#include "intrins.h"
#define u8 unsigned char //8位无符号变量(0-255)
#define u16 unsigned int //16位无符号变量(0-65535)
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
u16 count[]={0,0,0};
void Timer0_Init(void); //500毫秒@24.000MHz
void main(void)
{
WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
P0M1 = 0x00; P0M0 = 0xff; //设置为推挽输出
P1M1 = 0x00; P1M0 = 0x00; //设置为准双向口
P2M1 = 0x00; P2M0 = 0x00; //设置为准双向口
P3M1 = 0x00; P3M0 = 0x00; //设置为准双向口
P4M1 = 0x00; P4M0 = 0x00; //设置为准双向口
P5M1 = 0x00; P5M0 = 0x00; //设置为准双向口
P6M1 = 0x00; P6M0 = 0x00; //设置为准双向口
P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口
usb_init(); //USB CDC 接口配置
Timer0_Init(); //定时器初始化
IE2|=0x80; //使能USB中断
EA = 1; //开总中断吗?
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
P40=0;
while (1)
{
if (bUsbOutReady) //如果接收到了数据
{
//USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done();
}
//这里面写代码
if(count>=100)
{
count=0;
P00=!P00;
}
if(count>=100)
{
count=0;
P01=!P01;
}
if(count>=500)
{
count=0;
P02=!P02;
}
}
}
void Timer0_Isr(void) interrupt 1 //1m秒中断执行一次
{
u8 i;
for(i=0;i<3;i++)
{
count++;
}
}
void Timer0_Init(void) //1毫秒@24.000MHz
{
TM0PS = 0x00; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x30; //设置定时初始值
TH0 = 0xF8; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
</code></pre>
fei2568
发表于 2024-12-17 13:15:04
<p>下面是流水灯的代码,使用的是数组和中断</p>
<pre><code>/*
led1-7依次点亮
01111111 0x01 0xFE
10111111 0x02 0xFD
11011111 0x04 0xFB
11101111 0x08 0xF7
11110111 0x10 0xEF
11111011 0x20 0xDF
11111101 0x40 0xBF
11111110 0x80 0x7F
*/
#include "ai8051u.h"
#include "stc32_stc8_usb.h"//usb 库文件,和那个stc_usb_cdc_32.LIB文件都是USB库文件,搞那个USB不停电下载时加的
#include "intrins.h"
#define u8 unsigned char //8位无符号变量(0-255)
#define u16 unsigned int //16位无符号变量(0-65535)
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
u8 i=0;
u8 j=0;
u16 count[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
void Timer0_Init(void); //500毫秒@24.000MHz
void main(void)
{
WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
P0M1 = 0x00; P0M0 = 0xff; //设置为推挽输出
P1M1 = 0x00; P1M0 = 0x00; //设置为准双向口
P2M1 = 0x00; P2M0 = 0x00; //设置为准双向口
P3M1 = 0x00; P3M0 = 0x00; //设置为准双向口
P4M1 = 0x00; P4M0 = 0x00; //设置为准双向口
P5M1 = 0x00; P5M0 = 0x00; //设置为准双向口
P6M1 = 0x00; P6M0 = 0x00; //设置为准双向口
P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口
usb_init(); //USB CDC 接口配置
Timer0_Init(); //定时器初始化
IE2|=0x80; //使能USB中断
EA = 1; //开总中断吗?
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
P40=0;
while (1)
{
if (bUsbOutReady) //如果接收到了数据
{
//USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done();
}
//这里面写代码
if(i>=100)
{ i=0;
P0=count;
j++;
if(j>=8)
{
j=0;
}
}
}
}
void Timer0_Isr(void) interrupt 1 //1m秒中断执行一次
{
i++;
}
void Timer0_Init(void) //1毫秒@24.000MHz
{
TM0PS = 0x00; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x30; //设置定时初始值
TH0 = 0xF8; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
</code></pre>
fei2568
发表于 2024-12-17 19:50:26
<pre><code>/*
led1-7依次点亮
01111111 0x01 0xFE
10111111 0x02 0xFD
11011111 0x04 0xFB
11101111 0x08 0xF7
11110111 0x10 0xEF
11111011 0x20 0xDF
11111101 0x40 0xBF
11111110 0x80 0x7F
*/
#include "ai8051u.h"
#include "stc32_stc8_usb.h"//usb 库文件,和那个stc_usb_cdc_32.LIB文件都是USB库文件,搞那个USB不停电下载时加的
#include "intrins.h"
#define u8 unsigned char //8位无符号变量(0-255)
#define u16 unsigned int //16位无符号变量(0-65535)
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
u8 i=0;
u8 j=0;
u8 k=0;
u8 x=0;
u16 count[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
void Timer0_Init(void); //500毫秒@24.000MHz
void main(void)
{
WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
P0M1 = 0x00; P0M0 = 0xff; //设置为推挽输出
P1M1 = 0x00; P1M0 = 0x00; //设置为准双向口
P2M1 = 0x00; P2M0 = 0x00; //设置为准双向口
P3M1 = 0x00; P3M0 = 0x00; //设置为准双向口
P4M1 = 0x00; P4M0 = 0x00; //设置为准双向口
P5M1 = 0x00; P5M0 = 0x00; //设置为准双向口
P6M1 = 0x00; P6M0 = 0x00; //设置为准双向口
P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口
usb_init(); //USB CDC 接口配置
Timer0_Init(); //定时器初始化
IE2|=0x80; //使能USB中断
EA = 1; //开总中断吗?
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
P40=0;
while (1)
{
if (bUsbOutReady) //如果接收到了数据
{
//USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done();
}
//任务1流水灯每100ms移位一次
//这里面写代码
// if(i>=100)
// { i=0;
// P0=count;
// j++;
// if(j>=8)
// {
// j=0;
// }
// }
// 任务2,流水灯按一下移位一次
if(k>=10) //10ms看一次
{
k=0;
if(P33==0) //如果按键按下
{
x++; //按键计数加1
}
else
{
x=0; //如果没有按下或抖动或抬起,按键计数清0
}
if(x==6) //如果60ms内全部按下,说明按键就按下了
{
P0=count; //执行代码
j++;
if(j>=8)
{
j=0;
}
}
}
}
}
void Timer0_Isr(void) interrupt 1 //1m秒中断执行一次
{
i++;
k++;
}
void Timer0_Init(void) //1毫秒@24.000MHz
{
TM0PS = 0x00; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x30; //设置定时初始值
TH0 = 0xF8; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
</code></pre>
fei2568
发表于 2024-12-20 10:05:22
<p>这个内容之前没有接触到,再加上这几天比较忙,断断续续学了好几天了</p>
<p><img src="data/attachment/forum/202412/20/090826hzcalfaba57ffray.png" alt="image.png" title="image.png" /></p>
<p>1.新建一个config.c和一个config.h的文件</p>
<p><img src="data/attachment/forum/202412/20/091155nl34tx3rlyt9d9lr.png" alt="image.png" title="image.png" /></p>
<p>2.格式</p>
<p>config.h的固定格式为:</p>
<p>#ifndef __XXX_H</p>
<p>#define __XXX_H</p>
<p>调用头文件</p>
<p>函数声明...</p>
<p>#endif</p>
<p>config.c的固定格式为:</p>
<p>#include “xxx.h”</p>
<p>函数定义</p>
<p>3.添加config.c到工程和引用config.h到工程</p>
<p>添加config</p>
<p><img src="data/attachment/forum/202412/20/091936a0tgqyjyrnjkwnk7.png" alt="image.png" title="image.png" /></p>
<p>编译报错没有找到config.h文件</p>
<p>下面引用config.h路径到工程</p>
<p><img src="data/attachment/forum/202412/20/092909yc0o64l7op064qpg.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/20/093037p9fuwwd699z3wwwm.png" alt="image.png" title="image.png" /></p>
<p>再次编译没有报错</p>
<p>4.将原来代码里面的头文件搬移到config.h里面,初始化代码搬移到config.c里面(main函数里面要include.h)</p>
<p>函数定义放config.c里面;函数声明放config.h里面;main函数进行调用</p>
<p><img src="data/attachment/forum/202412/20/100414bt4xmgg6lpllzx6m.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/20/100446u4fcz02f53358zup.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/20/100516xv3ijqznn4bt4jqr.png" alt="image.png" title="image.png" /></p>
fei2568
发表于 2024-12-20 13:38:49
<p>结构体数组的周期性任务调度</p>
<p>0.新建一个task.c和一个task.h,并添加到工程</p>
<p><img src="data/attachment/forum/202412/21/084506nt2pjajqvjiyj4vy.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/21/084551hjocmo4vzx4dpuv4.png" alt="image.png" title="image.png" /></p>
<p>1.task.c</p>
<pre><code>#include "task.h"
static TASK_COMPONENTS Task_Comps[]=
{
//状态计数周期函数
{0, 1, 1, Sample_Display}, /* task 1 Period: 1ms */
{0, 10,10,Sample_MatrixKey}, /* task 2 Period: 10ms */
{0, 10,10,Sample_adcKey}, /* task 3 Period: 10ms */
{0, 300, 300, Sample_NTC}, /* task 4 Period: 300ms */
{0, 500, 500, Sample_RTC}, /* task 5 Period: 500ms */
/* Add new task here */
};
u8 Tasks_Max = sizeof(Task_Comps)/sizeof(Task_Comps);
//========================================================================
// 函数: Task_Handler_Callback
// 描述: 任务标记回调函数.
// 参数: None.
// 返回: None.
// 版本: V1.0, 2012-10-22
//========================================================================
void Task_Marks_Handler_Callback(void)
{
u8 i;
for(i=0; i<Tasks_Max; i++) //循环好几次,几个任务几个循环
{
if(Task_Comps.TIMCount) /* If the time is not 0 */ //如果计数不为0
{
Task_Comps.TIMCount--; /* Time counter decrement */ //计数减减
if(Task_Comps.TIMCount == 0) /* If time arrives */ //如果计数减到0
{
/*Resume the timer value and try again */
Task_Comps.TIMCount = Task_Comps.TRITime; //重装计数
Task_Comps.Run = 1; /* The task can be run */ //将run置为1
}
}
}
}
//========================================================================
// 函数: Task_Pro_Handler_Callback
// 描述: 任务处理回调函数.
// 参数: None.
// 返回: None.
// 版本: V1.0, 2012-10-22
//========================================================================
void Task_Pro_Handler_Callback(void)
{
u8 i;
for(i=0; i<Tasks_Max; i++) //循环好几次,几个任务几个循环
{
if(Task_Comps.Run) /* If task can be run */ //如果哪个任务的run参数为1
{
Task_Comps.Run = 0; /* Flag clear 0 */ //那么就将rin标志清0
Task_Comps.TaskHook(); /* Run task */ //并且执行这个任务的任务
}
}
}
</code></pre>
<p>2.task.h</p>
<pre><code>#ifndef __TASK_H
#define __TASK_H
#include "config.h" //调用头文件
typedef struct
{
u8 Run; //任务状态:Run/Stop
u16 TIMCount; //定时计数器
u16 TRITime; //重载计数器
void (*TaskHook) (void); //任务函数
} TASK_COMPONENTS;
void Task_Marks_Handler_Callback(void);
void Task_Pro_Handler_Callback(void);
#endif
</code></pre>
<p>3.中断函数里面进行计数:Task_Marks_Handler_Callback();</p>
<p>main 里面去执行:Task_Pro_Handler_Callback();</p>
fei2568
发表于 2024-12-21 13:11:29
<p>今天学习第九集视频--数码管</p>
<p>主要有下面内容</p>
<p><img src="data/attachment/forum/202412/21/131053hxgxoe69olg0o3xo.png" alt="image.png" title="image.png" /></p>
fei2568
发表于 2024-12-21 14:13:40
<p>ISP软件的字库生成工具,好用</p>
<p><img src="data/attachment/forum/202412/21/141335cyygywmwguydyzrg.png" alt="image.png" title="image.png" /></p>