找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1392|回复: 14
收起左侧

请教如何利用P30按键的长按来操作51单片机芯片内的EEPROM,让a得到8至20间的数

[复制链接]
ID:334440 发表于 2022-5-25 01:21 来自手机 | 显示全部楼层 |阅读模式
/*   d1-p31,d2-p32,d3-p33,d4-p34
a-P10,b-P11,c-P12,d-P13,e-P14,f-P15,g-P16,dp-P17
12v to in1 to p37(IN)......P35 is out......P30 is OUT2 */
#include <stc12c20xx.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define FOSC 11059200L
#define T1MS (FOSC/12-1000)
uint a,b,c;

uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

void  cc(uint addr);
void  xcx(uint addr,uchar dat);
uchar dcx(uint addr);
void  Q0();


void delay(uint i)
{
  uint j,k;
  for(j=i;j>0;j--)
    for(k=125;k>0;k--);
}


void display()
{
  
   P1=table[a%10000/1000];         
   P31 = 0;                        
   delay(5);
   P31 = 1;                        

   P1=table[a%1000/100];
   P32 = 0;                        
   delay(5);
   P32 = 1;                        

   P1=table[a%100/10];
   P33 = 0;                        
   delay(5);
   P33 = 1;                        

   P1=table[a%10];
   P34 = 0;                        
   delay(5);
   P34 = 1;               
   
}


void Timer_Init(void)
{
          AUXR &= 0x3F;//00111111
           TMOD = 0x11;
          TL1 = T1MS;
          TH1 = T1MS>>8;
          TF1 = 0;
          ET1 = 1;
}




void main(void)
{
        P1M0 = 0x00;
        P1M1 = 0x00;
  P3M1 = 0x00;
        P3M0 = 0x20;      //00100000
  a=0;
  b=0;
  P35=0;
        c = dcx(0x2002);
  Timer_Init();
               
  while(1)
        {
                if((P37==1)&&(P30==0))
                {
                        delay(5);
                        if((P37==1)&&(P30==0))
                        {                                
                                if(c<8){c==8;cc(0x2000);xcx(0x2002,c);}else;
                                if(c>20){c==8;cc(0x2000);xcx(0x2002,c);}else;
                                cc(0x2000);xcx(0x2002,c);
                                EA=1;
                                TR1=1;                                
                         }else;
                 }else;
        }
}

void cc(uint addr)
{        
// 0x83(??<5M)   0x82(??<10M)   0x81(??<20M)   0x80(??<40M)
    ISP_CONTR = 0x81;  
    ISP_CMD   = 0x03;                  
    ISP_ADDRL = addr;        
    ISP_ADDRH = addr>>8;      
          EA =0;   
    ISP_TRIG = 0x46;         
    ISP_TRIG = 0xB9;         
    _nop_();

    Q0();                                          
}

void xcx(uint addr,uchar dat)
{
    ISP_CONTR = 0x81;                  
    ISP_CMD   = 0x02;              
    ISP_ADDRL = addr;        
    ISP_ADDRH = addr>>8;      
    ISP_DATA  = dat;         
    EA = 0;
    ISP_TRIG = 0x46;         
    ISP_TRIG = 0xB9;         
    _nop_();
    Q0();                                         
}

uchar dcx(uint addr)
{   
    uchar dat;        
          ISP_CONTR = 0x81;                  
    ISP_CMD   = 0x01;         
    ISP_ADDRL = addr;         
    ISP_ADDRH = addr>>8;      
    EA = 0;
    ISP_TRIG = 0x46;         
    ISP_TRIG = 0xB9;         
    _nop_();
    dat = ISP_DATA;                          
        Q0();                                          
        return dat;
}

void Q0()
{
    ISP_CONTR = 0;            
    ISP_CMD   = 0;            
    ISP_TRIG  = 0;            
}


void t1(void) interrupt 3 using 2
{        
        TL1=T1MS;
        TH1=T1MS>>8;
        b++;
        a=c;
  display();  
    if(b>=1000)
          {
                 b=0;
           c++;
                 if(c>20)c=8;else ;
                 }               
  if(P30==1){delay(5);if(P30==1){a=0;TR1=0;}else;}else ;
}
回复

使用道具 举报

ID:334440 发表于 2022-5-25 07:43 | 显示全部楼层
刚验证了一下,是可以用了,把T1MS改为常数64536稳定一些
回复

使用道具 举报

ID:230742 发表于 2022-5-25 12:23 | 显示全部楼层
随机数产生了!恭喜恭喜。
回复

使用道具 举报

ID:334440 发表于 2022-5-26 05:57 来自手机 | 显示全部楼层
啤酒瓶子老大 发表于 2022-5-25 12:23
随机数产生了!恭喜恭喜。

可以指点一下吗
回复

使用道具 举报

ID:161164 发表于 2022-5-26 10:40 来自手机 | 显示全部楼层
看不懂你的提问,a和EEProm有啥关系?
回复

使用道具 举报

ID:334440 发表于 2022-5-26 12:24 | 显示全部楼层
lkc8210 发表于 2022-5-26 10:40
看不懂你的提问,a和EEProm有啥关系?

需要8至20的常数作另外的代码运算,EEPROM可以记录这个数,P30用来修改这个数,不修改的话,就是一个固定值,赋值给a
回复

使用道具 举报

ID:624769 发表于 2022-5-26 13:10 来自手机 | 显示全部楼层
if(c<8){c==8;cc(0x2000);xcx(0x2002,c);} 这个病句,就没人看出来么?

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:230742 发表于 2022-5-26 14:59 | 显示全部楼层
我也不会。
我只是一个爱好者。
超级喜欢单片机而已。
回复

使用道具 举报

ID:334440 发表于 2022-5-26 22:44 来自手机 | 显示全部楼层
188610329 发表于 2022-5-26 13:10
if(c

如果读到的c小于8,则赋值8,并擦除扇区,重新写入c的值,以备取用
回复

使用道具 举报

ID:624769 发表于 2022-5-26 22:58 | 显示全部楼层
onetwoto 发表于 2022-5-26 22:44
如果读到的c小于8,则赋值8,并擦除扇区,重新写入c的值,以备取用

你说的如此理直气壮,倒是弄得我不自信了……
不如大家投票吧……

问题: 给 c 赋值 8 应该用以下哪个语句?
A)   c =  8;
B)   c == 8;
答:
回复

使用道具 举报

ID:161164 发表于 2022-5-26 23:44 来自手机 | 显示全部楼层
onetwoto 发表于 2022-5-26 12:24
需要8至20的常数作另外的代码运算,EEPROM可以记录这个数,P30用来修改这个数,不修改的话,就是一个固定 ...

但看你的代码,c是随时间由8增加到20又变回8啊?
根本不固定
而且P30==1 是按下还是没按下?
代码头几行注释P30是Out, 所以P30是输入还是输出?
P37==1 && P30==0 又是哪个键按下?
回复

使用道具 举报

ID:334440 发表于 2022-5-27 07:09 来自手机 | 显示全部楼层
188610329 发表于 2022-5-26 22:58
你说的如此理直气壮,倒是弄得我不自信了……
不如大家投票吧……


抱歉抱歉,我不是理直气壮,我是业余学习,时间比较紧,语言不到之处请见谅,赋值是c=8;
回复

使用道具 举报

ID:334440 发表于 2022-5-27 07:13 来自手机 | 显示全部楼层
lkc8210 发表于 2022-5-26 23:44
但看你的代码,c是随时间由8增加到20又变回8啊?
根本不固定
而且P30==1 是按下还是没按下?

1.是要求c必须是8至20间的数,如果小于8或大于20就不行。2.常规stc的设计,等于0的都表示按下了,等于1的都表示松开,p30在这里用按键输入
回复

使用道具 举报

ID:161164 发表于 2022-5-27 10:22 | 显示全部楼层
onetwoto 发表于 2022-5-27 07:13
1.是要求c必须是8至20间的数,如果小于8或大于20就不行。2.常规stc的设计,等于0的都表示按下了,等于1的 ...

终于弄明白你这憋扭的代码
0
上电
读取EEProm,放到C
初始化定时器但不运行

1
P30按下,消抖,检验C值,写入EEProm,运行定时器

2
1ms后,定时器中断,d++,把C值放到A,输出数码管

1ms后,重复2
5ms后,重复1

3
P30放开,停止定时器

4
P30不放开,直到d大于1000(1s)
d清零,c++,然后检查是否大于零

这就是你的长按改变c的运行流程

这代码最大的问题是每次长按EEProm都会擦写200次
不知道这c值会不会经常改变
不然号称10万次擦写寿命的EEProm只能定的住5000次长按
回复

使用道具 举报

ID:334440 发表于 2022-5-27 22:48 来自手机 | 显示全部楼层
lkc8210 发表于 2022-5-27 10:22
终于弄明白你这憋扭的代码
0
上电

很感激你能读透我的思路,看样子我这代表码问题严重,实现不了这个功能了吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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