基础操作:

LED:红灯与蓝灯,红灯---亮/灭,蓝灯---亮/灭/呼吸
节点:/sys/class/misc/misc_dev/pwm_leds/ 
blue_func: 
cat 读取状态 
echo 写入:0:低亮;1:中亮;2:高亮;4:灭;6:呼吸灯 
 
red_func 
cat 读取状态 
echo 写入:1:中亮;4:灭;

可调节led占空比,输入任意101-199的数字,其值减去100即为输入占空比,如:

想输入占空比为95,则输入:

echo 195 > /sys/class/misc/misc_dev/pwm_leds/blue_func

想输入占空比为4,则输入:

echo 104 > /sys/class/misc/misc_dev/pwm_leds/blue_func

效果展示:

pwm led驱动源码

#include <linux/kernel.h>
#include <linux/platform_device.h>
#include <linux/err.h>
#include <linux/gpio.h>
#include <linux/module.h>
#include <linux/ktime.h>
#include <linux/miscdevice.h>
#include <linux/delay.h>
#include <linux/proc_fs.h>
#include <linux/fs.h>
#include <linux/syslog.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <linux/pwm.h>
#include <linux/platform_device.h>
#include <linux/slab.h>/*red led gpio PE1*/
#define RLED_NUM 129
#define ENABLE 1
#define DISABLE 0
#define MAX    100
#define LED_DEFAULT_STATE 9
#define LED_DEFAULT_DELAY (HZ / 20)
//#define DEBUG_PWM#ifdef DEBUG_PWM
#define  pwm_printf  pr_info
#else
#define  pwm_printf  pr_debug
#endifstatic unsigned int duty_ns = 8000000; /*占空,高电平 u32*/
static unsigned long long period_ns = 10000000; /*周期__u64*/
static struct mutex     pwm_muter;
static struct delayed_work blue_led_delay_work;
static struct delayed_work green_led_delay_work;struct pwm_green_led {struct pwm_device *pwm0_dev;int pwm_id; /*0:green;1:blue*/unsigned long green_status;int time_delay;
};struct pwm_blue_led {struct pwm_device *pwm1_dev;int pwm_id; /*0:green;1:blue*/unsigned long blue_status;int time_delay;
};struct pwm_red_led {unsigned long red_status;u32 rled_gpio;
};static struct pwm_green_led *t_pwm_green_led;
static struct pwm_blue_led *t_pwm_blue_led;
static struct pwm_red_led  *t_pwm_red_led;static void set_pwm(int pwm_id, int level)
{unsigned int ret = 0;unsigned duty_ns, period_ns ;mutex_lock(&pwm_muter);period_ns = 100000; /*1000000000/10000 freq=10KHz, 1s=1000000000ns*/duty_ns = (period_ns * level)/MAX ;if (pwm_id == 0) {ret = pwm_config(t_pwm_green_led->pwm0_dev, duty_ns, period_ns);ret = pwm_enable(t_pwm_green_led->pwm0_dev);} else if (pwm_id == 1) {ret = pwm_config(t_pwm_blue_led->pwm1_dev, duty_ns, period_ns);ret = pwm_enable(t_pwm_blue_led->pwm1_dev);}pwm_printf("[pwm_leds] pwm_config pwm%d:<%d | %d>, ret = %d\n",pwm_id, duty_ns, period_ns, ret);mutex_unlock(&pwm_muter);
}static ssize_t get_blue_func(struct device *dev,struct device_attribute *attr, char *buf)
{return sprintf(buf, "%d\n", (int)t_pwm_blue_led->blue_status);
}static ssize_t set_blue_func(struct device *dev, struct device_attribute *attr,const char *buf, size_t size)
{int ret;ret = kstrtoul(buf, 10, &t_pwm_blue_led->blue_status);if (t_pwm_blue_led->time_delay != 0)cancel_delayed_work_sync(&blue_led_delay_work);pwm_printf("id = %d, status= %d\n",t_pwm_blue_led->pwm_id, t_pwm_blue_led->blue_status);switch (t_pwm_blue_led->blue_status) {case 0: /*LOW_BRIGHT*/t_pwm_blue_led->time_delay = 0;set_pwm(t_pwm_blue_led->pwm_id, 90);break;case 1: /*MIDIUM_BRIGHT*/t_pwm_blue_led->time_delay = 0;set_pwm(t_pwm_blue_led->pwm_id, 50);break;case 2: /*HIGHT_BRIGHT*/t_pwm_blue_led->time_delay = 0;set_pwm(t_pwm_blue_led->pwm_id, 10);break;case 4: /*DISABLE*/t_pwm_blue_led->time_delay = 0;pwm_disable(t_pwm_blue_led->pwm1_dev);break;case 6: /*ADJEST_BRGHT*/t_pwm_blue_led->time_delay = HZ / 2;break;case 7: /*test*/t_pwm_blue_led->time_delay = 0;set_pwm(t_pwm_blue_led->pwm_id, 99);break;case 8: /*test*/t_pwm_blue_led->time_delay = 0;set_pwm(t_pwm_blue_led->pwm_id, 50);break;case 9: /*test*/t_pwm_blue_led->time_delay = 0;set_pwm(t_pwm_blue_led->pwm_id, 4);break;default:if(t_pwm_blue_led->blue_status > 100 || t_pwm_blue_led->blue_status < 200){t_pwm_blue_led->time_delay = 0;set_pwm(t_pwm_blue_led->pwm_id, (t_pwm_blue_led->blue_status-100));}else{t_pwm_blue_led->time_delay = 0;pr_err("inval cmd\n");}break;}if (t_pwm_blue_led->time_delay)schedule_delayed_work(&blue_led_delay_work,t_pwm_blue_led->time_delay);return size;
}static ssize_t get_green_func(struct device *dev,struct device_attribute *attr, char *buf)
{return sprintf(buf, "%d\n", (int)t_pwm_green_led->green_status);
}static ssize_t set_green_func(struct device *dev, struct device_attribute *attr,const char *buf, size_t size)
{int ret;ret = kstrtoul(buf, 10,  &t_pwm_green_led->green_status);if (t_pwm_green_led->time_delay != 0)cancel_delayed_work_sync(&green_led_delay_work);pwm_printf("pwm_id = %d, status= %d\n",t_pwm_green_led->pwm_id,t_pwm_green_led->green_status);switch (t_pwm_green_led->green_status) {case 0: /*LOW_BRIGHT*/t_pwm_green_led->time_delay = 0;set_pwm(t_pwm_green_led->pwm_id, 90);break;case 1: /*MIDIUM_BRIGHT*/t_pwm_green_led->time_delay = 0;set_pwm(t_pwm_green_led->pwm_id, 50);break;case 2: /*HIGHT_BRIGHT*/t_pwm_green_led->time_delay = 0;set_pwm(t_pwm_green_led->pwm_id, 10);break;case 4: /*DISABLE*/t_pwm_green_led->time_delay = 0;pwm_disable(t_pwm_green_led->pwm0_dev);break;case 6: /*ADJEST_BRGHT*/t_pwm_green_led->time_delay = HZ / 20;break;default:if(t_pwm_green_led->green_status > 100 || t_pwm_green_led->green_status < 200){t_pwm_green_led->time_delay = 0;set_pwm(t_pwm_green_led->pwm_id, (t_pwm_green_led->green_status-100));}else{t_pwm_green_led->time_delay = 0;pr_err("inval cmd\n");}break;}if (t_pwm_green_led->time_delay)schedule_delayed_work(&green_led_delay_work,t_pwm_green_led->time_delay);#if 0/*int pwm_id = 0;*/switch (green_status) {case 1: /*MIDIUM_BRIGHT*/set_pwm0(0, 30);break;case 4: /*DISABLE*/pwm_disable(pwm0_dev);break;default:pr_err("inval cmd\n");break;}
#endifreturn size;
}
static ssize_t set_red_func(struct device *dev, struct device_attribute *attr,const char *buf, size_t size)
{int ret;ret = kstrtoul(buf, 10,  &t_pwm_red_led->red_status);pwm_printf("red_status= %d\n", t_pwm_red_led->red_status);switch (t_pwm_red_led->red_status) {case 0:case 1: /*MIDIUM_BRIGHT*/case 2:gpio_set_value(t_pwm_red_led->rled_gpio, 1);break;case 4: /*DISABLE*/gpio_set_value(t_pwm_red_led->rled_gpio, 0);break;default:pr_err("inval cmd\n");break;}return size;
}
static ssize_t get_red_func(struct device *dev,struct device_attribute *attr, char *buf)
{return sprintf(buf, "%d\n", (int)t_pwm_red_led->red_status);
}static DEVICE_ATTR(blue_func, 0664,get_blue_func, set_blue_func);
static DEVICE_ATTR(green_func, 0664,get_green_func, set_green_func);
static DEVICE_ATTR(red_func, 0664,get_red_func, set_red_func);static struct attribute *sunxi_pwmleds_attributes[] = {&dev_attr_blue_func.attr,&dev_attr_green_func.attr,&dev_attr_red_func.attr,NULL
};static struct attribute_group sunxi_pwmleds_attribute_group = {.name = "pwm_leds",.attrs = sunxi_pwmleds_attributes
};static struct miscdevice sunxi_pwmleds_dev = {.minor = MISC_DYNAMIC_MINOR,.name = "misc_dev",
};
static void pwm_blue_led_delay_work(struct work_struct *work)
{static int level;static int pol;pwm_printf(">>>led_timer_func level= %d, pol=%d+++\n", level, pol);int pwm_id = t_pwm_blue_led->pwm_id;switch (level) {
#if 1case 0:set_pwm(pwm_id, 99);break;case 1:set_pwm(pwm_id, 96);break;case 2:set_pwm(pwm_id, 92);break;case 3:set_pwm(pwm_id, 88);break;case 4:set_pwm(pwm_id, 84);break;case 5:set_pwm(pwm_id, 80);break;case 6:set_pwm(pwm_id, 76);break;case 7:set_pwm(pwm_id, 72);break;case 8:set_pwm(pwm_id, 68);break;case 9:set_pwm(pwm_id, 64);break;case 10:set_pwm(pwm_id, 60);break;case 11:set_pwm(pwm_id, 56);break;case 12:set_pwm(pwm_id, 52);break;case 13:set_pwm(pwm_id, 48);break;case 14:set_pwm(pwm_id, 44);break;case 15:set_pwm(pwm_id, 40);break;case 16:set_pwm(pwm_id, 36);break;case 17:set_pwm(pwm_id, 32);break;case 18:set_pwm(pwm_id, 28);break;case 19:set_pwm(pwm_id, 24);break;case 20:set_pwm(pwm_id, 20);break;case 21:set_pwm(pwm_id, 16);break;case 22:set_pwm(pwm_id, 12);break;case 23:set_pwm(pwm_id, 8);break;case 24:set_pwm(pwm_id, 4);break;
#elsecase 0:set_pwm(pwm_id, 100);break;
/*    case 1: set_pwm(pwm_id, 96); break;*/case 2:set_pwm(pwm_id, 92);break;
/*    case 3: set_pwm(pwm_id, 88); break;*/case 4:set_pwm(pwm_id, 84);break;
/*    case 5: set_pwm(pwm_id, 80); break;*/case 6:set_pwm(pwm_id, 76);break;
/*    case 7: set_pwm(pwm_id, 72); break;*/case 8:set_pwm(pwm_id, 68);break;
/*    case 9: set_pwm(pwm_id, 64); break;*/case 10:set_pwm(pwm_id, 60);break;
/*    case 11: set_pwm(pwm_id, 56); break;*/case 12:set_pwm(pwm_id, 52);break;
/*    case 13: set_pwm(pwm_id, 48); break;*/case 14:set_pwm(pwm_id, 44);break;
/*    case 15: set_pwm(pwm_id, 40); break;*/case 16:set_pwm(pwm_id, 36);break;
/*    case 17: set_pwm(pwm_id, 32); break;*/case 18:set_pwm(pwm_id, 28);break;
/*    case 19: set_pwm(pwm_id, 24); break;*/case 20:set_pwm(pwm_id, 20);break;
/*    case 21: set_pwm(pwm_id, 16); break;*/case 22:set_pwm(pwm_id, 12);break;
/*    case 23: set_pwm(pwm_id, 8); break;*/case 24:set_pwm(pwm_id, 4);break;
#endifdefault:break;}if (pol == 1) {level = level + 1;if (level >= 24) {level = 24;pol = 0;}} else {level = level - 1;if (level <= 0) {level = 0;pol = 1;}}if (level == 24)schedule_delayed_work(&blue_led_delay_work, HZ/1);else if (level == 0)schedule_delayed_work(&blue_led_delay_work, HZ/2);elseschedule_delayed_work(&blue_led_delay_work, HZ/(level+4));
}static void pwm_green_led_delay_work(struct work_struct *work)
{static int level;static int pol;int pwm_id = t_pwm_green_led->pwm_id;pwm_printf(">>>led_timer_func level= %d, pol=%d+++\n", level, pol);switch (level) {
#if 1case 0:set_pwm(pwm_id, 99);break;case 1:set_pwm(pwm_id, 96);break;case 2:set_pwm(pwm_id, 92);break;case 3:set_pwm(pwm_id, 88);break;case 4:set_pwm(pwm_id, 84);break;case 5:set_pwm(pwm_id, 80);break;case 6:set_pwm(pwm_id, 76);break;case 7:set_pwm(pwm_id, 72);break;case 8:set_pwm(pwm_id, 68);break;case 9:set_pwm(pwm_id, 64);break;case 10:set_pwm(pwm_id, 60);break;case 11:set_pwm(pwm_id, 56);break;case 12:set_pwm(pwm_id, 52);break;case 13:set_pwm(pwm_id, 48);break;case 14:set_pwm(pwm_id, 44);break;case 15:set_pwm(pwm_id, 40);break;case 16:set_pwm(pwm_id, 36);break;case 17:set_pwm(pwm_id, 32);break;case 18:set_pwm(pwm_id, 28);break;case 19:set_pwm(pwm_id, 24);break;case 20:set_pwm(pwm_id, 20);break;case 21:set_pwm(pwm_id, 16);break;case 22:set_pwm(pwm_id, 12);break;case 23:set_pwm(pwm_id, 8);break;case 24:set_pwm(pwm_id, 4);break;
#elsecase 0:set_pwm(pwm_id, 100);break;
/*    case 1: set_pwm(pwm_id, 96); break;*/case 2:set_pwm(pwm_id, 92);break;
/*    case 3: set_pwm(pwm_id, 88); break;*/case 4:set_pwm(pwm_id, 84);break;
/*    case 5: set_pwm(pwm_id, 80); break;*/case 6:set_pwm(pwm_id, 76);break;
/*    case 7: set_pwm(pwm_id, 72); break;*/case 8:set_pwm(pwm_id, 68);break;
/*    case 9: set_pwm(pwm_id, 64); break;*/case 10:set_pwm(pwm_id, 60);break;
/*    case 11: set_pwm(pwm_id, 56); break;*/case 12:set_pwm(pwm_id, 52);break;
/*    case 13: set_pwm(pwm_id, 48); break;*/case 14:set_pwm(pwm_id, 44);break;
/*    case 15: set_pwm(pwm_id, 40); break;*/case 16:set_pwm(pwm_id, 36);break;
/*    case 17: set_pwm(pwm_id, 32); break;*/case 18:set_pwm(pwm_id, 28);break;
/*    case 19: set_pwm(pwm_id, 24); break;*/case 20:set_pwm(pwm_id, 20);break;
/*    case 21: set_pwm(pwm_id, 16); break;*/case 22:set_pwm(pwm_id, 12);break;
/*    case 23: set_pwm(pwm_id, 8); break;*/case 24:set_pwm(pwm_id, 4);break;
#endifdefault:break;}if (pol == 1) {level = level + 1;if (level >= 24) {level = 24;pol = 0;}} else {level = level - 1;if (level <= 0) {level = 0;pol = 1;}}if (level == 24)schedule_delayed_work(&green_led_delay_work, HZ/1);else if (level == 0)schedule_delayed_work(&green_led_delay_work, HZ/2);elseschedule_delayed_work(&green_led_delay_work, HZ/(level+4));
}static int pwm_leds_ctrl_init(void)
{int ret = 0;int pwm_id = 0; /*pwm0_para used*/pwm_printf("[pwm_leds]: %s: %d===into\n", __func__, __LINE__);t_pwm_green_led = kzalloc(sizeof(struct pwm_green_led), GFP_KERNEL);t_pwm_blue_led = kzalloc(sizeof(struct pwm_blue_led), GFP_KERNEL);t_pwm_red_led = kzalloc(sizeof(struct pwm_red_led), GFP_KERNEL);if (!t_pwm_green_led || !t_pwm_blue_led || !t_pwm_red_led) {pr_err("[pwm_leds] request memory fail!\n");return -1;}t_pwm_green_led->pwm0_dev = pwm_request(0, "led_green");if (t_pwm_green_led->pwm0_dev == NULL ||IS_ERR(t_pwm_green_led->pwm0_dev)) {pr_err("[pwm_leds] pwm_request pwm0 fail!\n");return -1;}t_pwm_green_led->green_status = LED_DEFAULT_STATE;t_pwm_green_led->pwm_id = 0;t_pwm_green_led->time_delay = LED_DEFAULT_DELAY;pwm_printf("[pwm_leds] pwm_request pwm0 success!\n");t_pwm_blue_led->pwm1_dev = pwm_request(1, "led_blue");if (t_pwm_blue_led->pwm1_dev ==  NULL ||IS_ERR(t_pwm_blue_led->pwm1_dev)) {pr_err("[pwm_leds] pwm_request pwm1 fail!\n");return -1;}t_pwm_blue_led->blue_status = LED_DEFAULT_STATE;t_pwm_blue_led->pwm_id = 1;t_pwm_blue_led->time_delay = LED_DEFAULT_DELAY;pwm_printf("[pwm_leds] pwm_request pwm1 success!\n");t_pwm_red_led->rled_gpio = RLED_NUM;t_pwm_red_led->red_status = LED_DEFAULT_STATE;if (!gpio_is_valid(t_pwm_red_led->rled_gpio)) {pr_err("failed to get gpio\n");return -EINVAL;}ret = gpio_request(t_pwm_red_led->rled_gpio, "rled_gpio");if (ret) {pr_err("failed to request rled gpio\n");return -EINVAL;}gpio_direction_output(t_pwm_red_led->rled_gpio, 1);gpio_set_value(t_pwm_red_led->rled_gpio, 0);mutex_init(&pwm_muter);INIT_DELAYED_WORK(&blue_led_delay_work, pwm_blue_led_delay_work);INIT_DELAYED_WORK(&green_led_delay_work, pwm_green_led_delay_work);return ret;
}static int __init pwm_leds_init(void)
{int ret, err, pwmleds_used;pwm_printf("pwmleds debug gpio driver init\n");ret = pwm_leds_ctrl_init();if (ret == 0)pwm_printf("pwm_leds_init is ok==============\n");elsepwm_printf("pwm_leds_init is err==============\n");err = misc_register(&sunxi_pwmleds_dev);if (err) {pwm_printf("%s led register as misc device error\n", __func__);goto exit;}err = sysfs_create_group(&sunxi_pwmleds_dev.this_device->kobj,&sunxi_pwmleds_attribute_group);if (err)pwm_printf("%s sysfs_create_group  error\n", __func__);return 0;
exit:return -1;
}static void __exit pwm_leds_exit(void)
{pwm_printf("Bye, pwm_leds exit\n");gpio_set_value(t_pwm_red_led->rled_gpio, 0);gpio_free(t_pwm_red_led->rled_gpio);pwm_disable(t_pwm_green_led->pwm0_dev);pwm_disable(t_pwm_blue_led->pwm1_dev);cancel_delayed_work_sync(&blue_led_delay_work);cancel_delayed_work_sync(&green_led_delay_work);pwm_free(t_pwm_green_led->pwm0_dev);pwm_free(t_pwm_blue_led->pwm1_dev);kfree(t_pwm_green_led);kfree(t_pwm_blue_led);kfree(t_pwm_red_led);sysfs_remove_group(&sunxi_pwmleds_dev.this_device->kobj,&sunxi_pwmleds_attribute_group);misc_deregister(&sunxi_pwmleds_dev);
}module_init(pwm_leds_init);
module_exit(pwm_leds_exit);MODULE_DESCRIPTION("a simple pwmleds driver");
MODULE_AUTHOR("yanu");
MODULE_LICENSE("GPL");

全志平台Tina PWM控制LED调试相关推荐

  1. PWM控制LED亮度(2-呼吸灯)-STM32电控学习笔记10

    PWM控制LED亮度(2-呼吸灯)-STM32电控学习笔记10 day10:2022/9/29 前面学了两三天的PWM了,PWM本身不难理解,至于为啥进度缓慢,还不是这时钟定时器分频值重装载啥的太难理 ...

  2. 控制led亮度C语言程序,单片机pwm控制led亮度原理图

    单片机pwm控制led亮度原理图 用51产生PWM去控制LED,首先要确定PWM的周期T和占空比D,确定了这些以后,可以用定时器产生一个时间基准t,比如定时器溢出n次的时间是PWM的高电平的时间,则D ...

  3. PWM控制LED亮度变化的原理(超详解)

    PWM控制LED亮度变化的原理 通过ARR寄存器来设定预装载值,以确定循环频率和周期,计数器寄存器CNT从0开始计数,设定一个CCR寄存器的值,来跟CNT的计数值进行比较,当CNT的值小于CCR寄存器 ...

  4. 基于XLINX的PWM控制LED模块设计

    1.原理: PWM脉冲宽度调制,即调节脉冲的占空比.当输出的脉冲频率一定时,输出的脉冲占空比越大,相当于输出的有效电平越大,这样实现由FPGA来控制模拟量. 2.代码实现 PWM控制模块 module ...

  5. 自动感光调节LED灯亮度C语言程序,PWM控制LED灯的亮度(C 语言)

    控制LED灯的亮度,通过调节电压的方式可以达到,但不理想,而且可调的范围很小,电压稍高,还容易把LED烧毁,唯一可行的方法就是通过PWM(脉冲宽度调节)来控制其亮度. 以下程序是在单片机中控制LED. ...

  6. 启明智显分享| ESP32学习笔记参考--PWM(脉冲宽度调制) 篇,配PWM控制 LED呼吸灯代码示例参考

    提示:启明智显专为智能产品提供一站式彩屏显示+连接+云端服务+APP软件开发.维护等解决方案,帮厂商快速实现硬件的智能化.作为启明云端旗下方案公司,我们用心整理了开发小伙伴在开发过程中可能会遇到的问题 ...

  7. stm32接入机智云平台实现app控制led灯

    准备工具: stm32f407 单片机 esp8266 WiFi模块 PC 机智云app flash烧写工具 第一步烧写机智云Gagent固件 进入下载中心,选择硬件资源开发GAgent,选择我们要烧 ...

  8. 全志平台Tina系统启动阶段改设备DTS的方法

    原文链接:https://bbs.aw-ol.com/topic/276 更多信息,欢迎来全志在线开发者社区看~ 在设备BSP调试的过程中,经常会出现需要修改DTS的情况,比如调试一个新的屏幕.传感器 ...

  9. HAL库PWM控制LED灯

    任务: 使用TIM3和TIM4,分别输出一个PWM波形,PWM的占空比随时间变化,去驱动你外接的一个LED以及最小开发板上已焊接的LED(固定接在 PC13 GPIO端口),实现2个 LED呼吸灯的效 ...

最新文章

  1. 数组中查找某个元素是否存在
  2. POJ2186:Popular Cows(tarjan+缩点)
  3. [APB VNext 笔记] UI
  4. Go:json包的坑
  5. 武汉理工大学c语言实验 编程解决鸡兔同笼问题,C语言程序设计实验指导
  6. Docker 更换下载镜像源
  7. weblogic中ssrf漏洞修复_WebLogic SSRF 及漏洞修复
  8. opencv学习笔记20:图像轮廓
  9. 【.NET Core项目实战-统一认证平台】第一章 功能及架构分析
  10. 静态方法+工厂方法(静态方法用途)
  11. C++ 11 深度学习(一)auto、头文件防卫、引用、常量
  12. R 学习 - 箱线图
  13. 苹果员工号召罢工 呼吁顾客平安夜不购买苹果产品
  14. StringBuilder和String有哪些区别?
  15. arraylist可以存储不同类型吗_创新科技 - 不同防冻液可以混加吗
  16. mysql primary重复_mysql:键'PRIMARY'和奇怪的ID行为重复条目'0'
  17. Android数据库框架Sugar的使用
  18. 实践:服务器编写/系统架构/cache
  19. 学习C语言需要学oracle,什么是C语言? 为什么要学习C语言?
  20. 【AGL】初探AGL之Application framework

热门文章

  1. fastadmin table 列表 时间更改为 年月日
  2. CSS 实现对号效果
  3. 致青春---关于工作生活的一点感想
  4. flot 自定义显示日期
  5. 百度前端技术学院Flag
  6. 7-60 高速公路超速处罚 (15 分)
  7. 软件交付时间紧,赶着上线怎么办?
  8. 企业邮件系统搭建-关于不能往yahoo,sina,hotmail地址发邮件的问题二
  9. 海龟画图,颜色的单词
  10. 使用树莓派3B制作无线路由器