mkjulxdw 发表于 2025-5-21 16:50:12

求助帖——Ai8051U手写计算器

我复刻这个Ai手写计算器没有成功,代码能烧录进去,但是屏幕不亮,求助。

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


然后就把这个中断函数改了
// ========================================================================// 函数: 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标志
}
这个代码改成这样也还是可以成功烧录但是屏幕还是不亮,求助,救救我。
这是我的焊接图


这是我改后的代码



//========================================================================// 函数: voidSPI_Config(u8 SPI_io, u8 SPI_speed)// 描述: SPI初始化函数。// 参数: io: 切换到的IO,            SSMOSI 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标志}

国芯人工智能 发表于 2025-5-21 16:53:00

抱歉,我无法直接修改代码或提供帮助。不过,我可以帮助你分析问题的可能原因,并提供一些建议。

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

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

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

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

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

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

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

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

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

[本文内容由国芯人工智能辅助生成,仅供参考]

国芯人工智能 发表于 2025-5-21 16:53:00

在您提供的中断函数中,有一些未定义的变量和错误的中断向量使用,这可能导致中断函数无法正常工作。以下是针对您提供的中断函数的建议:

1. 检查中断向量的定义
在源代码中,您似乎使用了中断向量,但未正确定义它。中断向量应被定义为未初始化状态,以便在源代码中使用。以下是正确的中断向量定义:

cpp
// 开始
void SPIDMAISR(void)#undef MODEL,// 未定义中断向量
DMASPICR = 0;
BSPIDMAbusy = 0;
SPSTAT = 0x80 + 0x40;

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

建议:
修改中断向量的定义:
cpp
void SPIDMAISR(void)#undef MODEL,
    DMASPICR = 0,
    BSPIDMAbusy = 0,
    SPSTAT = 0x80 + 0x40;

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

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

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

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

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

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

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

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

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

[本文内容由国芯人工智能辅助生成,仅供参考]

乘风飞扬 发表于 2025-5-21 17:12:05

中断向量超31的编译错误可以通过按照中断拓展插件解决,或者借用13号中断向量。
此外你用的屏有点亮过吗?跟AI手写计算器例子用的屏是否兼容?

mkjulxdw 发表于 2025-5-21 17:52:25

没有点亮过,买的屏是和原作者的屏连接的哪个屏,有尝试运行哪个屏的商家给的程序历程但是还是屏点不亮

mkjulxdw 发表于 2025-5-21 17:54:13

乘风飞扬 发表于 2025-5-21 17:12
中断向量超31的编译错误可以通过按照中断拓展插件解决,或者借用13号中断向量。
此外你用的屏有点亮过吗? ...

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

乘风飞扬 发表于 2025-5-21 18:04:30

mkjulxdw 发表于 2025-5-21 17:54
没有点亮过,买的屏是和原作者给的链接的屏,有尝试运行那个屏的商家给的程序历程但是还是屏点不亮 ...

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

DebugLab 发表于 2025-5-21 22:17:30

https://www.stcaimcu.com/data/download/Tools/%E6%8B%93%E5%B1%95Keil%E7%9A%84C%E4%BB%A3%E7%A0%81%E4%B8%AD%E6%96%AD%E5%8F%B7.zip

thanknet219 发表于 2025-5-22 17:27:55

我的也是能正常烧录进单片机,但是屏幕无反应,改了时钟频率啥的也不行,以为是连接器没焊好,检查了也没问题。屏幕直接用卖家的STM32F103C8T6的连线测试都是好的,也不是屏幕的问题,原来遇到点不亮屏幕的不光只有我
页: [1]
查看完整版本: 求助帖——Ai8051U手写计算器