找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 238|回复: 19
收起左侧

有没有大佬帮我看看这代码错在哪里,for附件的语法错误在哪里,求告知

[复制链接]
ID:1134495 发表于 2024-11-2 14:05 | 显示全部楼层 |阅读模式
#include <REGX52.H>
#include "Delay.h"
#include "MatrixKey.h"    //包含矩阵键盘头文件

#define uchar unsigned char
unsigned char KeyNum;
uchar key_scan(void);
//数码管段码表
unsigned code seg[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//uchar dis[8]={0,1,2,3,4,5,6,7};
uchar chocode[8]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
//数码管显示子函数

uchar  i,p,temp;
unsigned char displayIndex;
unsigned char PORT_DISPLAY;
unsigned char inputIndex;
unsigned char password[6]={0};
void DisplayDigit(unsigned char digit, unsigned char position);



int main()
{
    unsigned char keyValue;
    while (1)
    {
        keyValue = MatrixKey();
        if (keyValue > 0 && keyValue <= 9 && inputIndex < 6)
        {
            password[inputIndex] = keyValue;
            DisplayDigit(keyValue, inputIndex);
            inputIndex++;
        }
    }
    return 0;
}


3FFC9676B897FF87536AA2170C04DA5C.png
5E0AF59A75846D5A5F0198A8BB20E831.png
回复

使用道具 举报

ID:1134495 发表于 2024-11-2 14:32 | 显示全部楼层
我想实现的是,按下一个键,显示一位,按下第2次的键盘,再显示一位
回复

使用道具 举报

ID:192020 发表于 2024-11-2 15:12 | 显示全部楼层
删掉for里面的unchar试试,i重复定义了。26行定义了一遍。还有没打勾c99的话29行应该也会报错
回复

使用道具 举报

ID:1134495 发表于 2024-11-2 15:20 | 显示全部楼层
Graves 发表于 2024-11-2 15:12
删掉for里面的unchar试试,i重复定义了。26行定义了一遍。还有没打勾c99的话29行应该也会报错

解决了大佬,我这个代码为啥不能显示多位,现在是按1显示1,第2次按2只在数码管2这里显示2,之前的1没有一起显示,请问您实现这样的一起显示应该怎么做?
回复

使用道具 举报

ID:192020 发表于 2024-11-2 15:42 | 显示全部楼层
陶小陶 发表于 2024-11-2 15:20
解决了大佬,我这个代码为啥不能显示多位,现在是按1显示1,第2次按2只在数码管2这里显示2,之前的1没有 ...

没有原理图,不知道硬件怎么搭的,程序也不知道你用图片的还是文字里面的。如果是图片的我猜是uchar dis[8]={0,1,2,3,4,5,6,7};这里的问题
回复

使用道具 举报

ID:1134495 发表于 2024-11-2 16:24 | 显示全部楼层
Graves 发表于 2024-11-2 15:42
没有原理图,不知道硬件怎么搭的,程序也不知道你用图片的还是文字里面的。如果是图片的我猜是uchar dis[ ...

图片和文字是一样的
3111B40268E709968B1DF14AB25F7A02.png
回复

使用道具 举报

ID:1134495 发表于 2024-11-2 16:51 | 显示全部楼层
Graves 发表于 2024-11-2 15:42
没有原理图,不知道硬件怎么搭的,程序也不知道你用图片的还是文字里面的。如果是图片的我猜是uchar dis[ ...

不知道为什么原理图发不出,图片和文字是一样的,段码连的p0,位码p2,加多了个138译码器,我想实现输入1时是000001,再输入2时是000012,这样子
回复

使用道具 举报

ID:1109793 发表于 2024-11-2 17:18 | 显示全部楼层
你是说按123,显示123这样?
回复

使用道具 举报

ID:1134495 发表于 2024-11-2 21:12 | 显示全部楼层
xiaobendan001 发表于 2024-11-2 17:18
你是说按123,显示123这样?

差不多,按其他的也是,按什么就一起显示
回复

使用道具 举报

ID:59202 发表于 2024-11-2 21:36 | 显示全部楼层
一个问题别发几个帖子啊,最好把程序都贴上来,你这上下两处的程序都不一样呢
回复

使用道具 举报

ID:1134495 发表于 2024-11-2 21:42 | 显示全部楼层
xxxevery 发表于 2024-11-2 21:36
一个问题别发几个帖子啊,最好把程序都贴上来,你这上下两处的程序都不一样呢

对不起啊,我第一次用,那个代码我复制错了,本来是一样的,程序是图片的那个
回复

使用道具 举报

ID:349276 发表于 2024-11-2 22:57 | 显示全部楼层
你这图哪里来的,复位电阻取8.2k真的可以么?
回复

使用道具 举报

ID:1134495 发表于 2024-11-2 23:08 | 显示全部楼层
万家灯火51 发表于 2024-11-2 22:57
你这图哪里来的,复位电阻取8.2k真的可以么?

我照网上的连的,不太懂
回复

使用道具 举报

ID:1109793 发表于 2024-11-3 08:36 | 显示全部楼层
万家灯火51 发表于 2024-11-2 22:57
你这图哪里来的,复位电阻取8.2k真的可以么?

你说应该是多少?我用10K的
回复

使用道具 举报

ID:1109793 发表于 2024-11-3 08:38 | 显示全部楼层
如果是数字,就比较简单,int num;
然后每次按键就num*10+按键的数就行了。
回复

使用道具 举报

ID:1132991 发表于 2024-11-3 09:37 | 显示全部楼层
陶小陶 发表于 2024-11-2 23:08
我照网上的连的,不太懂

这个论坛里有A2开发板的仿真文件
还有可以把数码管显示做成含两个参数的函数
例如show(a,b)a代表在哪一位显示,b代表显示什么数字
回复

使用道具 举报

ID:1133081 发表于 2024-11-3 14:51 | 显示全部楼层
发表于 2024-11-2 16:24
图片和文字是一样的

按你的图写的程序
无标题.jpg

  1. #include <reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. uchar  code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00};
  5. uchar data dis_buf[]={10,10,10,10,10,10,10,10,10};
  6. uchar key=0;//键值变量

  7. void delayms(uint k)
  8. {
  9.         uint i,j;
  10.         for(i=k;i>0;i--)
  11.                 for(j=115;j>0;j--);
  12. }
  13. void key_scan()                                        //按键扫描程序
  14. {
  15.         static bit sign=0;                        //按键自锁标志
  16.         static uint count=0;                //消抖计数变量                        
  17.         uchar num=0,i;                                //临时变量
  18.         P1=0xf0;                                        //赋值P1 1111 0000
  19.         if(P1!=0xf0)                                //检测有按键按下
  20.         {
  21.                 if((++count>=20)&&(sign==0))        //消抖计数10~1000,根据主循环周期调整约10~20ms
  22.                 {                        
  23.                         sign=1;                                //按键自锁标志置1
  24.                         num=P1;                                //保存P1值xxxx 0000,x为0或1
  25.                         num|=0x0f;                        //保存num按位或0x0f值xxxx 1111
  26.                         P1=num;                                //赋值P1 xxxx 1111
  27.                         num=P1;                                //保存P1值xxxx xxxx
  28.                         switch(num)
  29.                         {
  30.                                 case 0xee: key= 0; break;
  31.                                 case 0xde: key= 1; break;
  32.                                 case 0xbe: key= 2; break;
  33.                                 case 0x7e: key= 3; break;
  34.                                 case 0xed: key= 4; break;
  35.                                 case 0xdd: key= 5; break;
  36.                                 case 0xbd: key= 6; break;
  37.                                 case 0x7d: key= 7; break;
  38.                                 case 0xeb: key= 8; break;
  39.                                 case 0xdb: key= 9; break;
  40.                                 default:   key=10; break;
  41. //                                case 0xbb: key=10; break;
  42. //                                case 0x7b: key=11; break;
  43. //                                case 0xe7: key=12; break;
  44. //                                case 0xd7: key=13; break;
  45. //                                case 0xb7: key=14; break;
  46. //                                case 0x77: key=15; break;
  47.                         }
  48.                         dis_buf[8]=key;
  49.                         for(i=0;i<8;i++)
  50.                                 dis_buf[i]=dis_buf[i+1];
  51.                 }
  52.         }
  53.         else                                                //键抬起
  54.         {
  55.                 sign=0;                                //按键自锁标志清0
  56.                 count=0;                                //消抖计数清0
  57.         }
  58. }

  59. void display()                                        //数码管显示程序
  60. {
  61.         static uchar i;
  62.         P0=0x00;
  63.         P2&=0xf8;
  64.         P2|=i;
  65.         P0=table[dis_buf[i]];
  66.         i=++i%8;
  67. }

  68. void main()                                                //主函数
  69. {
  70.         while(1)
  71.         {
  72.                 key_scan();                                //按键扫描程序
  73.                 display();                                //数码管显示0~9
  74.                 delayms(1);                                //延时控制主循环周期约1ms
  75.         }
  76. }
复制代码



回复

使用道具 举报

ID:1134495 发表于 2024-11-3 21:53 | 显示全部楼层
WL0123 发表于 2024-11-3 14:51
按你的图写的程序

可以的!谢谢大佬!!
回复

使用道具 举报

ID:1134495 发表于 2024-11-3 22:15 | 显示全部楼层
WL0123 发表于 2024-11-3 14:51
按你的图写的程序

大佬,我想请问一下,按到后面之后的按键,闪烁的情况严重了,这种应该怎么解决,我昨天搞的一个也是这种情况
回复

使用道具 举报

ID:1135535 发表于 2024-11-5 09:37 | 显示全部楼层
删掉for里面的unchar试试,i重复定义了。26行定义了一遍。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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