找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 464|回复: 8
收起左侧

关于单片机C语言查表法按键自加LED循环点亮

[复制链接]
ID:849894 发表于 2024-1-31 15:17 | 显示全部楼层 |阅读模式
各位老师好,此程序一上电是最低位LED灯亮,按键按下去第二位LED灯亮,来回循环.我想把它改成上电第一个LED灯不亮,有按键按下才开始亮第一个LED灯,应怎么处理。

/*************  本程序功能说明  **************
单片机型号:适合STC8G系列型号单片机
晶振                        :内部晶振11.0592或12MHz
复位                        :复位脚为IO口,用内部自带复位

注意:STC8全系列,初始化必须配置所有IO口,否则IO口不能正常使用

显示效果:  演示移动点亮LED灯,采用位操作方法,查表方法实现
******************************************/
#include    "STC8G.h"                                    //包括了STC8G.H文件里面的内容
#define     MAIN_Fosc       11059200L   //定义主时钟
typedef     unsigned char   u8;         //为复杂的声明定义简单的别名
typedef     unsigned int    u16;        //为复杂的声明定义简单的别名
typedef     unsigned long   u32;        //为复杂的声明定义简单的别名

/******* IO口位定义 *******/
sbit LED_0 = P3^1;
sbit LED_1 = P3^2;
sbit LED_2 = P3^3;
sbit LED_3 = P3^4;
sbit LED_4 = P3^5;
sbit LED_5 = P3^6;
sbit LED_6 = P3^7;
sbit LED_7 = P1^0;

sbit K1 = P1^7;

/*------定义寄存器变量---------------*/
u8 ct;

/*------定义位寄存器变量---------------*/
u8 bdata led_bit;              //把不在一组IO口,整合一组IO口,便于操作

sbit LED_00 = led_bit^0;
sbit LED_01 = led_bit^1;
sbit LED_02 = led_bit^2;
sbit LED_03 = led_bit^3;
sbit LED_04 = led_bit^4;
sbit LED_05 = led_bit^5;
sbit LED_06 = led_bit^6;
sbit LED_07 = led_bit^7;

void Delay1ms(u16 xms);         //延时函数声明
void IO_init_config(void);            //IO口初始化函数


/*------LED来回14次显示表--------------*/
u8 code led_dis[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,
                                        0xbf,0xdf,0xef,0xf7,0xfb,0xfd};

/******************** 主函数 **************************/

void main(void)
{
        IO_init_config();          //IO口初始化
        ct=0;
        while(1)
        {
                if(K1==0)                           //判断按键是否有按下
                {
                      Delay1ms(20);           //按键按下消抖
                        if(K1==0)                   //再次判断按键是否有按下
                        {
                                ct++;                   //按建有效变量自加1
                                if(ct==14)           //自加14次
                                ct=0;                   //变量清0
                                while(!K1);           //按键松手消抖                                                                                          
                        }
                }
               
                led_bit = led_dis[ct];        //查表的内容送到LED口显示                                                                              
                LED_0 = LED_00;         //缓冲单元的内容送到LED口显示
                LED_1 = LED_01;
                LED_2 = LED_02;
                LED_3 = LED_03;
                LED_4 = LED_04;
                LED_5 = LED_05;
                LED_6 = LED_06;
                LED_7 = LED_07;
        }
}

回复

使用道具 举报

ID:883242 发表于 2024-1-31 18:20 | 显示全部楼层
把主循环之前的ct=0;改成ct=-1;就行了。
回复

使用道具 举报

ID:213173 发表于 2024-1-31 21:49 | 显示全部楼层
/******************** 主函数 **************************/
void main(void)
{
        IO_init_config();          //IO口初始化
        ct=0xff;
        while(1)
        {
                if(K1==0)               //判断按键是否有按下
                {
                        Delay1ms(20);           //按键按下消抖
                        if(K1==0)               //再次判断按键是否有按下
                        {
                                ct++;                //按建有效变量自加1
                                if(ct==14)           //自加14次
                                        ct=0;             //变量清0
                                while(!K1);           //按键松手消抖
                                led_bit = led_dis[ct];//查表的内容送到LED口显示
                                LED_0 = LED_00;       //缓冲单元的内容送到LED口显示
                                LED_1 = LED_01;
                                LED_2 = LED_02;
                                LED_3 = LED_03;
                                LED_4 = LED_04;
                                LED_5 = LED_05;
                                LED_6 = LED_06;
                                LED_7 = LED_07;
                        }
                }
        }
}
回复

使用道具 举报

ID:161164 发表于 2024-1-31 22:19 | 显示全部楼层
/*------LED来回15次显示表--------------*/
u8 code led_dis[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,
                                        0xbf,0xdf,0xef,0xf7,0xfb,0xfd};
回复

使用道具 举报

ID:1063029 发表于 2024-1-31 22:33 | 显示全部楼层
初始化ct=14,在 数组后面加 0xff;
if(ct==14)           //自加14次
改为 if(ct>=14)           //自加14次
回复

使用道具 举报

ID:807651 发表于 2024-2-1 08:45 | 显示全部楼层
看你    if(ct==14)           //自加14次,
回复

使用道具 举报

ID:807651 发表于 2024-2-1 08:45 | 显示全部楼层
led_bit = led_dis[ct+1];        //查表的内容送到LED口显示                                            
回复

使用道具 举报

ID:849894 发表于 2024-2-18 14:51 | 显示全部楼层
各位老师好,谢谢你们的解答,已解决。
回复

使用道具 举报

ID:1111239 发表于 2024-2-21 13:56 | 显示全部楼层
主循环之前的ct改成1
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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