矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: pdshyh

矩阵按键延时函数和switch(key)语句冲突

[复制链接]
     
 楼主| 发表于 2020-11-7 17:08:53 | 显示全部楼层
chhds 发表于 2020-11-7 15:16
MCP4822以前是用Arduino控制的,今天有空改了一个,手上只有STC15W408AS,测试通过,但写得简陋,只作参 ...

谢谢chhds老师专门把Arduino控制修改为Keil c,已下载在看,编辑器是Keil uVision4运行卡,准备Keil c学习完转到Arduino。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-11-9 10:36:28 | 显示全部楼层
chhds 发表于 2020-11-7 15:16
MCP4822以前是用Arduino控制的,今天有空改了一个,手上只有STC15W408AS,测试通过,但写得简陋,只作参 ...

chhds  老师您好,看您示例是模块化编程昨天补课跟着书本学习了c模块化编程部分 ,现在正在看您给的示例,软件打开一直卡,通过文本文件看.c和.h文件,发现少了一个intrins.h文件,可能这个原因造成Keil uVision4打开这个示例卡的原因,能否提供intrins.h文件谢谢。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-11-9 11:32:40 | 显示全部楼层
IRF540 发表于 2020-11-6 16:41
那不就是个警告么,一般不理会,愿意加Void或者加个返回值也行 , 按说一样可以生成HEX,用的什么版本编译 ...

O(∩_∩)O哈哈~谢谢,昨天又做I2C读写24C04书本示例时也是出现警告是6个,特意生成HEX可以。上次不能生成HEX文件不再手头回头在试试,还是刚刚接触什么都不熟练。

补充内容 (2020-11-10 08:13):
重新把矩阵按键程序中的延时函数加 的void取消,出现一个警告后运行可以生成HEX。
回复 支持 反对

使用道具 举报

     
发表于 2020-11-9 13:12:54 | 显示全部楼层
pdshyh 发表于 2020-11-9 10:36
chhds  老师您好,看您示例是模块化编程昨天补课跟着书本学习了c模块化编程部分 ,现在正在看您给的示 ...

我用的是Keil5,那个h文件可能不是在这个文件夹里的,你把MCP4822.h.c加到你的工程里试试
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-11-9 16:06:52 | 显示全部楼层
chhds 发表于 2020-11-9 13:12
我用的是Keil5,那个h文件可能不是在这个文件夹里的,你把MCP4822.h.c加到你的工程里试试

chhds您好, MCP4822是贴片还没焊接,跟书学习是STC52+Keil3,我用的是STC52+Keil4软件命令位置稍有不同其它都一样,看您Delay.c,支持1~255ms. 自动适应主时钟.和书本示例偏差大,MCP4822.h能看明白,
main.c的
void main(void)
{
              .....
                setVoltage(0, 4000);
                .....
}
setVoltage(0, 4000)参数作用没明白,主要是MCP4822.c没看明白,知道SPI_init();等是通信函数setVoltage(0, 4000);是DA转换控制MCP4822,MCP4822.c的SPI通信部分也和书本示例偏差大,STC15+Keil5是否有好多函数直接使用就行,书本STC52+Keil3的SPI通信是软件根据时序软件控制的,差别比较大。
回复 支持 反对

使用道具 举报

     
发表于 2020-11-10 09:29:45 | 显示全部楼层
pdshyh 发表于 2020-11-9 16:06
chhds您好, MCP4822是贴片还没焊接,跟书学习是STC52+Keil3,我用的是STC52+Keil4软件命令位置稍有不同 ...

setVoltage(0, 4000);---------0:设置MCP4822通道A输出(1:设置通道B输出);4000:设置MCP4822输出4000mV(数值在0-4095之间)

买个这样的座,可以很方便测试贴片集成块
IMG_20201110_074809.jpg
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-11-10 11:15:56 | 显示全部楼层
chhds 发表于 2020-11-10 09:29
setVoltage(0, 4000);---------0:设置MCP4822通道A输出(1:设置通道B输出);4000:设置MCP4822输出400 ...

谢谢,烧录座刚刚下单买了一个16位的,昨天把MCP4822中文数据表截屏打印阅读,明白void setVoltage(u8 channel, u16 mv)的前半部把设置和电压数据读到command

        u16 command = 0;
        command |= channel << 15;        //0:通道A   1:通道B
        ......
        MCP4822_CS = 0;
        SPI_write(command>>8);
        SPI_write(command&0xFF);
        while(!(SPSTAT & SPIF));
        MCP4822_CS = 1;
SPI_write()写有点没弄明白,为什么移位等等操作,在看看书本的SPI通信示例。
还有void SPI_init(void)下面的SPI设置函数没找到.......
{
        SPI_Master();                //设为主机
        .......
        SPI_Enable();                //1: 允许SPI
       
        SPDAT = 0;
}
感谢chhds 老师指教,刚刚接触空白点太多。

补充内容 (2020-11-10 17:13):
intrins.h文件是C51单片机编程中函数文件找到了,卡应该是低版本软件问题。

补充内容 (2020-11-11 08:29):
刚刚看到   SPI_Master();   //设为主机      
        SPI_Enable();                //1: 允许SPI
         这些都是STC15自带的SPI的内部函数,在STC15Fxxxx.H中找到了,还有AD,c51的reg52.h特别简单。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-11-11 15:27:23 | 显示全部楼层
chhds 发表于 2020-11-7 15:16
MCP4822以前是用Arduino控制的,今天有空改了一个,手上只有STC15W408AS,测试通过,但写得简陋,只作参 ...

chhds 老师好这个是STC15或者 STM8/32 带硬件SDI的示例,我也专门买了片STC15F2K60S2-28就是手工太差,参照您的示例和书本DS1302时钟芯片SDI通信的例子比葫芦画瓢编程还没测试运行有几个警告。
#include<reg52.h>   //包含52系列单片机头文件
#include<intrins.h>   //包含52系列单片机函数头文件
#define uchar unsigned char  //为宏定义,把unsigned char用uchar表示,方便书写
#define uint unsigned int     //为宏定义,把unsigned int用uint表示,方便书写
sbit MCP4822_SCL = P2^5;                //SCLK
sbit MCP4822_LDAC = P2^4;                //LDAC
sbit MCP4822_SDI = P2^3;           //SDI
sbit MCP4822_CS = P2^2;            //cs
void setVoltage(uchar config, uint dat)          
{
        uint command = 0;
                uchar i;
                command |= config << 12;        //config 0x01 --A通道 x2最高输出4096mV  关闭输出  0x00
                //config 0x03 --A通道 x1最高输出2048mV  关闭输出  0x02
                //config 0x09 --B通道 x2最高输出4096mV  关闭输出  0x08
        command |= (dat & 0x0FFF);        //config 0x0b --B通道 x1最高输出2048mV        关闭输出 0x0b   设置和数据到command
        MCP4822_CS =1;  //刚开始MCP4822_CS为高电平
        MCP4822_LDAC =1 ;        //MCP4822_LDAC为高电平
        MCP4822_SCL =0;     //刚开始MCP4822_SCL为低平
        MCP4822_CS = 0;;      //ce变为低电平,允许单片机向MCP4822中的寄存器写入设置参数和数据
        _nop_();   //稍微延时(一个机器周期)

        for (i=0; i<16;i++)
        {
                 MCP4822_SCL=0  ;
                  //MCP4822_SDI=command&0x80>>15 ;
                  command=command<<1 ;
                  MCP4822_SDI=CY;          // command<<1高位溢出最高位自动寄存在CY
                  MCP4822_SCL=1 ;                 //config 0x09 --B通道 x2最高输出4096mV  关闭输出  0x08
        }
       
        MCP4822_CS = 1;    //设置参数和数据写完之后,把MCP4822_CS拉高,防止对写入的数据进行误操作
        _nop_();  //稍微延时
        MCP4822_SDI=1;     //释放MCP4822_SDI数据线
        MCP4822_SCL=1;   //释放sclk时钟线
        MCP4822_LDAC=0;        //输入存储器数据传递到DAC存储器。
      MCP4822_LDAC=1;
}
处理后还有两个
Build target 'Target 1'
compiling MCP4822.c...
linking...
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?PR?_SETVOLTAGE?MCP4822
*** WARNING L10: CANNOT DETERMINE ROOT SEGMENT
Program Size: data=8.0 xdata=0 code=56
"MCP4822" - 0 Error(s), 2 Warning(s).
在线翻译:***警告L16:未分类的段,忽略了覆盖过程
     区隔:?PR?_SETVOLTAGE?MCP4822
***警告L10:无法确定根段
MCP4822写是由高位依次到低位我用左移后MCP4822_SDI=command&0x80>>15 ;还有command<<1左移后高位进入 MCP4822_SDI=CY有点拿不准。
回复 支持 反对

使用道具 举报

     
发表于 2020-11-11 19:31:37 | 显示全部楼层
这两个警告在线翻译不准确,你可以把警告或错误的内容复制到百度上搜索一下,就知道意思,也有解决办法了。
回复 支持 反对

使用道具 举报

     
发表于 2020-11-11 19:48:10 | 显示全部楼层
case 语句最后加一句case else:   吧
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-11-12 10:24:59 | 显示全部楼层
chhds 发表于 2020-11-11 19:31
这两个警告在线翻译不准确,你可以把警告或错误的内容复制到百度上搜索一下,就知道意思,也有解决办法了。

谢谢,百度后基本知道意思,也有解决办法,发现少了main ()主函数
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-11-12 10:26:05 | 显示全部楼层
wiisir 发表于 2020-11-11 19:48
case 语句最后加一句case else:   吧

谢谢,对用到case 注意。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-28 04:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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