找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2096|回复: 7
收起左侧

单片机状态机按键程序点灯哪里错误?

[复制链接]
ID:72649 发表于 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) ;        }
回复

使用道具 举报

ID:94031 发表于 2019-2-1 15:51 | 显示全部楼层
应该把要求的功能说清楚。
回复

使用道具 举报

ID:94031 发表于 2019-2-1 16:37 | 显示全部楼层
想用中断,但没开中断。
回复

使用道具 举报

ID:213173 发表于 2019-2-1 17:14 | 显示全部楼层
初始化定时器和中断的写法如下,按键扫描程序错误明显,但不知道你想达到什么目的,无法修改。
void Timer0Init()        //2毫秒@11.0592MHz
{
        AUXR |= 0x80;        //定时器时钟1T模式
        TMOD &= 0xF0;        //设置定时器模式
        TL0 = 0x9A;                //设置定时初值
        TH0 = 0xA9;                //设置定时初值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
        EA=1;                        //开总中断
        ET0=1;                        //开定时器0中断       
}
void t0int() interrupt 1
{
        static unsigned char cnt=0;        
        cnt++;        
        if(cnt==5)
        {   
                cnt=0;
                key_scan();  
        }
}
回复

使用道具 举报

ID:72649 发表于 2019-2-1 19:07 | 显示全部楼层
按下key,点亮led灯。
回复

使用道具 举报

ID:155507 发表于 2019-2-2 06:20 | 显示全部楼层
给你改了,对比一下就知道哪里错了。

  1. //单片机状态机按键程序点灯哪里错误?

  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;        //定时器时钟1T模式
  11.         TMOD &= 0xF0;   //设置定时器模式
  12.         TMOD |= 0x00;        //定时器T0,工作方式0 16位自动重装  <--------
  13.         TL0 = 0x9A;                //设置定时初值 // 65536-22118=43418
  14.         TH0 = 0xA9;                //设置定时初值
  15.         TF0 = 0;                //清除TF0标志
  16.         EA = 1;         //开 总中断              <---------
  17.     ET0 = 1;        //开启定时器T0中断允许位  <--------
  18.         TR0 = 1;                //定时器0开始计时
  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. }


复制代码
回复

使用道具 举报

ID:72649 发表于 2019-2-2 07:47 | 显示全部楼层
就是key点亮led灯
回复

使用道具 举报

ID:47286 发表于 2019-2-2 10:47 | 显示全部楼层
case break 语句 break是写在if里边么 if条件不满足的时候是怎么执行的 怎么看范例都不是这么写呢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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