亚洲春色中文字幕久久久-三上亚,91精品国产亚一区二区三区,久久久九色综合亚洲成色777,涩涩视频下载,国产午夜亚洲精品午夜鲁丝片,国产精品A一区二区三区腾讯导航,影音先锋色情AV在线看片,蜜臀国产在线视频,极品少妇高潮啪啪无码吴梦梦 ,精品人妻无码一区二区三区手机版

標(biāo)題: 九齊NY8A051H單片機(jī)程序,大佬幫忙看看,燈效進(jìn)行不下去 [打印本頁(yè)]

作者: setsu    時(shí)間: 2025-8-2 11:11
標(biāo)題: 九齊NY8A051H單片機(jī)程序,大佬幫忙看看,燈效進(jìn)行不下去
這是我寫的一個(gè)按鍵切換3顆LED燈的燈光效果代碼,想要實(shí)現(xiàn)的效果是,按下開關(guān),實(shí)現(xiàn)燈效:
(1)3顆LED燈全亮;
(2)3顆LED燈全亮2秒,全滅2秒,循環(huán);
(3)只有1號(hào)燈亮2秒,接著,只有2號(hào)燈亮2秒,最后只有3號(hào)燈亮2秒,循環(huán);
(4)3顆LED燈全滅,進(jìn)入睡眠;
全局效果:當(dāng)有LED燈點(diǎn)亮?xí)r,開始倒計(jì)時(shí)30分鐘,期間沒有按下開關(guān),LED燈全滅,IC進(jìn)入睡眠,等待開關(guān)喚醒。

目前我的代碼只能在兩個(gè)燈效之間切換,無法做的4個(gè)燈效切換,而且延時(shí)30分鐘效果不知道怎么進(jìn)行,求大佬幫忙完善一下!!!

按鍵切換3燈燈效.docx

12.75 KB, 下載次數(shù): 0

代碼


作者: a825563619    時(shí)間: 2025-8-4 14:14
有開總中斷嗎,你的delay要2000
作者: 檸檬脆片    時(shí)間: 2025-8-4 15:51
按鍵部分的問題:1、按下以后Mod會(huì)一直加,最好是識(shí)別到彈起再加一;2、Mod等于4就置零需要寫在Mod++后面,且最好是大于等于4;3、switch增加default。
作者: ydatou    時(shí)間: 2025-8-8 13:33
代碼結(jié)構(gòu)有問題。你這種軟件延時(shí)在代碼更改工作模式后還是會(huì)繼續(xù)延時(shí),不會(huì)立即按新模式進(jìn)行。要以狀態(tài)機(jī)的方式組織代碼。
作者: setsu    時(shí)間: 2025-8-12 12:00
a825563619 發(fā)表于 2025-8-4 14:14
有開總中斷嗎,你的delay要2000

delay時(shí)間長(zhǎng)了,watchdog 重置了,燈一直頻閃,現(xiàn)在不知道怎么操作,剛接觸這款單片機(jī),大佬能不能幫我改一下?
作者: setsu    時(shí)間: 2025-8-12 12:03
檸檬脆片 發(fā)表于 2025-8-4 15:51
按鍵部分的問題:1、按下以后Mod會(huì)一直加,最好是識(shí)別到彈起再加一;2、Mod等于4就置零需要寫在Mod++后面, ...

按鍵部分我是沿用官方示例代碼的,應(yīng)該不會(huì)出錯(cuò),我現(xiàn)在嘗試一下default語(yǔ)句
作者: setsu    時(shí)間: 2025-8-12 12:05
ydatou 發(fā)表于 2025-8-8 13:33
代碼結(jié)構(gòu)有問題。你這種軟件延時(shí)在代碼更改工作模式后還是會(huì)繼續(xù)延時(shí),不會(huì)立即按新模式進(jìn)行。要以狀態(tài)機(jī)的 ...

不太明白是什么意思,我剛接觸單片機(jī),網(wǎng)上都說九齊的容易學(xué),大佬能不能幫我改一下?
作者: ydatou    時(shí)間: 2025-8-16 14:56
setsu 發(fā)表于 2025-8-12 12:05
不太明白是什么意思,我剛接觸單片機(jī),網(wǎng)上都說九齊的容易學(xué),大佬能不能幫我改一下?

暫時(shí)用你的軟延時(shí)改了下。代碼中不要有長(zhǎng)時(shí)間(大于10毫秒)延時(shí),中斷中延時(shí)不要超過10us。
作者: setsu    時(shí)間: 2025-8-16 15:30
ydatou 發(fā)表于 2025-8-16 14:56
暫時(shí)用你的軟延時(shí)改了下。代碼中不要有長(zhǎng)時(shí)間(大于10毫秒)延時(shí),中斷中延時(shí)不要超過10us。

能發(fā)出來看看嗎?
作者: ydatou    時(shí)間: 2025-8-16 15:58
setsu 發(fā)表于 2025-8-12 12:05
不太明白是什么意思,我剛接觸單片機(jī),網(wǎng)上都說九齊的容易學(xué),大佬能不能幫我改一下?

用你的軟延時(shí)做了個(gè)狀態(tài)機(jī)。
以后編程要注意幾點(diǎn):
1.中斷中延時(shí)不要超過10uS,不要做復(fù)雜運(yùn)算。
2.不要使用超過20mS的延時(shí),如有超過,請(qǐng)用狀態(tài)機(jī)實(shí)現(xiàn)。
3.多使用標(biāo)志。
4.其中10ms延時(shí)要用定時(shí)器實(shí)現(xiàn)。
  1. #include <ny8.h>
  2. #include "ny8_constant.h"
  3. #include "stdint.h"
  4. #define UPDATE_REG(x) __asm__("MOVR _" #x ",F")
  5. #define unchar unsigned char
  6. #define unint unsigned int

  7. unchar myvar; // 九齊單片機(jī)位定義,將一個(gè)char拆成8個(gè)bit變量
  8. __sbit key = PORTB : 0;
  9. __sbit light1 = PORTB : 1;
  10. __sbit light2 = PORTB : 2;
  11. __sbit light3 = PORTB : 4;
  12. #define light_get() (((PORTB >> 1) & 7) ? 1 : 0)
  13. #define light_set(x)             \
  14.         do                           \
  15.         {                            \
  16.                 PORTB &= 0xf1;           \
  17.                 PORTB |= ((x) & 7) << 1; \
  18.         } while (0)(PORTB |= 0x1 << x)

  19. unint Mod = 3;
  20. unint ModCnt = 0; // 計(jì)時(shí),每10mS加1

  21. unchar keyFlag = 0;
  22. unchar keyCnt = 0; // 計(jì)時(shí),每10mS加1

  23. unint sleepCnt = 0; // 計(jì)時(shí),每10mS加1

  24. void delay(unint z) // 延時(shí)函數(shù)ms
  25. {
  26.         unint x, y;
  27.         for (x = z; x > 0; x--)
  28.                 for (y = 100; y > 0; y--)
  29.                         ;
  30. }
  31. void keyProc(void) // 按鍵處理函數(shù),每10mS調(diào)用一次
  32. {
  33.         unchar i = key ? 1 : 0;
  34.         if (++keyCnt == 0)
  35.                 keyCnt--;
  36.         if (i == 0) // 按鍵按下
  37.         {
  38.                 if (keyFlag)
  39.                         keyCnt = 0;         // 按鍵按下計(jì)時(shí)開始
  40.                 if (keyCnt == 2) // 消抖
  41.                 {
  42.                         ModCnt = 0;
  43.                         if (++Mod == 4)
  44.                                 Mod = 0;
  45.                 }
  46.                 sleepCnt = 0;
  47.         }
  48.         else
  49.         {
  50.                 if (keyFlag == 0)
  51.                 {
  52.                         // 松手檢測(cè),如有松手要處理的代碼寫在這里
  53.                         sleepCnt = 0;
  54.                 }
  55.         }
  56.         keyFlag = i;
  57. }
  58. void ModProc(void)
  59. {
  60.         switch (Mod)
  61.         {
  62.         case 3: // 燈全滅
  63.                 if (ModCnt == 0)
  64.                         light_set(0);
  65.                 SLEEP(); // LED燈全滅,IC進(jìn)入睡眠
  66.                 break;
  67.         case 0: // 燈全亮
  68.                 if (ModCnt == 0)
  69.                         light_set(7);
  70.                 break;
  71.         case 1: // 燈1亮 2秒,接著燈2亮 2秒,燈3亮 2秒
  72.                 if (ModCnt == 0 || ModCnt >= 600)
  73.                 {
  74.                         ModCnt = 0;
  75.                         light_set(1);
  76.                 }
  77.                 else if (ModCnt == 200)
  78.                         light_set(2);
  79.                 else if (ModCnt == 400)
  80.                         light_set(4);
  81.                 break;
  82.         case 2: // 燈全亮2秒,全滅兩秒
  83.                 if (ModCnt == 0 || ModCnt >= 400)
  84.                         light_set(7);
  85.                 else if (ModCnt == 200)
  86.                         light_set(0);
  87.                 break;
  88.         default:
  89.                 Mod = 3;
  90.                 ModCnt = -1;
  91.                 break;
  92.         }

  93.         if (++sleepCnt >= 30 * 60 * 100) // 30分鐘
  94.         {
  95.                 light_set(0);
  96.                 SLEEP(); // 點(diǎn)亮30分鐘期間沒有按下開關(guān)(按下會(huì)使sleepCnt清零),IC進(jìn)入睡眠
  97.         }
  98. }

  99. void isr(void) __interrupt(0)
  100. {
  101.         // if(INTFbits.INTIF)
  102.         //{
  103.         //        //INTF = (unsigned char)~(C_INT_EXT);
  104.         //}

  105.         if (INTFbits.PBIF)
  106.         {
  107.                 INTFbits.PBIF = 0;
  108.                 sleepCnt = 0;
  109.         }
  110. }

  111. void lnit_Timer() // 中斷初始化
  112. {
  113.         DISI();                                // 禁用中斷
  114.         INTE = C_INT_PBKey; // 啟用PB按鍵中斷
  115.         ENI();                                // 啟用中斷
  116. }

  117. void lnit_Mod()
  118. {
  119.         BPHCON = (unsigned char)~(C_PB0_PHB); // 開啟B0口上來電阻
  120.         BWUCON = C_PB0_Wakeup;                                  // 啟用PB0輸入喚醒功能
  121.         IOSTB = C_PB0_Input;
  122.         PORTB = 0x00;
  123. }

  124. void main(void)
  125. {
  126.         lnit_Mod();
  127.         lnit_Timer();
  128.         Mod = 0;
  129.         key = 1;
  130.         while (1)
  131.         {
  132.                 CLRWDT();
  133.                 delay(1); // 10mS,最好用定時(shí)器代替延時(shí)函數(shù)。
  134.                 keyProc();
  135.                 ModProc();
  136.         }
  137.         // while (1)
  138.         // {
  139.         //         if (gb10ms_flag) // 定時(shí)器中斷使 gb10ms_flag=1
  140.         //         {
  141.         //                 gb10ms_flag = 0;
  142.         //                 CLRWDT();
  143.         //                 keyProc();
  144.         //                 ModProc()
  145.         //         }
  146.         // }
  147. }
復(fù)制代碼




作者: ydatou    時(shí)間: 2025-8-16 16:32
代碼中有處錯(cuò)誤:sleepCnt最大值為65535,而30分鐘為180000次10ms。
還要加一個(gè)變量。

  1.         if (++ModCntL >= 100)//秒
  2.         {
  3.                 ModCntL = 0;
  4.                 if (++sleepCnt >= 30 * 60) // 30分鐘
  5.                 {
  6.                         light_set(0);
  7.                         SLEEP(); // 點(diǎn)亮30分鐘期間沒有按下開關(guān)(按下會(huì)使sleepCnt清零),IC進(jìn)入睡眠
  8.                 }
  9.         }
復(fù)制代碼

作者: setsu    時(shí)間: 2025-8-18 11:12
ydatou 發(fā)表于 2025-8-16 15:58
用你的軟延時(shí)做了個(gè)狀態(tài)機(jī)。
以后編程要注意幾點(diǎn):
1.中斷中延時(shí)不要超過10uS,不要做復(fù)雜運(yùn)算。

#define light_set(x)             \
        do                           \
        {                            \
                PORTB &= 0xf1;           \
                PORTB |= ((x) & 7) << 1; \
        } while (0)(PORTB |= 0x1 << x)
大佬,這個(gè)位置編譯報(bào)錯(cuò),是不是九齊用不了do while語(yǔ)句啊?
作者: setsu    時(shí)間: 2025-8-18 11:19
ydatou 發(fā)表于 2025-8-16 15:58
用你的軟延時(shí)做了個(gè)狀態(tài)機(jī)。
以后編程要注意幾點(diǎn):
1.中斷中延時(shí)不要超過10uS,不要做復(fù)雜運(yùn)算。

  case 1: // 燈1亮 2秒,接著燈2亮 2秒,燈3亮 2秒
                if (ModCnt == 0 || ModCnt >= 600)
                {
                        ModCnt = 0;
                        light_set(1);
                }
                else if (ModCnt == 200)
                        light_set(2);
                else if (ModCnt == 400)
                        light_set(4);
                break;
現(xiàn)在報(bào)錯(cuò)提示是第二個(gè)else之前出現(xiàn)語(yǔ)法錯(cuò)誤,不知道哪里出錯(cuò)了。。。
作者: setsu    時(shí)間: 2025-8-18 16:24
ydatou 發(fā)表于 2025-8-16 15:58
用你的軟延時(shí)做了個(gè)狀態(tài)機(jī)。
以后編程要注意幾點(diǎn):
1.中斷中延時(shí)不要超過10uS,不要做復(fù)雜運(yùn)算。

目前我把一些編譯報(bào)錯(cuò)都給改了,現(xiàn)在就剩一個(gè)“內(nèi)存地址重迭 0x10~0x12”,沒找到哪里導(dǎo)致的
作者: setsu    時(shí)間: 2025-8-19 00:17
setsu 發(fā)表于 2025-8-18 16:24
目前我把一些編譯報(bào)錯(cuò)都給改了,現(xiàn)在就剩一個(gè)“內(nèi)存地址重迭 0x10~0x12”,沒找到哪里導(dǎo)致的

這是這顆IC的規(guī)格書0x10~0x12重迭,可是這不是通用寄存器嗎?

NY8A051H_v2.0_SC.pdf

1.89 MB, 下載次數(shù): 0


作者: ydatou    時(shí)間: 2025-8-19 08:39
setsu 發(fā)表于 2025-8-18 11:12
#define light_set(x)             \
        do                           \
        {              ...

改成這樣
  1. #define light_set(x)             \
  2.         do                           \
  3.         {                            \
  4.                 PORTB &= 0xf1;           \
  5.                 PORTB |= ((x) & 7) << 1; \
  6.         } while (0)
復(fù)制代碼

作者: ydatou    時(shí)間: 2025-8-19 08:42
setsu 發(fā)表于 2025-8-18 11:19
case 1: // 燈1亮 2秒,接著燈2亮 2秒,燈3亮 2秒
                if (ModCnt == 0 || ModCnt >= 600 ...

應(yīng)該是上一個(gè)錯(cuò)誤所致。light_set(x) 的定義改了就好
作者: ydatou    時(shí)間: 2025-8-19 08:47
setsu 發(fā)表于 2025-8-18 16:24
目前我把一些編譯報(bào)錯(cuò)都給改了,現(xiàn)在就剩一個(gè)“內(nèi)存地址重迭 0x10~0x12”,沒找到哪里導(dǎo)致的

把代碼中的臨時(shí)變量改成全局變量試試。這款芯片象微芯的,對(duì)C語(yǔ)言支持不夠。
作者: ydatou    時(shí)間: 2025-8-19 08:50
setsu 發(fā)表于 2025-8-19 00:17
這是這顆IC的規(guī)格書0x10~0x12重迭,可是這不是通用寄存器嗎?

組織下全局變量順序,16bit變量在前面,8bit變量安排在后面。
  1. unchar myvar; // 九齊單片機(jī)位定義,將一個(gè)char拆成8個(gè)bit變量
  2. __sbit key = PORTB : 0;
  3. __sbit light1 = PORTB : 1;
  4. __sbit light2 = PORTB : 2;
  5. __sbit light3 = PORTB : 4;
  6. #define light_get() (((PORTB >> 1) & 7) ? 1 : 0)
  7. #define light_set(x)             \
  8.         do                           \
  9.         {                            \
  10.                 PORTB &= 0xf1;           \
  11.                 PORTB |= ((x) & 7) << 1; \
  12.         } while (0)(PORTB |= 0x1 << x)

  13. unint Mod = 3;
  14. unint ModCnt = 0; // 計(jì)時(shí),每10mS加1

  15. unchar keyFlag = 0;
  16. unchar keyCnt = 0; // 計(jì)時(shí),每10mS加1

  17. unint sleepCnt = 0; // 計(jì)時(shí),每10mS加1
復(fù)制代碼

作者: setsu    時(shí)間: 2025-8-22 01:15
ydatou 發(fā)表于 2025-8-19 08:50
組織下全局變量順序,16bit變量在前面,8bit變量安排在后面。

不行啊,一直提示內(nèi)存地址重迭0x10~0x12,這是什么原因?qū)е碌模?hr noshade size="2" width="100%" color="#808080"> 作者: ydatou    時(shí)間: 2025-8-22 14:29
你這問題應(yīng)該是九齊mcu特有的,要去找九齊的fae咨詢。




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