找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2728|回復(fù): 7
收起左側(cè)

單片機(jī)狀態(tài)機(jī)按鍵程序點(diǎn)燈哪里錯(cuò)誤?

[復(fù)制鏈接]
ID:72649 發(fā)表于 2019-2-1 06:42 | 顯示全部樓層 |閱讀模式
#include "stc15w408as.h"
#include"intrins.h"sbit key=P1^4;sbit led=P3^5;void Timer0Init(void);
void key_scan();
void Timer0Init(void)                //2??@11.0592MHz
{        TL0 = 0x9A;        
TH0 = 0xA9;      
TF0 = 0;   
TR0 = 1;
}
void key_scan()
{        static unsigned char state_cnt=0;        
switch(state_cnt)        
{                case 0x00: if(key==0)                 
{                        state_cnt=0x01;                       
break;                        }               
case 0x01: if(key==0)                     
{                        state_cnt=0x02;                        
led=~led;                     
break;                        }                        
else                     
{      state_cnt=0;                        break;      }               
case 0x02: if(key==1)                     
{                        state_cnt=0x00;                        break;                        }                default: break;        }}

void t0int() interrupt 1           //(location at 000BH)
{        static unsigned char cnt=0;        
AUXR |= 0x80;     
TMOD &= 0xF0;      
cnt++;        
if(cnt==5)        {   cnt=0;         key_scan();  }}

void main()        {  led=0;                led=1;                key=1;                Timer0Init();                while(1) ;        }
回復(fù)

使用道具 舉報(bào)

ID:94031 發(fā)表于 2019-2-1 15:51 | 顯示全部樓層
應(yīng)該把要求的功能說清楚。
回復(fù)

使用道具 舉報(bào)

ID:94031 發(fā)表于 2019-2-1 16:37 | 顯示全部樓層
想用中斷,但沒開中斷。
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2019-2-1 17:14 | 顯示全部樓層
初始化定時(shí)器和中斷的寫法如下,按鍵掃描程序錯(cuò)誤明顯,但不知道你想達(dá)到什么目的,無法修改。
void Timer0Init()        //2毫秒@11.0592MHz
{
        AUXR |= 0x80;        //定時(shí)器時(shí)鐘1T模式
        TMOD &= 0xF0;        //設(shè)置定時(shí)器模式
        TL0 = 0x9A;                //設(shè)置定時(shí)初值
        TH0 = 0xA9;                //設(shè)置定時(shí)初值
        TF0 = 0;                //清除TF0標(biāo)志
        TR0 = 1;                //定時(shí)器0開始計(jì)時(shí)
        EA=1;                        //開總中斷
        ET0=1;                        //開定時(shí)器0中斷       
}
void t0int() interrupt 1
{
        static unsigned char cnt=0;        
        cnt++;        
        if(cnt==5)
        {   
                cnt=0;
                key_scan();  
        }
}
回復(fù)

使用道具 舉報(bào)

ID:72649 發(fā)表于 2019-2-1 19:07 | 顯示全部樓層
按下key,點(diǎn)亮led燈。
回復(fù)

使用道具 舉報(bào)

ID:155507 發(fā)表于 2019-2-2 06:20 | 顯示全部樓層
給你改了,對(duì)比一下就知道哪里錯(cuò)了。

  1. //單片機(jī)狀態(tài)機(jī)按鍵程序點(diǎn)燈哪里錯(cuò)誤?

  2. #include "stc15w408as.h"
  3. #include"intrins.h"

  4. sbit key=P1^4;
  5. sbit led=P3^5;
  6. void Timer0Init(void);
  7. void key_scan();

  8. void Timer0Init(void)                //2毫秒@11.0592MHz
  9. {
  10.         AUXR |= 0x80;        //定時(shí)器時(shí)鐘1T模式
  11.         TMOD &= 0xF0;   //設(shè)置定時(shí)器模式
  12.         TMOD |= 0x00;        //定時(shí)器T0,工作方式0 16位自動(dòng)重裝  <--------
  13.         TL0 = 0x9A;                //設(shè)置定時(shí)初值 // 65536-22118=43418
  14.         TH0 = 0xA9;                //設(shè)置定時(shí)初值
  15.         TF0 = 0;                //清除TF0標(biāo)志
  16.         EA = 1;         //開 總中斷              <---------
  17.     ET0 = 1;        //開啟定時(shí)器T0中斷允許位  <--------
  18.         TR0 = 1;                //定時(shí)器0開始計(jì)時(shí)
  19. }


  20. void key_scan()
  21. {
  22.         static unsigned char state_cnt=0;        
  23.         switch(state_cnt)        
  24.         {
  25.         case 0x00: if(key==0)                 
  26.                 {
  27.                         state_cnt=0x01;                       
  28.                         break;
  29.                 }               
  30.         case 0x01: if(key==0)                     
  31.                 {
  32.                         state_cnt=0x02;                        
  33.                         led=~led;                     
  34.                         break;
  35.                 }                        
  36.                 else                     
  37.                 {
  38.                         state_cnt=0;
  39.                         break;
  40.                 }               
  41.         case 0x02: if(key==1)                     
  42.                 {
  43.                         state_cnt=0x00;
  44.                         break;
  45.                 }
  46.         default: break;
  47.         }
  48. }

  49. void t0int() interrupt 1           //(location at 000BH)
  50. {
  51.         static unsigned char cnt=0;        
  52.         cnt++;        
  53.         if(cnt==5)
  54.         {
  55.                 cnt=0;
  56.                 key_scan();  
  57.         }
  58. }

  59. void main()
  60. {
  61.         led=0;
  62.         led=1;
  63.         key=1;
  64.         Timer0Init();
  65.         while(1) ;
  66. }


復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

ID:72649 發(fā)表于 2019-2-2 07:47 | 顯示全部樓層
就是key點(diǎn)亮led燈
回復(fù)

使用道具 舉報(bào)

ID:47286 發(fā)表于 2019-2-2 10:47 | 顯示全部樓層
case break 語句 break是寫在if里邊么 if條件不滿足的時(shí)候是怎么執(zhí)行的 怎么看范例都不是這么寫呢
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表