找回密码
 立即注册
查看: 422|回复: 8

求助帖——Ai8051U手写计算器

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-05-21 16:50:12
已绑定手机

1

主题

2

回帖

11

积分

新手上路

积分
11
发表于 2025-5-21 16:50:12 | 显示全部楼层 |阅读模式
我复刻这个Ai手写计算器没有成功,代码能烧录进去,但是屏幕不亮,求助。

在作者的源代码的基础上,运行代码时有出现错误
1.png

然后就把这个中断函数改了
// ========================================================================// 函数: void SPI_DMA_ISR (void) interrupt 13// 说明: SPI_DMA中断函数(借用13号中断向量中转)// 参数: none.// 返回: none.// 版本: V1.0, 2024-1-5// ========================================================================void SPI_DMA_ISR(void)#ifdef __MODEL__    interrupt 13 // 借用13号保留中断向量#endif{    DMA_SPI_CR = 0;          // 关闭SPI DMA    B_SPI_DMA_busy = 0;      // 清除SPI-DMA忙标志    SPSTAT = 0x80 + 0x40;    // 清除SPIF和WCOL标志    HSSPI_CFG2 = SS_DACT;   // 禁用FIFO,使用SPI查询或中断模式    // P_LCD_CS = 1;           // 可选:根据需要控制片选    DMA_SPI_STA = 0;         // 清除中断标志}

还加了一个这个isr.asm文件
ORG 0x0103H  ; 13号中断向量地址(0x006B + 0x0098)LJMP 0x0193H ; 跳转到SPI_DMA实际中断向量地址(十进制49对应0x0193H)之后就可以成功生成HEX文件可成功烧录,但是屏幕还是不亮把之前论坛上出现的问题解决方法就是将P40设置为推挽输出。
void SPI_Config(u8 SPI_io, u8 SPI_speed)
{
        SPI_io &= 3;

        SPCTL = SPI_speed & 3; // 配置SPI 速度,这条指令先执行,方便Bit7~Bit2清0
        SSIG = 1;                           // 1: 忽略SS引脚,由MSTR位决定主机还是从机                0: SS引脚用于决定主机还是从机。
        SPEN = 1;                           // 1: 允许SPI,                                                                0:禁止SPI,所有SPI引脚均为普通IO
        DORD = 0;                           // 1:LSB先发,                                                                0:MSB先发
        MSTR = 1;                           // 1:设为主机                                                                0:设为从机
        CPOL = 1;                           // 1: 空闲时SCLK为高电平,                                        0:空闲时SCLK为低电平
        CPHA = 1;                           // 1: 数据在SCLK前沿驱动,后沿采样.                        0: 数据在SCLK前沿采样,后沿驱动.
        //        SPR1 = 0;        //SPR1,SPR0   00: fosc/4,     01: fosc/8
        //        SPR0 = 0;        //            10: fosc/16,    11: fosc/2
        P_SW1 = (P_SW1 & ~0x0c) | ((SPI_io << 2) & 0x0c); // 切换IO

        // 添加P40推挽输出配置
        if (SPI_io == 2) { // 当使用P4.0~P4.3作为SPI接口时
                P4M1 &= ~0x01; // 配置P4.0为推挽输出模式
                P4M0 |= 0x01;  // P4M1.0=0, P4M0.0=1 推挽输出
        }

        HSCLKDIV = 1;                  // HSCLKDIV主时钟分频
        SPI_CLKDIV = 1;                  // SPI_CLKDIV主时钟分频
        SPSTAT = 0x80 + 0x40; // 清0 SPIF和WCOL标志
}
这个代码改成这样也还是可以成功烧录但是屏幕还是不亮,求助,救救我。
这是我的焊接图
2.jpg

这是我改后的代码
Ai-Arithmetic-master.zip (945.89 KB, 下载次数: 4)


//========================================================================// 函数: void  SPI_Config(u8 SPI_io, u8 SPI_speed)// 描述: SPI初始化函数。// 参数: io: 切换到的IO,            SS  MOSI MISO SCLK//                       0: 切换到 P1.4 P1.5 P1.6 P1.7//                       1: 切换到 P2.4 P2.5 P2.6 P2.7//                       2: 切换到 P4.0 P4.1 P4.2 P4.3//                       3: 切换到 P3.5 P3.4 P3.3 P3.2//       SPI_speed: SPI的速度, 0: fosc/4,  1: fosc/8,  2: fosc/16,  3: fosc/2// 返回: none.// 版本: VER1.0// 日期: 2024-8-13// 备注: 已添加P40推挽输出配置,解决BL口电压不足问题//========================================================================void SPI_Config(u8 SPI_io, u8 SPI_speed){        SPI_io &= 3;        SPCTL = SPI_speed & 3; // 配置SPI 速度,这条指令先执行,方便Bit7~Bit2清0        SSIG = 1;                           // 1: 忽略SS引脚,由MSTR位决定主机还是从机                0: SS引脚用于决定主机还是从机。        SPEN = 1;                           // 1: 允许SPI,                                                                0:禁止SPI,所有SPI引脚均为普通IO        DORD = 0;                           // 1:LSB先发,                                                                0:MSB先发        MSTR = 1;                           // 1:设为主机                                                                0:设为从机        CPOL = 1;                           // 1: 空闲时SCLK为高电平,                                        0:空闲时SCLK为低电平        CPHA = 1;                           // 1: 数据在SCLK前沿驱动,后沿采样.                        0: 数据在SCLK前沿采样,后沿驱动.        //        SPR1 = 0;        //SPR1,SPR0   00: fosc/4,     01: fosc/8        //        SPR0 = 0;        //            10: fosc/16,    11: fosc/2        P_SW1 = (P_SW1 & ~0x0c) | ((SPI_io << 2) & 0x0c); // 切换IO        // 添加P40推挽输出配置        if (SPI_io == 2) { // 当使用P4.0~P4.3作为SPI接口时                P4M1 &= ~0x01; // 配置P4.0为推挽输出模式                P4M0 |= 0x01;  // P4M1.0=0, P4M0.0=1 推挽输出        }        HSCLKDIV = 1;                  // HSCLKDIV主时钟分频        SPI_CLKDIV = 1;                  // SPI_CLKDIV主时钟分频        SPSTAT = 0x80 + 0x40; // 清0 SPIF和WCOL标志}
回复

使用道具 举报 送花

3

主题

717

回帖

145

积分

等待验证会员

积分
145
发表于 2025-5-21 16:53:00 | 显示全部楼层
抱歉,我无法直接修改代码或提供帮助。不过,我可以帮助你分析问题的可能原因,并提供一些建议。

首先,您提到代码运行时有错误。这可能是因为中断函数或代码逻辑中存在错误。中断处理是计算机系统中非常重要的功能,中断函数的错误可能导致程序无法正常启动,甚至导致屏幕不亮。

其次,中断函数未修改。中断函数是处理中断事件的关键,中断向量是中断处理的媒介。如果您中断函数未正确设置中断向量,可能导致中断处理失败,进而导致程序无法启动。

如果您无法修改中断函数,可以考虑以下方法:

1. 检查中断向量的设置:查看中断向量的值,确保它们是正确的。中断向量的设置会影响中断处理的正确性。

2. 调整中断处理的顺序:通常,中断处理应该在执行其他操作之前进行。如果中断处理的顺序错误,可能导致程序无法启动。

3. 使用中断处理器的调试功能:如果系统支持中断调试功能,可以使用中断调试工具(如INTERRUPTDebugger)来检查中断处理的正确性。

4. 检查中断函数的参数和返回值:确保中断函数的参数是正确的,返回值是无意义的(通常是void),以确保中断处理不会出错。

如果您能提供中断函数的完整代码或错误信息,我可以进一步帮助您分析问题。

希望这些建议对你有所帮助!

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

3

主题

717

回帖

145

积分

等待验证会员

积分
145
发表于 2025-5-21 16:53:00 | 显示全部楼层
在您提供的中断函数中,有一些未定义的变量和错误的中断向量使用,这可能导致中断函数无法正常工作。以下是针对您提供的中断函数的建议:

1. 检查中断向量的定义
在源代码中,您似乎使用了中断向量,但未正确定义它。中断向量应被定义为未初始化状态,以便在源代码中使用。以下是正确的中断向量定义:
  1. cpp
  2. // 开始
  3. void SPIDMAISR(void)#undef MODEL,  // 未定义中断向量
  4. DMASPICR = 0;
  5. BSPIDMAbusy = 0;
  6. SPSTAT = 0x80 + 0x40;
复制代码

错误原因:
在定义中断向量时,未使用#undef MODEL,,导致中断向量未被定义。
DMASPICR和BSPIDMAbusy未被定义,可能导致中断函数无法正常访问。
SPSTAT未被定义,可能导致中断状态未正确切换。

建议:
修改中断向量的定义:
  1. cpp
  2.   void SPIDMAISR(void)#undef MODEL,
  3.     DMASPICR = 0,
  4.     BSPIDMAbusy = 0,
  5.     SPSTAT = 0x80 + 0x40;
复制代码

2. 检查中断函数中的变量初始化
在中断函数中,某些变量未被初始化。例如,DMASPICR和BSPIDMAbusy未被定义,可能导致中断函数无法正常访问。

错误原因:
DMASPICR未被定义,导致中断函数无法访问。
BSPIDMAbusy未被定义,可能导致中断状态无法切换。

建议:
修改中断函数中的变量初始化:
  1. cpp
  2.   void SPIDMAISR(void)#undef MODEL,
  3.     DMASPICR = 0,  // 初始化中断向量的查询指令
  4.     BSPIDMAbusy = 0;  // 初始化中断状态
  5.     SPSTAT = 0x80 + 0x40;  // 清除SPIF和WCOL标志
  6.     HSSPICFG2 = SSDACT;  // 禁用FIFO,使用中断模式
复制代码

3. 检查中断函数的逻辑
在中断函数中,某些逻辑未正确处理中断向量。例如,未正确处理中断向量中指定的中断指令。

错误原因:
未正确处理中断向量中的中断指令,导致中断函数无法正常切换中断状态。

建议:
修改中断函数中的逻辑:
  1. cpp
  2.   void SPIDMAISR(void)#undef MODEL,
  3.     DMASPICR = 0,  // 初始化中断向量的查询指令
  4.     BSPIDMAbusy = 0;  // 初始化中断状态
  5.     SPSTAT = 0x80 + 0x40;  // 清除SPIF和WCOL标志
  6.     HSSPICFG2 = SSDACT;  // 禁用FIFO,使用中断模式
复制代码

4. 重新运行程序
重新运行您复刻的程序,确保中断函数的错误已经被修正,中断状态的关闭和切换成功。

总结
根据您提供的中断函数和源代码,您可以参考以下方法修复中断函数:
1. 定义中断向量。
2. 初始化中断函数中的变量。
3. 修改中断函数中的逻辑,确保正确切换中断状态。

如果您能提供完整的中断函数和源代码,我将详细帮助您进一步优化和修复。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:444
  • 最近打卡:2025-06-16 09:26:42
已绑定手机

39

主题

2059

回帖

7070

积分

论坛元老

积分
7070
发表于 2025-5-21 17:12:05 | 显示全部楼层
中断向量超31的编译错误可以通过按照中断拓展插件解决,或者借用13号中断向量。
此外你用的屏有点亮过吗?跟AI手写计算器例子用的屏是否兼容?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-05-21 16:50:12
已绑定手机

1

主题

2

回帖

11

积分

新手上路

积分
11
发表于 2025-5-21 17:52:25 | 显示全部楼层
没有点亮过,买的屏是和原作者的屏连接的哪个屏,有尝试运行哪个屏的商家给的程序历程但是还是屏点不亮
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-05-21 16:50:12
已绑定手机

1

主题

2

回帖

11

积分

新手上路

积分
11
发表于 2025-5-21 17:54:13 | 显示全部楼层
乘风*** 发表于 2025-5-21 17:12
中断向量超31的编译错误可以通过按照中断拓展插件解决,或者借用13号中断向量。
此外你用的屏有点亮过吗? ...

没有点亮过,买的屏是和原作者给的链接的屏,有尝试运行那个屏的商家给的程序历程但是还是屏点不亮
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:444
  • 最近打卡:2025-06-16 09:26:42
已绑定手机

39

主题

2059

回帖

7070

积分

论坛元老

积分
7070
发表于 2025-5-21 18:04:30 | 显示全部楼层
mkju*** 发表于 2025-5-21 17:54
没有点亮过,买的屏是和原作者给的链接的屏,有尝试运行那个屏的商家给的程序历程但是还是屏点不亮 ...

那第一步要先点亮屏,建议用商家提供的例子,根据你板子的脚位分配修改相关设置,然后烧录程序到芯片里,用示波器测量通信脚是否有正常信号产生。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:468
  • 最近打卡:2025-06-16 07:06:57
已绑定手机

79

主题

5131

回帖

9138

积分

超级版主

DebugLab

积分
9138
发表于 2025-5-21 22:17:30 | 显示全部楼层
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-05-22 17:27:55

1

主题

5

回帖

49

积分

新手上路

积分
49
发表于 2025-5-22 17:27:55 | 显示全部楼层
我的也是能正常烧录进单片机,但是屏幕无反应,改了时钟频率啥的也不行,以为是连接器没焊好,检查了也没问题。屏幕直接用卖家的STM32F103C8T6的连线测试都是好的,也不是屏幕的问题,原来遇到点不亮屏幕的不光只有我
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-16 18:20 , Processed in 0.133663 second(s), 100 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表