欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 請教如何利用P30按鍵的長按來操作51單片機芯片內(nèi)的EEPROM,讓a得到8至20間的數(shù) [打印本頁]

作者: onetwoto    時間: 2022-5-25 01:21
標(biāo)題: 請教如何利用P30按鍵的長按來操作51單片機芯片內(nèi)的EEPROM,讓a得到8至20間的數(shù)
/*   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 ;
}
作者: onetwoto    時間: 2022-5-25 07:43
剛驗證了一下,是可以用了,把T1MS改為常數(shù)64536穩(wěn)定一些
作者: 啤酒瓶子老大    時間: 2022-5-25 12:23
隨機數(shù)產(chǎn)生了!恭喜恭喜。
作者: onetwoto    時間: 2022-5-26 05:57
啤酒瓶子老大 發(fā)表于 2022-5-25 12:23
隨機數(shù)產(chǎn)生了!恭喜恭喜。

可以指點一下嗎
作者: lkc8210    時間: 2022-5-26 10:40
看不懂你的提問,a和EEProm有啥關(guān)系?
作者: onetwoto    時間: 2022-5-26 12:24
lkc8210 發(fā)表于 2022-5-26 10:40
看不懂你的提問,a和EEProm有啥關(guān)系?

需要8至20的常數(shù)作另外的代碼運算,EEPROM可以記錄這個數(shù),P30用來修改這個數(shù),不修改的話,就是一個固定值,賦值給a
作者: 188610329    時間: 2022-5-26 13:10
if(c<8){c==8;cc(0x2000);xcx(0x2002,c);} 這個病句,就沒人看出來么?
作者: 啤酒瓶子老大    時間: 2022-5-26 14:59
我也不會。
我只是一個愛好者。
超級喜歡單片機而已。
作者: onetwoto    時間: 2022-5-26 22:44
188610329 發(fā)表于 2022-5-26 13:10
if(c

如果讀到的c小于8,則賦值8,并擦除扇區(qū),重新寫入c的值,以備取用
作者: 188610329    時間: 2022-5-26 22:58
onetwoto 發(fā)表于 2022-5-26 22:44
如果讀到的c小于8,則賦值8,并擦除扇區(qū),重新寫入c的值,以備取用

你說的如此理直氣壯,倒是弄得我不自信了……
不如大家投票吧……

問題: 給 c 賦值 8 應(yīng)該用以下哪個語句?
A)   c =  8;
B)   c == 8;
答:
作者: lkc8210    時間: 2022-5-26 23:44
onetwoto 發(fā)表于 2022-5-26 12:24
需要8至20的常數(shù)作另外的代碼運算,EEPROM可以記錄這個數(shù),P30用來修改這個數(shù),不修改的話,就是一個固定 ...

但看你的代碼,c是隨時間由8增加到20又變回8啊?
根本不固定
而且P30==1 是按下還是沒按下?
代碼頭幾行注釋P30是Out, 所以P30是輸入還是輸出?
P37==1 && P30==0 又是哪個鍵按下?
作者: onetwoto    時間: 2022-5-27 07:09
188610329 發(fā)表于 2022-5-26 22:58
你說的如此理直氣壯,倒是弄得我不自信了……
不如大家投票吧……


抱歉抱歉,我不是理直氣壯,我是業(yè)余學(xué)習(xí),時間比較緊,語言不到之處請見諒,賦值是c=8;
作者: onetwoto    時間: 2022-5-27 07:13
lkc8210 發(fā)表于 2022-5-26 23:44
但看你的代碼,c是隨時間由8增加到20又變回8啊?
根本不固定
而且P30==1 是按下還是沒按下?

1.是要求c必須是8至20間的數(shù),如果小于8或大于20就不行。2.常規(guī)stc的設(shè)計,等于0的都表示按下了,等于1的都表示松開,p30在這里用按鍵輸入
作者: lkc8210    時間: 2022-5-27 10:22
onetwoto 發(fā)表于 2022-5-27 07:13
1.是要求c必須是8至20間的數(shù),如果小于8或大于20就不行。2.常規(guī)stc的設(shè)計,等于0的都表示按下了,等于1的 ...

終于弄明白你這憋扭的代碼
0
上電
讀取EEProm,放到C
初始化定時器但不運行

1
P30按下,消抖,檢驗C值,寫入EEProm,運行定時器

2
1ms后,定時器中斷,d++,把C值放到A,輸出數(shù)碼管

1ms后,重復(fù)2
5ms后,重復(fù)1

3
P30放開,停止定時器

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

這就是你的長按改變c的運行流程

這代碼最大的問題是每次長按EEProm都會擦寫200次
不知道這c值會不會經(jīng)常改變
不然號稱10萬次擦寫壽命的EEProm只能定的住5000次長按
作者: onetwoto    時間: 2022-5-27 22:48
lkc8210 發(fā)表于 2022-5-27 10:22
終于弄明白你這憋扭的代碼
0
上電

很感激你能讀透我的思路,看樣子我這代表碼問題嚴重,實現(xiàn)不了這個功能了嗎




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1