S3C2410之LCD

发布者:w2628203123最新更新时间:2016-08-14 来源: eefocus关键字:S3C2410  LCD 手机看文章 扫描二维码
随时随地手机看文章
1、打开LCD背光

将LCD背光对应的GPIO设置为禁止上拉(GPxUP相应位写入1),选择output类型(GPxCON相应位写入01),输出为高电平(GPxDAT相应位写入1)。
2、打开LCD电源

可以将GPG4选择为LCD_PWREN(GPGCON:9-8写入11),这时候LCD电源的打开/关闭可以通过LCDCON5:3来控制。
也可以自定义其他GPIO用作LCD电源开关,只需将此GPIO设置为禁止上拉(GPxUP相应位写入1),选择output类型(GPxCON相应位写入01),输出为高电平(GPxDAT相应位写入1)打开LCD电源。
3、设置其他信号线

其他信号线包括VD0-VD23和VFRAME、VLINE、VCLK等,分别在GPCCON,GPDCON中选择相应功能。
4、设置LCD的频率(VCLK)

LCD的Datasheet上一般会写有一个推荐的频率,比如我使用的屏幕推荐频率为6.4M,我需要通过一些计算选择一个合适的CLKVAL以产生这个频率:

对于TFT LCD,S3C2440提供的VCLK的计算公式为:
VCLK = HCLK / ((CLKVAL+1)*2)

可以得出:
CLKVAL = HCLK / (VCLK * 2) - 1

我的HCLK是100Mhz(CPU运行在400Mhz, CLKDIV_VAL设置为5,Fclk:Hclk:Pclk = 1:4:8),VCLK使用屏幕推荐的6.4M,得到:
CLKVAL = 100000000 / (6400000 * 2) - 1 = 6.8

选择最接近的整数值7,写入LCDCON1:17-8。

(VCLK其实就是根据 每秒帧数*帧行数*行像素  计算出来的,帧行数和行像素需要包含空白数和同步数)
5、设置其他相关参数

LCD相关的参数主要还有这几个:
LINEVAL: LCD水平像素-1,如320-1 = 319
HOZVAL:  LCD垂直像素-1,如240-1 = 239
HFPD:    行开始前的VCLK时钟数(LCD屏幕的Datasheet一般有推荐值)
HBPD:    行结束后的VCLK时钟数(LCD屏幕的Datasheet一般有推荐值)
HSPW:    行之间水平同步的无效VCLK时钟数(LCD屏幕的Datasheet一般有推荐值)
VFPD:    帧数据开始前的空白行数(LCD屏幕的Datasheet一般有推荐值)
VBPD:    帧数据结束后的空白行数(LCD屏幕的Datasheet一般有推荐值)
VSPW:    帧之间垂直同步的无效行数(LCD屏幕的Datasheet一般有推荐值)

(相关寄存器LCDCON2, LCDCON3, LCDCON4)
6、设置视频缓冲区的地址

2440支持虚拟屏幕,可以通过改变LCD寄存器实现屏幕快速移动

PAGEWIDTH:虚拟屏幕一行的字节数,如果不使用虚拟屏幕,设置为实际屏幕的行字节数,如16位宽320像素,设为320 * 2
OFFSIZE:虚拟屏幕左侧偏移的字节数,如果不使用虚拟屏幕,设置为0

LCDBANK: 视频帧缓冲区内存地址30-22位
LCDBASEU: 视频帧缓冲区的开始地址21-1位
LCDBASEL: 视频帧缓冲区的结束地址21-1位

(相关寄存器LCDSADDR1,LCDSADDR2,LCDSADDR3)
7、确定信号的极性

2440的LCD控制器允许设置VCLK、VLINE、VFRAME等信号的极性(上升沿有效还是下降沿有效),需要对照LCD的Datasheet一一确认。

(相关寄存器LCDCON5)
8、禁止LPC3600/LCC3600模式!

如果不是使用三星LPC3600/LCC3600 LCD,必须禁止LPC3600/LCC3600模式(写入0到TCONSEL)!
9、打开视频输出

ENVID设为1 (LCDCON1:0写入1)

 

void Test_Lcd_Tft_8Bit_640480(void)
{
    int i,j,k;
    Lcd_Palette8Bit_Init();//调色板初始化,格式为 5:6:5 并赋值调色板的初始地址

void Lcd_Palette8Bit_Init(void)
{
    int i; 
    U32 *palette;
    rLCDCON5|=(1<<11); // 5:6:5 Palette Setting
    palette=(U32 *)PALETTE;
    for(i=0;i<256;i++)
 *palette++=DEMO256pal[i];
}
    Lcd_Port_Init();  //LCD端口引脚初始化,包括第二功能,数据线及控制信号线等设置, Disable Pull-up registe
static void Lcd_Port_Init(void)
{
    save_rGPCCON=rGPCCON;
    save_rGPCDAT=rGPCDAT;
    save_rGPCUP=rGPCUP;
    save_rGPDCON=rGPDCON;
    save_rGPDDAT=rGPDDAT;
    save_rGPDUP=rGPDUP;
    rGPCUP=0xffffffff; // Disable Pull-up register
    rGPCCON=0xaaaaaaaa; //Initialize VD[7:0],LCDVF[2:0], VM, VFRAME,

                                           //VLINE, VCLK,LEND 初始化数据线与各控制信号
    rGPDUP=0xffffffff; // Disable Pull-up register
    rGPDCON=0xaaaaaaaa; //Initialize VD[23:8]
}   

Lcd_Init(MODE_TFT_8BIT_640480);//针对各模式下对帧缓冲起始地址及各控制寄存器rLCDCONn等进行相应设置等进行设置
void Lcd_Init(int type)
{
    switch(type)
    {......
       case MODE_TFT_1BIT_640480:
     frameBuffer1BitTft640480=(U32 (*)[SCR_XSIZE_TFT_640480/32])LCDFRAMEBUFFER; 

/*//定义一个行数组指针extern U32 (*frameBuffer1BitTft640480)[SCR_XSIZE_TFT_640480/32],每行包括320个U32单元 指针LCDFRAMEBUFFER进行强制类型转换后赋给frameBuffer8BitTft240320,即frameBuffer8BitTft240320指向LCDFRAMEBUFFER*/
 rLCDCON1=(CLKVAL_TFT_640480<<8)|(MVAL_USED<<7)|(3<<5)|(8<<1)|0;
 /*//#define CLKVAL_TFT_640480  (1)
    //53.5hz @90Mhz
    //VSYNC,HSYNC should be inverted
    //HBPD=47VCLK,HFPD=15VCLK,HSPW=95VCLK
    //VBPD=32HSYNC,VFPD=9HSYNC,VSPW=1HSYNC
    // TFT LCD panel,8bpp TFT,ENVID=off  显示模式为TFT, VM速率为每帧一次,bpp为8bpp,禁止输出LCD视频数据及控制信号*/
 rLCDCON2=(VBPD_640480<<24)|(LINEVAL_TFT_640480<<14)|(VFPD_640480<<6)|(VSPW_640480);
 rLCDCON3=(HBPD_640480<<19)|(HOZVAL_TFT_640480<<8)|(HFPD_640480);
 rLCDCON4=(MVAL<<8)|(HSPW_640480);
 rLCDCON5=(1<<11)|(1<<9)|(1<<8); //FRM5:6:5,HSYNC and VSYNC are inverted
 rLCDSADDR1=(((U32)frameBuffer1BitTft640480>>22)<<21)|M5D((U32)frameBuffer1BitTft640480>>1);
 rLCDSADDR2=M5D( ((U32)frameBuffer1BitTft640480+(SCR_XSIZE_TFT_640480*LCD_YSIZE_TFT_640480/8))>>1 );
 rLCDSADDR3=(((SCR_XSIZE_TFT_640480-LCD_XSIZE_TFT_640480)/16)<<11)|(LCD_XSIZE_TFT_640480/16);
 rLCDINTMSK|=(3); // MASK LCD Sub Interrupt
 rLPCSEL&=(~7); // Disable LPC3600
 rTPAL=0; // Disable Temp Palette
    break;

........
   } 
}

   Glib_Init(MODE_TFT_8BIT_640480);//设置各像素点bpp的格式
void Glib_Init(int type)
{
    switch(type)
    {
    case MODE_STN_1BIT:
    ...................
     case MODE_TFT_8BIT_640480://#define MODE_TFT_8BIT_640480
     PutPixel=_PutTft8Bit_640480;      

      break;  

     ..................
}
void _PutTft8Bit_640480(U32 x,U32 y,U32 c)
{
    if(x
        frameBuffer8BitTft640480[(y)][(x)/4]=( frameBuffer8BitTft640480[(y)][x/4]
        & ~(0xff000000>>((x)%4)*8) ) | ( (c&0x000000ff)<<((4-1-((x)%4))*8) );
}

 

/*

U32 (*frameBuffer8BitTft640480)[SCR_XSIZE_TFT_640480/4];//定义一行数组指针,具有SCR_XSIZE_TFT_640480/4=320个U32类型的元素

frameBuffer8BitTft640480=(U32 (*)[SCR_XSIZE_TFT_640480/4])LCDFRAMEBUFFER;//将LCDFRAMEBUFFER强制转换为数组指针类型后赋给frameBuffer8BitTft640480      //#define LCDFRAMEBUFFER 0x33800000

rLCDSADDR1=(((U32)frameBuffer8BitTft640480>>22)<<21)|M5D((U32)frameBuffer8BitTft640480>>1);rLCDSADDR2=M5D( ((U32)frameBuffer8BitTft640480+(SCR_XSIZE_TFT_640480*LCD_YSIZE_TFT_640480/1))>>1 );

   frameBuffer8BitTft640480[(y)][(x)/4]=( frameBuffer8BitTft640480[(y)][x/4]
        & ~(0xff000000>>((x)%4)*8) ) | ( (c&0x000000ff)<<((4-1-((x)%4))*8) );

//extern U32 (*frameBuffer8BitTft640480)[SCR_XSIZE_TFT_640480/4];共包括行单元为320的U32行数组指针
//由于一个像素只占8个BIT,故一个U32单元存放了四个像素,对于一个X,需要先找到其所在的字:X/4,然后找到它所在该字中的位置:(x)%4),将其清0后再赋上相应的颜色值即: & ~(0xff000000>>((x)%4)*8) ) | ( (c&0x000000ff)<<((4-1-((x)%4))*8)    :BSWP = 0//字节不可交抑郁, HWSWP = 0半字不可交换(1:可交换);P1在[31:24],P1在[23;16]....

*/
    Lcd_PowerEnable(0, 1);//关掉电源
void Lcd_PowerEnable(int invpwren,int pwren)
{
    //GPG4 is setted as LCD_PWREN 定义引脚为第四功能即LCD_PWREN 
    rGPGUP=rGPGUP&(~(1<<4))|(1<<4); // Pull-up disable
    rGPGCON=rGPGCON&(~(3<<8))|(3<<8); //GPG4=LCD_PWREN
    //Enable LCD POWER ENABLE Function
    rLCDCON5=rLCDCON5&(~(1<<3))|(pwren<<3);   // PWREN
    rLCDCON5=rLCDCON5&(~(1<<5))|(invpwren<<5);   // INVPWREN

    Lcd_EnvidOnOff(1);//允许LCD视频数据及LCD控制信号
void Lcd_EnvidOnOff(int onoff)
{
    if(onoff==1)
 rLCDCON1|=1; // ENVID=ON
    else
 rLCDCON1 =rLCDCON1 & 0x3fffe; // ENVID Off

    Uart_Printf("[TFT 256 COLOR(8bit/1pixel) LCD TEST] ");
    Glib_ClearScr(0, MODE_TFT_8BIT_640480);//清除屏幕
void Glib_ClearScr(U32 c, int type)

    //Very inefficient function.
    int i,j;
    //if((type==MODE_TFT_1BIT_800600)|(type==MODE_TFT_8BIT_800600) |//(type==MODE_TFT_16BIT_800600))
    if((type&0x4000)&&(type&0x400))
 for(j=0;j
            for(i=0;i< FONT>


          PutPixel(i,j,c);

//else if((type==MODE_TFT_1BIT_640480)|(type==MODE_TFT_8BIT_640480)|(type==MODE_TFT_16BIT_640480))
    else if((type&0x4000)&&(type&0x200))
 for(j=0;j
            for(i=0;i
          PutPixel(i,j,c);   //在前面函数指针已赋值PutPixel=_PutTft8Bit_640480
............
}

    rTPAL = (1<<24)|((0xff)<<0); // Enable Temporary Palette : Blue
    Uart_Printf("TFT 256 color mode test 1. Press any key! ");
    Uart_Getch();   

    k=0;
    for(i=0;i<640;i+=40)
 for(j=0;j<480;j+=30)   
 {    
     Glib_FilledRectangle(i,j,i+39,j+29,(k%256));   
     k++;   
 }   
    rTPAL = 0;
    Uart_Printf("TFT 256 color mode test 2. Press any key! ");
    Uart_Getch(); 

......

}

frameBuffer8BitTft640480=(U32 (*)[SCR_XSIZE_TFT_640480/4])LCDFRAMEBUFFER;//将LCDFRAMEBUFFER强制转换为数组指针类型后赋给frameBuffer8BitTft640480      //#define LCDFRAMEBUFFER 0x33800000

rLCDSADDR1=(((U32)frameBuffer8BitTft640480>>22)<<21)|M5D((U32)frameBuffer8BitTft640480>>1);rLCDSADDR2=M5D( ((U32)frameBuffer8BitTft640480+(SCR_XSIZE_TFT_640480*LCD_YSIZE_TFT_640480/1))>>1 );

   frameBuffer8BitTft640480[(y)][(x)/4]=( frameBuffer8BitTft640480[(y)][x/4]
        & ~(0xff000000>>((x)%4)*8) ) | ( (c&0x000000ff)<<((4-1-((x)%4))*8) );

*/
    Lcd_PowerEnable(0, 1);//关掉电源
void Lcd_PowerEnable(int invpwren,int pwren)
{
    //GPG4 is setted as LCD_PWREN 定义引脚为第四功能即LCD_PWREN 
    rGPGUP=rGPGUP&(~(1<<4))|(1<<4); // Pull-up disable
    rGPGCON=rGPGCON&(~(3<<8))|(3<<8); //GPG4=LCD_PWREN
    //Enable LCD POWER ENABLE Function
    rLCDCON5=rLCDCON5&(~(1<<3))|(pwren<<3);   // PWREN
    rLCDCON5=rLCDCON5&(~(1<<5))|(invpwren<<5);   // INVPWREN

    Lcd_EnvidOnOff(1);//允许LCD视频数据及LCD控制信号
void Lcd_EnvidOnOff(int onoff)
{
    if(onoff==1)
 rLCDCON1|=1; // ENVID=ON
    else
 rLCDCON1 =rLCDCON1 & 0x3fffe; // ENVID Off

    Uart_Printf("[TFT 256 COLOR(8bit/1pixel) LCD TEST] ");
    Glib_ClearScr(0, MODE_TFT_8BIT_640480);//清除屏幕
void Glib_ClearScr(U32 c, int type)

    //Very inefficient function.
    int i,j;
    //if((type==MODE_TFT_1BIT_800600)|(type==MODE_TFT_8BIT_800600) |//(type==MODE_TFT_16BIT_800600))
    if((type&0x4000)&&(type&0x400))
 for(j=0;j
            for(i=0;i< FONT>


          PutPixel(i,j,c);

//else if((type==MODE_TFT_1BIT_640480)|(type==MODE_TFT_8BIT_640480)|(type==MODE_TFT_16BIT_640480))
    else if((type&0x4000)&&(type&0x200))
 for(j=0;j
            for(i=0;i
          PutPixel(i,j,c);   //在前面函数指针已赋值PutPixel=_PutTft8Bit_640480
............
}

    rTPAL = (1<<24)|((0xff)<<0); // Enable Temporary Palette : Blue
    Uart_Printf("TFT 256 color mode test 1. Press any key! ");
    Uart_Getch();   

    k=0;
    for(i=0;i<640;i+=40)
 for(j=0;j<480;j+=30)   
 {    
     Glib_FilledRectangle(i,j,i+39,j+29,(k%256));   
     k++;   
 }   
    rTPAL = 0;
    Uart_Printf("TFT 256 color mode test 2. Press any key! ");
    Uart_Getch(); 

......

}

关键字:S3C2410  LCD 引用地址:S3C2410之LCD

上一篇:2410之MMU_Init()
下一篇:S3C2410 MMU(存储器管理单元)

推荐阅读最新更新时间:2024-03-16 15:05

嵌入式学习笔记之GPIO详解
GPIO,英文全称为General-Purpose IO ports,也就是通用IO口。在嵌入式系统中常常有数量众多,但是结构却比较简单的外部设备/电路,对这些设备/电路有的需要CPU为之提供控制手段,有的则需要被CPU用作输入信号。而且,许多这样的设备/电路只要求一位,即只要有开/关两种状态就够了,比如灯亮与灭。对这些设备/电路的控制,使用传统的串行口或并行口都不合适。所以在微控制器芯片上一般都会提供一个“通用可编程IO接口”,即GPIO。接口至少有两个寄存器,即“通用IO控制寄存器”与“通用IO数据寄存器”。数据寄存器的各位都直接引到芯片外部,而对这种寄存器中每一位的作用,即每一位的信号流通方向,则可以通过控制寄存器中对应位独
[网络通信]
科普:从技术角度详细解析LCD与AMOLED区别和优缺点
在目前的手机行业中,如果按屏幕材质来分的话,主流的屏幕一般只有LCD和AMOLED两种,或许你能够说出这两种屏幕的一些基本特征,比如AMOLED屏幕色域广,LCD屏幕更成熟,但你知道从技术角度讲,这两种屏幕究竟有什么区别吗?在目前的手机行业中,如果按屏幕材质来分的话,主流的屏幕一般只有LCD和AMOLED两种,或许你能够说出这两种屏幕的一些基本特征,比如AMOLED屏幕色域广,LCD屏幕更成熟,但你知道从技术角度讲,这两种屏幕究竟有什么区别吗?快随LED小编了解下吧?   AMOLED   AMOLED其实是Ac TI ve Matrix Organic Light Emit TI ng Diode的缩写,核心还是在Light E
[电源管理]
工信部: 大陆彩电厂可考虑并购面板企业
陷入“冰河期”的台湾面板业,将迎来大陆方面的驰援。在上周举行的第四届海峡两岸经贸文化论坛上,国务院台湾事务办公室主任王毅宣布,为携手促进面板显示产业发展,大陆企业决定扩大采购台湾企业的面板,先期达成20亿美元的采购意向。 台湾力晶半导体董事长黄崇仁分析指出,这项采购有助缓解台湾面板企业的困境,也有助大陆电视厂家提高议价能力,进而获得与日韩液晶电视竞争的资本,算是“一石二鸟”。 全球八成减产来自台湾 台湾全球最大面板制造商的称号,今年年底将被韩国面板企业接手。由于受韩币大幅贬值的影响,近几个月来韩国面板厂在价格上的优势地位愈发明显。据某市场调研机构统计,第三季台湾面板厂在全球大尺寸面板市占率从去年同期的4
[焦点新闻]
第十九章、TIny4412 U-BOOT移植十九 LCD移植
其实我一直就只想学一点东西,当时心太大了,就直接买了Tiny4412,才发现这是一块硬骨头,网上资料少的可怜,FriendlyARM给的资料基本就是代码,说明性、讲原理的东西也没有。看了好久才发现其给的U-BOOT是不带LCD显示功能的,我就想给这个U-BOOT增加LCD显示功能,我所有的学习过程,都是为了增加LCD功能而开展的。这一篇虽然也有参考别人成份,但绝大多数内容都是我最近这段时间分析U-BOOT后,也进行相关裸机程序后(裸机代码的实现我有一篇相关的说明文档),有了一定的感觉,才顺利完成的。 下面依据《s5pv-u -boot-2011.06之增加LCD显示功能》的实现过程,来说明一下:我增加LCD功能的过程。 《s5
[单片机]
第十九章、TIny4412 U-BOOT移植十九 <font color='red'>LCD</font>移植
电力中断,康宁台中厂暂停部分LCD生产作业
康宁公司(纽约证交所代码:GLW)2009年10月19日宣布其位于台湾台中的 LCD 玻璃制造厂上周末由于电力中断,影响部分玻璃生产营运,康宁表示虽然还要经过几天才可以确定整体影响程度,但可以断定这次的电力中断将对第四季度的玻璃预产量造成实质影响。 康宁董事会副主席兼首席财务长官 James B. Flaws 表示:“台中厂大部分的玻璃生产持续正常运作。然而电力中断导致一些玻璃熔炉停止运作,我们正在进一步评估,确定受影响的玻璃熔炉产能,以及熔炉修复的时间,最终判断可供应客户玻璃产量的影响。” 康宁表示依照初步影响评估报告,第四季度的玻璃产量将会大致持平或稍微下滑。如没有电力中断事故,康宁表示相信第四季度玻璃产量将
[电源管理]
STM32实例-LCD1602电路
1602 液晶,从它的名字我们就可以看出它的显示容量,就是可以显示 2 行,每行 16 个字符的液晶,电路图如下所示。 LCD1602它的任务电压是 4.5V~5.5V,关于这点我们设计电路的时分,直接依照 5V 零碎设计,然则包管我们的 5V 零碎最低不克不及低于 4.5V。在 5V 任务电压下丈量它的任务电流是 2mA,人人留意,这个 2mA 仅仅是指液晶,而它的黄绿背光多是用 LED 做的,所以功耗不会太小的,一二十毫安照样有的。1602 液晶一共 16 个引脚,每一个引脚的功用,我们都可以在它的数据手册上取得。而这些根本的信息,在我们设计电路和编写代码之前,必须先看明确,1602 液晶引脚功用如下表所示。 LCD
[单片机]
基于ARM的LCD触摸屏系统设计方案
  引言   随着嵌入式系统技术的飞速发展,工业设备产品也越来越现代化,普遍要求可视化操作。LCD触摸屏低耗能.散热小,成本低,纤薄轻巧,外形尺寸小,安装容易。使用LCD触摸屏作为工业设备的输入输出设备既能达到可视化的要求,方便现场操作,又能降低产品的成本。而在产品的整体设计过程中,人机交互界面的设计往往占据着很大一部分工作,这样,不但极大地增加了产品的开发成本瓶且延长了产品的上市周期。本文设计的基于S3C44BOX的人机交互界面是一种可定制、简单易用、性能优良的通用型人机交互界面,能很好地解决上述问题。   1 系统结构   系统主要包括三个部分,分别为PC机、S3C4480X微处理器和LCD触摸屏模块。系统结构框图如图1所示
[单片机]
基于ARM的<font color='red'>LCD</font>触摸屏系统设计方案
Microchip高性能USB、LCD及通用8位PIC系列再添12位ADC
12款新型PIC18单片机迎合需高分辨率模数转换功能的先进传感器设计,为外部模数转换器节省成本并化繁为简 全球领先的单片机和模拟半导体供应商——Microchip Technology Inc.(美国微芯科技公司)宣布推出12款全新的高性能、8位闪存单片机,其中包括该公司首款集成片上高速12位模数转换器外设的USB及LCD单片机系列。三个新产品系列共备有16种集成高分辨率片上模数转换器的高性能PIC18 单片机,扩展了Microchip通用PIC18F4523系列产品线并极大地丰富了客户的选择。 在这三个新产品系列中,PIC18F8723大容量存储器通用系列提供丰富的外设集以及高达10 MIPS的卓越性能;PIC18F4553
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • Linux内核移植
    实验步骤:(1)准备工作(2)修改顶层Makefile(3)修改falsh 分区(4)配置编译内核下面以Linux2 6 30 4内核移植到gec2440为例:一、准备 ...
  • S5PV210 PWM定时器
    第一节 S5PV210的PWM定时器S5PV210共有5个32bit的PWM定时器,其中定时器0、1、2、3有PWM功能,定时器4没有输出引脚。PWM定时器使用PCLK_PS ...
  • S5PV210 NAND Flash
    NAND Flash关于NAND FlashS5PV210的NAND Flash控制器有如下特点:1) 支持512byte,2k,4k,8k的页大小2) 通过各种软件模式来进行NAND Fl ...
  • S5PV210串口
    串口设置之输入输出字符S5PV210 UART相关说明 通用异步收发器简称UART,即UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER,它用来 ...
  • S5PV210按键控制LED
    原理图如图所示:查询用户手册得到:程序例子:(完整代码见“代码下载链接”)1、轮询的方式查询按键事件 *main c* 核心代码如下:while(1 ...
  • S5PV210控制蜂鸣器
  • S5PV210的启动过程
  • S5PV210点亮LED
  • S5PV210启动过程详解
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved