本帖最后由 ygyfy 于 2024-6-28 15:56 编辑
第七集 按键点灯 下
主要涉及移位,数组
数组:
类型 数组名[元素个数]={值,值……值};
u8 LED_DataTab[8] = { 0XFE,0XFD, 0XFB,0XF7,0XEF,0XDF,0XBF,0X7F};
其中u8,8位无符号整型变量;LED_Data是数组的名字,中括号中的8表示这个数组有八个元素(值),大括号中是数组8个元素的每个值。
数组的引用,数组名称[下标],如LED_Data[0],LED_Data[1],LED_Data[2]……LED_Data[7],注意下标是从0开始而不是1开始,最大下标为数组元素个数减去1,如本例,最大数组下标为7而不是8.
数组的使用:先定义数组,然后引用,如同之前函数先定义,在引用一样
通过改变数组的值或者引用顺序,可以改变led的点亮顺序和方向以及每次点亮led的个数
本集中P6=0XFE会点亮P6.0的灯,依次引用数组元素会依次点亮P6.0到P6.7
因本人暂时没有试验箱,只能用屠龙刀板做实验,编写程序会依次点亮P2.0到P2.7。
屠龙刀也没反正,就简单写个程序,依次点亮P2.7开始往P2.0跑,每次点亮四个,然后再从2.7开始循环吧
- #include "COMM/stc.h" //调用头文件
- #include "COMM/usb.h"
- #define MAIN_Fosc 24000000UL //定义主时钟
-
- char *USER_DEVICEDESC = NULL;
- char *USER_PRODUCTDESC = NULL;
- char *USER_STCISPCMD = "@STCISP#";
-
- void sys_init(); //函数声明
- void delay_ms(u16 ms);
-
- void main() //程序开始运行的入口
- {
- u8 Led_Data=0xFE;
- int num=4;
- u8 Led_datatab[5]={0XF0,0XE1,0XC3,0X87,0X0F};
-
-
- sys_init(); //USB功能+IO口初始化
- usb_init(); //usb库初始化
- EA = 1; //CPU开放中断,打开总中断。
-
- while(1) //循环执行
- {
- if( DeviceState != DEVSTATE_CONFIGURED )
- continue;
- if( bUsbOutReady )
- {
- usb_OUT_done();
-
- }
-
- P2=Led_datatab[num];
- delay_ms(500);
- num--;
- if(num<0)
- num=4;
- }
- }
-
- void sys_init() //函数定义
- {
- WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
- EAXFR = 1; //扩展寄存器(XFR)访问使能
- CKCON = 0; //提高访问XRAM速度
-
- P0M1 = 0x00; P0M0 = 0x00; //设置为准双向口
- P1M1 = 0x00; P1M0 = 0x00; //设置为准双向口
- P2M1 = 0x00; P2M0 = 0x00; //设置为准双向口
- P3M1 = 0x00; P3M0 = 0x00; //设置为准双向口
- P4M1 = 0x00; P4M0 = 0x00; //设置为准双向口
- P5M1 = 0x00; P5M0 = 0x00; //设置为准双向口
- P6M1 = 0x00; P6M0 = 0x00; //设置为准双向口
- P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口
-
-
-
- P3M0 &= ~0x03;
- P3M1 |= 0x03;
-
- //设置USB使用的时钟源
- IRC48MCR = 0x80; //使能内部48M高速IRC
- while (!(IRC48MCR & 0x01)); //等待时钟稳定
-
- USBCLK = 0x00; //使用CDC
- USBCON = 0x90;
- }
-
- void delay_ms(u16 ms) //
- {
- u16 i;
- do
- {
- i = MAIN_Fosc/6000;
- while(--i);
- }while(--ms);
- }
复制代码
|