用C语言编写程序实现通过按键使LED灯周期闪烁
- 格式:docx
- 大小:23.83 KB
- 文档页数:8
1.Led灯控制程序#include "msp430g2553.h"void main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD; //关闭看门狗//P1DIR = 0x41;//P1OUT = 0x41; //程序点亮led1//P1DIR |=BIT0+BIT6;//P1OUT |=BIT0+BIT6; //程序点亮led2P1DIR |=BIT0;P1OUT |=BIT0;P1DIR |=BIT6;P1OUT &=~BIT6;while(1){P1OUT ^=BIT0;P1OUT ^=BIT6;__delay_cycles(1000000);} //led交替亮,持续1s2.Led按键控制灯亮#include "msp430g2553.h"void main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;//关闭看门狗P1DIR &=~BIT3;P1DIR |=BIT0;P1IES |=BIT3;P1IE |=BIT3;_EINT();_BIS_SR(LPM0_bits+GIE);}#pragma vector=PORT1_VECTOR__interrupt void PORT1_ISR(void){int i;char pushkey;pushkey=P1IFG&BIT3;//第三位中断标志位for(i=0;i<1000;i++)//短暂延时软件去抖if((P1IN&pushkey)==pushkey){P1IFG=0;//中断标志清零return;}if(P1IFG&BIT3)//判断按键是否按下{P1OUT^=BIT0;}P1IFG=0;return;}3.矩阵键盘和数码管程序#include <msp430g2553.h>#include"Key&Display.h"//unsigned char Receive(void);void main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;Init_4lines_Mode();//初始化4线工作模式Send_Command(CH452_RESET);//CH452芯片内部复位Send_Command(KeyDisplay_ON);//允许显示驱动并启动键盘扫描//开中断,P2.0接CH452的DOUT引脚,当有键按下时,DOUT上产生由高到低的脉冲// P2SEL &= ~(BIT6+BIT7);P2IE|=BIT0;P2IES|=BIT0;P2IFG&=~BIT0;_EINT();while(1){}}//中断处理函数#pragma vector = PORT2_VECTOR//中断处理程序,接收到DOUT脉冲信号时,运行之__interrupt void Port2(void){unsigned char Keyvalue;Send_Command(CH452_GET_KEY);//单片机向CH452发送读取按键代码命令Keyvalue=Key_Read();// Keyvalue=Receive();switch(Keyvalue){case 0x40://按键K0按下{Send_Command( NDis1); //第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis00);//第0位数码管显示0break;}case 0x41://按键K1按下{Send_Command( NDis1); //第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis01);//第0位数码管显示1break;}case 0x42://按键K2按下{Send_Command( NDis1); //第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis02);//第0位数码管显示2break;}case 0x43://按键K3按下{Send_Command( NDis1);//第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis03);//第0位数码管显示3break;}case 0x48://按键K4按下{Send_Command( NDis1);//第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis04);//第0位数码管显示4break;}case 0x49://按键K5按下{Send_Command( NDis1);//第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis05);//第0位数码管显示5break;}case 0x4A://按键K6按下{Send_Command( NDis1);//第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis06);//第0位数码管显示6break;}case 0x4B://按键K7按下{Send_Command( NDis1);//第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis07);//第0位数码管显示7break;}case 0x50://按键K8按下{Send_Command( NDis1);//第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis08);//第0位数码管显示8break;}case 0x51://按键K9按下{Send_Command( NDis1);//第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis09);//第0位数码管显示9break;}case 0x52://按键K10按下{Send_Command(Dis00);//第0个数码管显示字符"0"Send_Command(Dis11);//第1个数码管显示字符"1"break;}case 0x53://按键K11按下{Send_Command(Dis01);//第0个数码管显示字符"1"Send_Command(Dis11);//第1个数码管显示字符"1"break;}case 0x58://按键K12按下{Send_Command(Dis02);//第0个数码管显示字符"2"Send_Command(Dis11);//第1个数码管显示字符"1"break;}case 0x59://按键K13按下{Send_Command(Dis03);//第0个数码管显示字符"3"Send_Command(Dis11);//第1个数码管显示字符"1"break;}case 0x5A://按键K14按下{Send_Command(Dis04);//第0个数码管显示字符"4"Send_Command(Dis11);//第1个数码管显示字符"1"break;}case 0x5B://按键K15按下{Send_Command(Dis05);//第0个数码管显示字符"5"Send_Command(Dis11);//第1个数码管显示字符"1"break;}default:break;}P2IFG&=~BIT0;}4.红灯0.2秒闪一次,绿灯0.8秒闪一次#include <msp430g2553.h>void main(void){WDTCTL = WDTPW + WDTHOLD; // Stop WDT BCSCTL1 &=~XTS; //配置时钟BCSCTL3 |=LFXT1S_2;IFG1 &=OFIFG;P1DIR |=BIT0+BIT6; // P1.0,P1.6 output P1OUT &=~BIT0; // P1.0,P1.6置0 P1OUT &=~BIT6;TACCR0 = 12000-1; //1秒定时,产生中断TACCR1 = 2400; //频率0.2*12000,定时0.2秒TACCR2 = 9600; //定时0.8秒TACTL = TASSEL_1 + MC_1+TAIE; // ACLK, 增计数模式TACCTL1 |=CCIE; // TACCR1中断使能TACCTL2 |=CCIE; // TACCR1中断使能_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt}// Timer_A3 Interrupt Vector (TA0IV) handler#pragma vector=TIMER0_A1_VECTOR__interrupt void Timer_A(void){switch( TA0IV ){case 2: P1OUT ^= BIT0; // 捕获/比较寄存器TACCR1break;case 4: P1OUT ^= BIT6;break; // 捕获/比较寄存器TACCR2case 10: break; // 未使用,计数达到TACCRO时执行中断,即1秒执行一次}}5.PMW波控制led灯亮度#include "msp430g2553.h"void main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;P1DIR |=BIT6; //方向寄存器P1SEL |=BIT6; //功能寄存器TACTL=TASSEL_2+MC_1+ID_0; //定时器A控制寄存器选择增计数模式TACCTL1 |=OUTMOD_3; //捕获/比较控制寄存器TACCR0=1000-1;TACCR1=10;_BIS_SR(CPUOFF);}。
C语言使用定时器的方法控制LED灯以1S的速度闪亮最近因为赶不上提高班的进度,老师给的教程总是断断续续的,所以我打算跟11月1号通过考试的网友们一起学习,呵呵,这也是我一教训来着,在三维里学习要坚持一步一个脚印,坚持必有奇迹,但也要跟得上大家,以后再忙也要努力实现计划了,不能再像这次一样,因为所谓的考试落下了好几堂课,不过也没有关系,能够吸取点教训总是好的。
我可以先给自己点时间多学些其它的基础知识。
今天开始学单片机的计数器了,呵呵,可能是一直因为用C语言编程序我定时老是定不准的原因,当得知学会定时/计数器后可以让单片机C语言定时准确后,我感觉学它真的很有动力,虽然编一个简单的程序也花了我好长时间,但编出来的感觉却是那么的爽快,我觉得要学会定时/计数器,关键是要学会编程控制 TCOM,TMOD,及TH和TL吧。
主要是TH和TL的准确运算。
还有就是完时以后怎么样让其跟循环语句配合使用。
今天所编的程序是利用单片机定时器控制LED灯以1S 的速度闪烁,我的晶振是12MHZ的,首先是让计时器0.02S进行一次溢出,使TF1=1,其次是利用I++循环50次,加起来为1S。
程序如下: #include;sbit LED = P1^2;void main(){unsigned char i;TMOD |= 0x10;TMOD &= 0xdf;TH1 = 0xb1;TL1 = 0xdf;TCON |= 0x40;while(1){if(TF1==1){TF1 = 0;TH1 = 0xb1;TL1 = 0xdf;i++;if(i==50){i=0;LED=~LED;}}}}。
用C语言编写程序实现通过按键使LED灯周期闪烁(2010-02-24 21:12:44)标签:循环闪烁周期led灯按键杂谈一、设计题目二、程序功能:开机复位后,LED0到LED7全部点亮,所有LEDPort持续2S后熄灭,然后等待按键,按0键LED7以0.8S周期闪烁,按1键LEDPort以1S周期闪烁。
三、总体设计思想用中断方式实现定时器的定时,然后通过键盘中断程序实现通过对按键的操作来实现相应的周期闪烁。
在我编写的实验程序中我用到了定时器中断和外部中断。
程序共分为两个模块,一个为定时器模块,一个为键盘中断程序模块,在主函数中,首先实现所有LEDPort点亮,然后通过中断方式实现定时2S,在定时器num==20时,设定全局变量为标志位flag=1,然后再主函数中设定条件,通过标志位的变化实现所有LEDPort持续2S后熄灭。
然后进入循环,等待按键,在按键中断服务程序中使用switch语句实现通过改变num1的值来实现LED7的闪烁周期。
设定标志位b=0,在主函数中使用if语句通过判断b的值来改变LED7的亮灭情况,同时相应的b值会取反。
四、程序具体实现实验要求开机复位后,LED0到LED7全部点亮2S后熄灭。
在主函数中使用LEDPort=0x00;这条语句实现所有灯都亮,使用中断方式实现定时器定时2S,因为实验要求20ms溢出,所以设定num=100,在定时器中断服务程序中使用if语句判断条件,当num加到100,也就是说2S时间到时,执行flag=1;语句(先设定全局变量flag=0)。
然后在主函数中使用while语句规定只有在flag=0时才执行所有LEDPort点亮的操作。
2S时间到后,所有灯熄灭。
然后进入while循环,等待用户按键。
用户按键后,通过使用switch语句,实验按0键,num1=20,按1键,num1=50,。
而在主函数中,当按下0键或者1键时,num1就有了固定的值,通过if语句判断是否到达所要求的时间后,执行相应操作。
stm32 编程题以下是一个简单的STM32编程题,要求实现一个LED闪烁程序:1. 硬件连接:将一个LED灯连接到STM32的GPIO端口上,例如GPIO_PIN_0。
2. 编写程序:使用C语言编写一个简单的STM32程序,实现LED灯的闪烁功能。
具体要求如下:a. 初始化GPIO端口,设置GPIO_PIN_0为输出模式。
b. 循环使LED灯闪烁,每次闪烁时间间隔为1秒。
c. 在程序中添加延时函数,以便控制LED灯的闪烁频率。
以下是一个简单的示例代码:```cinclude ""include "stm32f10x_"include "stm32f10x_"include "stm32f10x_"void delay(uint32_t ms) {TIM3->CNT = 0;TIM3->ARR = ms;TIM3->CR1 = TIM_CR1_CEN;while (TIM3->CNT < ms);}int main(void) {// 初始化GPIO端口和时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStructure;GPIO__Pin = GPIO_Pin_0;GPIO__Mode = GPIO_Mode_Out_PP;GPIO__Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);while (1) {// 点亮LED灯GPIOA->BSRR = GPIO_Pin_0;delay(500); // 延时500毫秒// 熄灭LED灯GPIOA->BSRR = (uint16_t) ~GPIO_Pin_0;delay(500); // 延时500毫秒}}```在这个示例代码中,我们使用TIM3定时器实现了一个简单的延时函数`delay()`,该函数接受一个参数ms,表示需要延时的毫秒数。
1例子1第二个灯亮#include<reg52.h>void main(){P1=0xfd;}#include<reg52.h>Sbit D1=P1^0;Void main(){D1=0}注意:稍微改程序时需重新hex化例子2第一个灯亮#include<reg52.h> //52单片机头文件sbit led1=P1^0; //单片机管脚位声明void main() //主函数{led1=0; //将单片机P1.0口清零while(1); //程序停止在这里,在后面会讲到为什么这样写。
}例子3第一个灯亮#include<reg52.h> //52单片机头文件void main() //主函数{P1=0xfe; //将单片机P1口的8个口由高到低分别赋值为11111110 while(1); //程序停止在这里,在后面会讲到为什么这样写。
}2例子1第三个灯闪烁fir循环#include<reg52.h>sbit D2=P1^2;unsigned int a;void main(){D2=0;for(a=0;a<=10000;a++){};D2=1;for(a=0;a<=10000;a++){};}例子2第三个闪烁while循环#include<reg52.h>sbit D2=P1^2;unsigned int a;void main(){a=5000;D2=0;while(a--);a=5000;D2=1;while(a--);}2.#include<reg52.h> //52单片机头文件sbit led1=P1^0; //单片机管脚位声明void main() //主函数{unsigned int i; //定义一个int型变量while(1){i=50000; //变量赋初值为50000led1=0; //点亮灯while(i--); //延时i=50000;led1=1; //熄灭灯while(i--);}}3例子1 3 5 7灯同时亮#include<reg52.h> //52单片机头文件sbit led1=P1^0; //单片机管脚位声明sbit led3=P1^2; //单片机管脚位声明sbit led5=P1^4; //单片机管脚位声明sbit led7=P1^6; //单片机管脚位声明void main() //主函数{led1=0; //将单片机P1.0口清零led3=0; //将单片机P1.2口清零led5=0; //将单片机P1.4口清零led7=0; //将单片机P1.6口清零while(1); //程序停止在这里,在后面会讲到为什么这样写。
汇编按键控制led灯亮灭编写程序概述1. 引言1.1 概述本文旨在介绍使用汇编语言编写程序,以实现按键控制LED灯亮灭的功能。
通过该实验,我们可以深入了解汇编语言的基本原理和操作方法,并学会将其应用于具体的电路控制中。
1.2 文章结构本文主要分为四个部分,分别是引言、汇编按键控制LED灯亮灭编写程序、程序测试与调试过程及结果分析以及总结和展望。
在引言部分,我们将简要介绍文章的背景和目的,为读者提供整个实验的概览。
接下来的部分将逐步介绍硬件准备工作、程序设计思路、关键代码解读与实现步骤等内容。
随后,我们将介绍测试环境搭建、测试过程记录以及结果分析与优化方案等内容。
最后,在总结和展望部分,我们将对整个实验进行总结,并提出改进方向和未来发展方向。
1.3 目的本文的目的是帮助读者了解如何使用汇编语言编写按键控制LED灯亮灭的程序,通过这一示例项目引导读者熟悉汇编语言的基础知识,并培养其分析和解决问题的能力。
通过实验过程,读者可以了解硬件准备工作、程序设计思路以及测试调试过程,并能够根据实际需求进行结果分析和优化方案的提出。
此外,本文还展望了未来发展方向,希望读者能够在此基础上进一步探索和应用汇编语言的相关知识。
以上是文章“1. 引言”部分的内容,旨在概述本文的背景、结构和目的。
如果需要更加详细的内容,请继续阅读后续章节。
2. 汇编按键控制LED灯亮灭编写程序:2.1 完成硬件准备工作:在开始编写汇编程序之前,首先需要进行硬件准备工作。
我们将使用一个单片机来控制LED灯的亮灭,并通过按键来触发控制操作。
为此,我们需要将LED与单片机的输出引脚连接,并将按键与单片机的输入引脚连接。
确保电路连接正确无误后,我们可以开始进行程序设计。
2.2 程序设计思路:在本部分中,我们将介绍如何使用汇编语言设计一个按键控制LED灯亮灭的程序。
该程序的基本原理是通过检测按键状态来改变LED的亮度状态,即当按键被按下时,LED亮起;当按键未被按下时,LED熄灭。
Zigbee模块之间的互相通讯:#include "ZComDef.h"#include "OSAL.h"#include "OSAL_Nv.h"#include "OnBoard.h"#include "ZMAC.h"/* Hal */#include "hal_lcd.h"#include "hal_led.h"#include "hal_adc.h"#include "hal_drivers.h"#include "hal_assert.h"#include "hal_flash.h"// 初始化一些配置/********************************************************************* * MACROS//宏指令*//********************************************************************* * CONSTANTS//常量*/// Maximun number of Vdd samples checked before go on#define MAX_VDD_SAMPLES 3#define ZMAIN_VDD_LIMIT HAL_ADC_VDD_LIMIT_4//工作电压限制/********************************************************************* * TYPEDEFS//典型定义*//********************************************************************* * GLOBAL V ARIABLES//全局变量*//********************************************************************* * EXTERNAL V ARIABLES//外部变量*//********************************************************************* * EXTERNAL FUNCTIONS//外部函数*/extern bool HalAdcCheckVdd (uint8 limit);//外部转换器工作电压检查/********************************************************************* * LOCAL V ARIABLES//局部变量*//********************************************************************* * LOCAL FUNCTIONS//局部函数*/static void zmain_dev_info( void );static void zmain_ext_addr( void );static void zmain_vdd_check( void );#ifdef LCD_SUPPORTEDstatic void zmain_lcd_init( void );#endif/********************************************************************* * @fn main* @brief* @return don't care*/int main( void ){// 关闭中断osal_int_disable( INTS_ALL );// 参数为INTS_ALL则关闭所有中断,否则关闭相应中断// Initialization for board related stuff such as LEDs// 处理器运行时钟,LED IO口设置HAL_BOARD_INIT();// 初始化板子硬件部分// Make sure supply voltage is high enough to run// 确保电源电压足够高来运行zmain_vdd_check();// Initialize board I/O// 初始化I / OInitBoard( OB_COLD );// Initialze HAL drivers// 硬件驱动HalDriverInit();// Initialize NV System // nv系统初始化osal_nv_init( NULL );// Initialize the MAC // 初始化计算机系统ZMacInit();// Determine the extended address// 确定扩展地址zmain_ext_addr();// Initialize basic NV items // 初始化虚拟条目zgInit();#ifndef NONWK// Since the AF isn't a task, call it's initialization routine// 初始化程序afInit();#endif// Initialize the operating system// 初始化操作系统osal_init_system();// Allow interrupts// 允许中断osal_int_enable( INTS_ALL );// Final board initialization// 最终的硬件初始化InitBoard( OB_READY );// Display information about this device// 显示关于这个设备的信息zmain_dev_info();/* Display the device info on the LCD *// 在液晶屏上显示设备信息#ifdef LCD_SUPPORTEDzmain_lcd_init();#endif#ifdef WDT_IN_PM1//如果监视器被占用,这个位置可以启用WatchDogEnable( WDTIMX );#endifosal_start_system();// 操作系统初始化// No Return from here此处无返回return 0; // Shouldn't get here.// 禁止到达这里} // main()/********************************************************************* * @fn zmain_vdd_check * @brief Check if the Vdd is OK to run the processor.* @return Return if Vdd is ok; otherwise, flash LED, then reset*********************************************************************/static void zmain_vdd_check( void )// 确认VDD是否达到运行处理器的要求,如果没有达到就会闪烁LED{uint8 vdd_passed_count = 0;bool toggle = 0;// Repeat getting the sample until number of failures or successes hits MAX// 重复检测VDD的状态,直到成功检测的次数达到规定过的要求为止,估计是等电源稳定// then based on the count value, determine if the device is ready or not// 然后根据计算值,确定设备是否准备好while ( vdd_passed_count < MAX_VDD_SAMPLES )//工作电压最大值校验{if ( HalAdcCheckVdd (ZMAIN_VDD_LIMIT) )//转换器电压{vdd_passed_count++; // Keep track # times Vdd passes in a row计算通过的电压MicroWait (10000); // 延时10毫秒else{vdd_passed_count = 0; //重置通过的电压MicroWait (50000); / / 延时50毫秒MicroWait (50000); // 50毫秒后再次尝试//HalAdcCheckVdd ()【hal_adc.c】函数用来检查VDD是否大于或等于最小的要求./* toggle LED1 and LED2 *// 切换LED1、LED2if (vdd_passed_count == 0){if ((toggle = !(toggle)))HAL_TOGGLE_LED1();elseHAL_TOGGLE_LED2();}}/* turn off LED1 关闭LED1HAL_TURN_OFF_LED1();HAL_TURN_OFF_LED2();}/********************************************************************** ***************************** @fn zmain_ext_addr** @brief Execute a prioritized search for a valid extended address and write the results* into the OSAL NV system for use by the system. Temporary address not saved to NV.** input parameters** None.** output parameters** None.** @return None.*************************************************************************** */static void zmain_ext_addr(void)//静态的外部地址扩展{uint8 nullAddr[Z_EXTADDR_LEN] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};uint8 writeNV = TRUE;//将8位数位写入虚拟化层// First check whether a non-erased extended address exists in the OSAL NV.// 检查非扩展地址是否存在于操作虚拟化层if ((SUCCESS != osal_nv_item_init(ZCD_NV_EXTADDR, Z_EXTADDR_LEN, NULL)) ||(SUCCESS != osal_nv_read(ZCD_NV_EXTADDR, 0, Z_EXTADDR_LEN, aExtendedAddress)) ||(osal_memcmp(aExtendedAddress, nullAddr, Z_EXTADDR_LEN))) {// 尝试阅读扩展地址的位置锁位页面// 确定编程工具位置HalFlashRead(HAL_FLASH_IEEE_PAGE, HAL_FLASH_IEEE_OSET, aExtendedAddress, Z_EXTADDR_LEN);if (osal_memcmp(aExtendedAddress, nullAddr, Z_EXTADDR_LEN)){// 尝试阅读扩展地址从指定的位置信息页面if (!osal_memcmp((uint8 *)(P_INFOPAGE+HAL_INFOP_IEEE_OSET), nullAddr, Z_EXTADDR_LEN)){osal_memcpy(aExtendedAddress, (uint8 *)(P_INFOPAGE+HAL_INFOP_IEEE_OSET), Z_EXTADDR_LEN);}else // No valid extended address was found.// 没有发现有效的扩展地址{uint8 idx; // 8位的变址寻址#if !defined ( NV_RESTORE )writeNV = FALSE; // 如果写入错误,使用临时的地址#endif/* Attempt to create a sufficiently random extended address for expediency.// 尝试创建一个完全随机扩展地址* Note: this is only valid/legal in a test environment and* must never be used for a commercial product.// 有效的地址永远不会被占用*/for (idx = 0; idx < (Z_EXTADDR_LEN - 2);){uint16 randy = osal_rand();aExtendedAddress[idx++] = LO_UINT16(randy); // 16位的振荡寻址aExtendedAddress[idx++] = HI_UINT16(randy);}// 接下来建立无线局域网#if defined ZDO_COORDINATORaExtendedAddress[idx++] = 0x10;#elif defined RTR_NWKaExtendedAddress[idx++] = 0x20;#elseaExtendedAddress[idx++] = 0x30;#endif// MSB has historical signficance.aExtendedAddress[idx] = 0xF8;}}if (writeNV){(void)osal_nv_write(ZCD_NV_EXTADDR, 0, Z_EXTADDR_LEN, aExtendedAddress);}}// 定义16进制的地址位,根据上面结果设置扩展后的地址(void)ZMacSetReq(MAC_EXTENDED_ADDRESS, aExtendedAddress);}/********************************************************************** * @fn zmain_dev_info** @brief This displays the IEEE (MSB to LSB) on the LCD.** input parameters** None.** output parameters** None.** @return None.*************************************************************************** */static void zmain_dev_info(void){#ifdef LCD_SUPPORTEDuint8 i;uint8 *xad;uint8 lcd_buf[Z_EXTADDR_LEN*2+1];// Display the extended address.// 显示扩展地址xad = aExtendedAddress + Z_EXTADDR_LEN - 1;for (i = 0; i < Z_EXTADDR_LEN*2; xad--){uint8 ch;ch = (*xad >> 4) & 0x0F;lcd_buf[i++] = ch + (( ch < 10 ) ? '0' : '7');ch = *xad & 0x0F;lcd_buf[i++] = ch + (( ch < 10 ) ? '0' : '7');}lcd_buf[Z_EXTADDR_LEN*2] = '\0';HalLcdWriteString( "IEEE: ", HAL_LCD_LINE_1 );HalLcdWriteString( (char*)lcd_buf, HAL_LCD_LINE_2 );#endif}#ifdef LCD_SUPPORTED/********************************************************************* * @fn zmain_lcd_init* @brief Initialize LCD at start up.* @return none*********************************************************************/ static void zmain_lcd_init ( void ){#ifdef SERIAL_DEBUG_SUPPORTED{HalLcdWriteString( "TexasInstruments", HAL_LCD_LINE_1 );#if defined( MT_MAC_FUNC )#if defined( ZDO_COORDINATOR )HalLcdWriteString( "MAC-MT Coord", HAL_LCD_LINE_2 );#elseHalLcdWriteString( "MAC-MT Device", HAL_LCD_LINE_2 );#endif // 设备对象#elif defined( MT_NWK_FUNC )#if defined( ZDO_COORDINATOR ) //协调HalLcdWriteString( "NWK Coordinator", HAL_LCD_LINE_2 ); //网络层协调#elseHalLcdWriteString( "NWK Device", HAL_LCD_LINE_2 );#endif // ZDO#endif // MT_FUNC}#endif // SERIAL_DEBUG_SUPPORTED// 序列号调试}#endif/********************************************************************* *********************************************************************/仅供个人用于学习、研究;不得用于商业用途。
1例子1第二个灯亮之答禄夫天创作#include<reg52.h>void main(){P1=0xfd;}#include<reg52.h>Sbit D1=P1^0;Void main(){D1=0}注意:稍微改法式时需重新hex化例子2第一个灯亮#include<reg52.h> //52单片机头文件sbit led1=P1^0; //单片机管脚位声明void main() //主函数{led1=0;//将单片机P1.0口清零while(1); //法式停止在这里,在后面会讲到为什么这样写.}例子3第一个灯亮#include<reg52.h> //52单片机头文件void main() //主函数{P1=0xfe; //将单片机P1口的8个口由高到低分别赋值为11111110while(1); //法式停止在这里,在后面会讲到为什么这样写.}2例子1第三个灯闪烁fir循环#include<reg52.h>sbit D2=P1^2;unsigned int a;void main(){D2=0;for(a=0;a<=10000;a++){};D2=1;for(a=0;a<=10000;a++){};}例子2第三个闪烁while循环#include<reg52.h>sbit D2=P1^2;unsigned int a;void main(){a=5000;D2=0;while(a--);a=5000;D2=1;while(a--);}2.#include<reg52.h> //52单片机头文件sbit led1=P1^0; //单片机管脚位声明void main() //主函数{unsigned int i; //界说一个int型变量while(1){i=50000; //变量赋初值为50000led1=0;//点亮灯while(i--); //延时i=50000;led1=1; //熄灭灯while(i--);}}3例子1 3 5 7灯同时亮#include<reg52.h> //52单片机头文件sbit led1=P1^0; //单片机管脚位声明sbit led3=P1^2; //单片机管脚位声明sbit led5=P1^4; //单片机管脚位声明sbit led7=P1^6; //单片机管脚位声明void main() //主函数{led1=0;//将单片机P1.0口清零led3=0;//将单片机P1.2口清零led5=0;//将单片机P1.4口清零led7=0;//将单片机P1.6口清零while(1); //法式停止在这里,在后面会讲到为什么这样写.}例子2 1 3 5 7同时亮#include<reg52.h> //52单片机头文件void main() //主函数{P1=0xaa; //将单片机P1口的8个口由高到低分别赋值为10101010while(1); //法式停止在这里,在后面会讲到为什么这样写.}例子3流水灯一个一个接着亮不循环#include<reg52.h> //52单片机头文件void main() //主函数{unsigned int i; //界说一个int型变量while(1){i=50000; //变量赋初值为50000P1=0xfe;//点亮第一个灯while(i--); //延时i=50000; //变量赋初值为50000P1=0xfd;//点亮第二个灯while(i--); //延时i=50000; //变量赋初值为50000P1=0xfb;//点亮第三个灯while(i--); //延时i=50000; //变量赋初值为50000 P1=0xf7;//点亮第四个灯while(i--); //延时i=50000; //变量赋初值为50000 P1=0xef;//点亮第五个灯while(i--); //延时i=50000; //变量赋初值为50000 P1=0xdf;//点亮第六个灯while(i--); //延时i=50000; //变量赋初值为50000 P1=0xbf;//点亮第七个灯while(i--); //延时i=50000; //变量赋初值为50000 P1=0x7f;//点亮第八个灯while(i--); //延时}}例子4#include<reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned char uchar temp,num,num1;sbit beep=P2^3;void delay(uint);void main(){temp=0xfe;while(1){for(num1=0;num1<3;num1++){for(num=0;num<8;num++){P1=temp;beep=0;delay(100);temp=_crol_(temp,1);P1=0xff;beep=1;delay(100);}}for(num1=0;num1<3;num1++) {for(num=0;num<8;num++){P1=temp;beep=0;delay(100);temp=_cror_(temp,1);P1=0xff;beep=1;delay(100);}}while(1);}}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}4延时子法式void delay(){uint x;for(x=100;x>0;x--){};}For的嵌套void delay(){uint x,y; %局部变量for(x=100;x>0;x--) %小括号后不加分号for(y=600;y>0;y--); %小括号后的分号暗示该语句是上一条语句的,分号将该句与下句隔开(或者{for(y=600;y>0;y--);})#include<reg52.h>例子1#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit D1=P1^0;void delay(); %注意分号不能少void main(){while(1){D1=0;delay();D1=1;delay();}}void delay(){uint x,y;for(x=100;x>0;x--)for(y=600;y>0;y--);}带参数的比不带参数的要方便例子2无参和有参的比较#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit D1=P1^0;//void delay();void delay(uint);%带一个参数的,参数类型必需要写,参数可不写.比如可以写成uint z.也可以带多个参数void main()while(1){D1=0;delay(1200);%亮2秒D1=1;delay(1200);}}/*void delay(){uint x,y;for(x=100;x>0;x--) for(y=600;y>0;y--); }*/void delay(uint z) {uint x;uchar y;for(x=z;x>0;x--)for(y=20;y>0;y--);例子3#include<reg52.h>#define uint unsigned int #define uchar unsigned char sbit D1=P1^0;void delay(uint);void main(){while(1){D1=0;delay(1200);D1=1;delay(1200);}}void delay(uint z){uint x;uchar y;for(x=z;x>0;x--)for(y=20;y>0;y--);5循环左移三位如10100101(a5)-00101101(2d)。