完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
这个论坛很不错
|
|
|
|
|
|
|
|
|
|
第十六节:液晶屏第三大类定律—任意位置显示一个点(彩色320240点阵屏)
第三大类定律:任意位置显示一个点的类型。 这类液晶屏在任意位置上以一个点为基本单位,因此X坐标数值的最大范围就直接是横向上的点阵数减去一(因为从零开始)。而Y坐标数值的最大范围就直接是纵向上的点阵数减去一(因为从零开始)。 (1) 开场白: 这节 我以彩色320240点阵屏为例子,来继续深入了解第三大类定律:任意位置显示一个点的类型。 彩色320240点阵屏跟TFT彩屏有点不一样,彩色320240点阵屏是低像素的屏,仅仅适合显示有颜色的图标或者字体,不能显示照片或者图像等,单片机驱动它完全没有问题。TFT彩屏是高像素的屏,可以显示照片或者图像,用单片机驱动会显得力不从心,必须用高级的芯片,比如ARM系列的。 我这节讲的彩色320240点阵屏是用什么驱动IC呢?这个我也没有仔细去查,反正这类屏很常用,从深圳南头关外的107国道开往固戍方向的小型公共汽车上,就可以看到驾驶室仪表上用的就是这个屏,黑底红字,视觉效果非常棒。 如果读者看了鸿哥之前几节关于液晶显示屏的文章,相信读者能摸出了我做液晶驱动程序的套路: 第一步:当我拿到一款新的液晶屏时,我会先从液晶厂家要回一个演示驱动程序,如果厂家没有就想办法在网上下载一个。靠看驱动芯片的PDF文档写驱动程序是最笨的一个办法。 第二步:厂家或者网上的演示驱动程序大部分都是很乱,没有规则的,但是不用怕,只要根据“吴坚鸿液晶显示三大类定律“的指导思想,在别人的演示驱动程序中寻找到最核心的东西,也就是显示的基本单位是属于三种类型中的哪一种,最后根据显示单位的类型自己动手编写几个最核心的程序void ***_display816, void hz_display1616, void hz_display2424就够了,其它初始化的寄存器参数从来不用管,照抄就可以了。 彩色320240液晶屏实际上就是由一块彩色320240液晶屏组成的,没有分屏合并的概念。彩色320240屏在横向上是320个点,纵向上是240个点,也就是一个长方形的屏。因为它属于第三大类的屏,所以X轴坐标数值的最大范围是320-1=319,而纵向坐标数值的最大范围是240-1=239. 正常的操作思路是这样的,先设置要显示的点的颜色,然后就显示对应的点。要显示对应的点,只要在显示子程序中发送X轴与Y轴的位置数据,就相当于显示某个具体位置的点。 横向取模,字节正序与倒序的概念解释:当我们一次在横向上显示八个点的基本单位时,实际上等于我们发送了一个字节的显示数据,比如0x01,如果是正序的屏,那么从左到右的八个点中,只有第8个点是显示的,其它的是空白,而如果是倒序的屏,则只有第1个点是显示的,其它是空白的。彩色320240这个屏因为是第三类的屏,所以无论是横向或者纵向,正序或者倒序都可以操作,关键是看你写的驱动程序是按什么模式来写的。我这节是以横向顺序屏的模式来写彩色320240的驱动程序。 取模软件是必须的,读者可以在网上自己下载,资料很多。 (2)功能需求: 在彩色320240屏上分别显示8X16的字符,16X16的汉字,24X24的汉字。 (3)硬件原理: 彩屏不用可调电阻调对比度,其它的跟一般的单色屏差不多。模块与背光的电源线接上5V,其它数据线跟单片机的IO口连接上。这个大家都懂。 (4)源码适合的单片机:pic18f4520,晶振为22.1184MHz。 (5)源代码讲解如下: #include #define uchar unsigned char #define uint unsigned int #define ulong unsigned long #define RED 0xf800 //显示不同的颜色配置参数 #define GREEN 0x07e0 #define BLUE 0x001f #define YELLOW 0xffe0 #define CYAN 0x07ff #define MAGENTA 0xf81f #define BLACK 0x0000 #define WHITE 0xffff #define GRAY 0x8410 #define hi_re 0xf800 //显示不同的颜色配置参数 #define hi_or 0xfc00 #define hi_ye 0xffb0 #define hi_yg 0x87e0 #define hi_gr 0x07e0 #define hi_gc 0x07f0 #define hi_cy 0x07ff #define hi_cb 0x041f #define hi_bl 0x001f #define hi_bm 0x801f #define hi_ma 0xf8f1 #define hi_mr 0xf810 //补充说明:吴坚鸿程序风格是这样的,凡是输出IO后缀都是_dr,凡是输入的//IO后缀都//是_sr,凡是数据总线后缀都是_bus #define LCDBUS LATD #define _CS_dr LATC4 #define _RES_dr LATC5 #define A1_dr LATC3 #define _WR_dr LATB2 #define _RD_dr LATB1 void delay(unsigned int t);//时序延时子程序 void screen_clear ();//清空屏幕的内容,实际上相当于整屏涂上白色背景 void SDIN_0(); //液晶驱动程序的一部分,不用知道具体含义,照抄就行 void SDIN_1(); void SCLK_0(); void SCLK_1(); void SENA_0(); void SENA_1(); void write_com(unsigned char cmdcode);//写命令到LCD,,驱动液晶程序的一部分 void write_com_pkg(const unsigned char *pkg);//一次写4个字节的包裹命令到LCD,,驱动液晶程序的一部分 void SetFgColor(uint color);//设置显示的颜色,在显示字体或者任何点阵前,必须先设置将要显示的颜色,驱动液晶程序的一部分 void Draw_Line(uint x1,uint y1,uint x2,uint y2);//画直线,原厂配套的演示驱动程序,不是本节的重点,x1,y1为直线的起点坐标,x2,y2为直线的终点坐标, void Draw_Rect(uint x1,uint y1,uint x2,uint y2);//画矩形,原厂配套的演示驱动程序,不是本节的重点,x1,y1为矩形的起点坐标,x2,y2为矩形对角的终点坐标, void Fill_Rect(uint x1,uint y1,uint x2,uint y2);//画填充矩形,原厂配套的演示驱动程序,不是本节的重点,x1,y1为矩形的起点坐标,x2,y2为矩形对角的终点坐标, //显示一个基本单位--在任意一个位置显示一个点,正是本节苦苦寻找的东西,本节的核心内容 //x1和y1是要显示的某个具体点的坐标位置,我们是根据这个基本点来编写我们的各种不同字体的程序 void dwg_pixel(uint x1,uint y1); void SdRegVal(uchar RegAdd, uchar RegDat);//配置液晶内部驱动寄存器的函数,不是本节重点,在初始化里照抄即可 //显示8X16的字符函数,本节的核心内容。col代表X轴,pag代表Y轴,zk代表显示相对应的字库, //因为是彩屏,不存在反显或者正显,显示之前要先设置一下想要显示内容的颜色即可。 void ***_display816(unsigned char col, unsigned char pag,const unsigned char *zk); //显示16X16的汉字函数,本节的核心内容。col代表X轴,pag代表Y轴,zk代表显示相对应的字库, //因为是彩屏,不存在反显或者正显,显示之前要先设置一下想要显示内容的颜色即可。 void hz_display1616(unsigned char col, unsigned char pag,const unsigned char *zk); //显示24X24的汉字函数,本节的核心内容。col代表X轴,pag代表Y轴,zk代表显示相对应的字库, //因为是彩屏,不存在反显或者正显,显示之前要先设置一下想要显示内容的颜色即可。 void hz_display2424(unsigned char col, unsigned char pag,const unsigned char *zk); void init_lcd();//初始化LCD屏 unsigned char GpioData; // 液晶驱动程序用到的全局变量 unsigned char BitData; // 液晶驱动程序用到的全局变量 const unsigned char Set_F500[]={4,0x83,0x00,0xf5,0x00}; //一下为配置驱动芯片寄存器的一些参数,照抄即可,不用过问具体含义 const unsigned char Set_F504[]={4,0x83,0x04,0xf5,0x04}; const unsigned char Set_F505[]={4,0x83,0x05,0xf5,0x80}; const unsigned char Set_F6C4[]={4,0x83,0xc4,0xf6,0x10}; const unsigned char Set_F080[]={4,0x83,0x80,0xf0,0xfc}; const unsigned char Set_F08E[]={4,0x83,0x8e,0xf0,0x32}; const unsigned char Set_F090[]={4,0x83,0x90,0xf0,0x12}; const unsigned char Set_F091[]={4,0x83,0x91,0xf0,0x26}; const unsigned char Set_F092[]={4,0x83,0x92,0xf0,0x1f}; const unsigned char Set_F094[]={4,0x83,0x94,0xf0,0x0a}; const unsigned char Set_F095[]={4,0x83,0x95,0xf0,0x06}; const unsigned char Set_F096[]={4,0x83,0x96,0xf0,0x06}; const unsigned char Set_8F[]={7,0x8f,0x69,0x45,0x61,0x67,0x6c,0x65}; const unsigned char Set_F240[]={4,0x83,0x40,0xf2,0x00}; const unsigned char Set_F241[]={4,0x83,0x41,0xf2,0x3f}; //补充说明:吴坚鸿程序风格是这样的,凡是字库内容,如果是字符,则前缀用***,然后紧//跟着点阵数,接着下划线,最后紧跟显示的字符。如果有重复的,则多加一个序列号标识。如果是汉字,则前缀用hz,其它的一样。 const unsigned char ***816_V[]=//从取模软件中复制的字库,横向取模,字节正序 { /*-- 文字: V --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/ 0x00,0x00,0x00,0xE7,0x42,0x42,0x44,0x24,0x24,0x28,0x28,0x18,0x10,0x10,0x00,0x00, }; const unsigned char ***816_5[]= { /*-- 文字: 5 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/ 0x00,0x00,0x00,0x7E,0x40,0x40,0x40,0x58,0x64,0x02,0x02,0x42,0x44,0x38,0x00,0x00, }; const unsigned char hz1616_hong[]= { /*-- 文字: 鸿 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x40,0x20,0x20,0x40,0x20,0xFC,0x0E,0xC4,0x84,0xA4,0x54,0xA4,0x54,0x8C,0x24,0x80, 0x24,0xFE,0x26,0x02,0xD8,0x02,0x43,0xFA,0x40,0x02,0x40,0x02,0x40,0x0A,0x00,0x04, }; const unsigned char hz1616_ge[]= { /*-- 文字: 哥 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0x00,0x7F,0xFC,0x00,0x10,0x1F,0x90,0x10,0x90,0x1F,0x90,0x10,0x90,0x00,0x04, 0xFF,0xFE,0x00,0x10,0x1F,0x90,0x10,0x90,0x1F,0x90,0x10,0x90,0x00,0x50,0x00,0x20, }; const unsigned char hz2424_hong[]= { /*-- 文字: 鸿 --*/ /*-- 宋体18; 此字体下对应的点阵为:宽x高=24x24 --*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0xC0,0x08,0x00,0x80,0x0C,0x01,0x00,0x00, 0x17,0xF8,0x03,0xFC,0x18,0x44,0x44,0x98,0x24,0x44,0xD0,0x34,0x44,0x10,0x14,0x44, 0x10,0x08,0x44,0x70,0x08,0x44,0x20,0x08,0x44,0x04,0x08,0x57,0xFC,0x08,0xE0,0x0C, 0x33,0x00,0x0C,0x10,0x00,0x6C,0x10,0x3F,0x98,0x10,0x00,0x08,0x10,0x00,0x08,0x18, 0x00,0xF8,0x18,0x00,0x30,0x00,0x00,0x00, }; const unsigned char hz2424_ge[]= { /*-- 文字: 哥 --*/ /*-- 宋体18; 此字体下对应的点阵为:宽x高=24x24 --*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x1F,0xFF,0xF8,0x00,0x00,0x40,0x02, 0x08,0x40,0x03,0xF8,0x40,0x02,0x08,0x40,0x02,0x08,0x40,0x03,0xF8,0x40,0x00,0x00, 0x40,0x00,0x00,0x0C,0x1F,0xFF,0xF0,0x00,0x00,0x40,0x07,0xF8,0x40,0x06,0x08,0x40, 0x06,0x08,0x40,0x06,0x08,0x40,0x07,0xF8,0x40,0x06,0x08,0x40,0x00,0x00,0x40,0x00, 0x03,0xC0,0x00,0x00,0xC0,0x00,0x00,0x00, }; //主程序 main() { ADCON0=0x00; ADCON1=0x0f; //全部为数字信号 ADCON2=0xa1; //右对齐 RBPU=0; SSPEN=0; //决定RA5不作为串口 TRISD=0x00; //配置驱动液晶IO口为输出 TRISC4=0; TRISC5=0; TRISC3=0; TRISB2=0; TRISB1=0; //补充说明,以上的内容为寄存器配置,每种不同的单片机会有点差异, //大家不用过度关注以上寄存器的配置,只要知道有这么一回事即可 init_lcd(); //初始化液晶屏 screen_clear ();//清空整屏显示内容,相当于把整屏涂上白色背景 //左边,绿颜色,16X16的汉字,鸿哥V5,X轴的范围是0到319 SetFgColor(GREEN); //设置字体为绿颜色 hz_display1616(0, 0,hz1616_hong); hz_display1616(16, 0,hz1616_ge); ***_display816(32, 0,***816_V); ***_display816(40, 0,***816_5); //右边,黄颜色,24X24的汉字,鸿哥,X轴的范围是0到319 SetFgColor(YELLOW); //设置字体为黄颜色 hz_display2424(310, 0,hz2424_hong); hz_display2424(334, 0,hz2424_ge); while(1) { CLRWDT(); //喂看门狗,大家不用过度关注此行 } } //------------------时序延时子程序----------------------------- void delay(unsigned int t) { unsigned int i; unsigned int j; for(i=0;i for(j=0; j<109; j++) { asm("nop"); } } } //*------------------清空屏幕的内容,实际上相当于整屏涂上白色背景---------------*/ void screen_clear () { SetFgColor(WHITE); //先设置将要显示的白颜色 Fill_Rect(0,0,319,239); //填充一个320X240的白色矩形,相当于清屏 } void SDIN_0() //液晶驱动程序的一部分,不用知道具体含义,照抄就行 { GpioData=GpioData&0xf7; } void SDIN_1() { GpioData=GpioData|0x08; } void SCLK_0() { GpioData=GpioData&0xfb; } void SCLK_1() { GpioData=GpioData|0x04; } void SENA_0() { GpioData=GpioData&0xfd; } void SENA_1() { GpioData=GpioData|0x02; } //------------------写命令到LCD,,驱动液晶程序的一部分------------------------------ void write_com(unsigned char cmdcode) { A1_dr = 0; LCDBUS = cmdcode; _CS_dr = 0; _WR_dr = 0; _WR_dr = 1; _CS_dr = 1; } //------------------一次写4个字节的包裹命令到LCD,,驱动液晶程序的一部分------------------------------ void write_com_pkg(const unsigned char *pkg) { uchar i; for(i=*pkg;i;i--) { A1_dr = 0; LCDBUS = *(++pkg); _CS_dr=0; _WR_dr=0; _WR_dr=1; _CS_dr=1; } A1_dr = 1; LCDBUS = 1; _CS_dr = 0; _WR_dr = 0; _WR_dr = 1; _CS_dr = 1; } //------------------设置显示的颜色,在显示字体或者任何点阵前,必须先设置将要显示的颜色,驱动液晶程序的一部分------------------------------ void SetFgColor(uint color) { uchar Buffer[4]; Buffer[0]=3; Buffer[1]=0x20; Buffer[2]=color; Buffer[3]=color>>8; write_com_pkg(Buffer); } //画直线,原厂配套的演示驱动程序,不是本节的重点,x1,y1为直线的起点坐标,x2,y2为直线的终点坐标, void Draw_Line(uint x1,uint y1,uint x2,uint y2) { uchar Buffer[10]; Buffer[0]=9; Buffer[1]=0x24; Buffer[2]=x1; Buffer[3]=x1>>8; Buffer[4]=y1; Buffer[5]=y1>>8; Buffer[6]=x2; Buffer[7]=x2>>8; Buffer[8]=y2; Buffer[9]=y2>>8; write_com_pkg(Buffer); delay(20); delay(20); } //画矩形,原厂配套的演示驱动程序,不是本节的重点,x1,y1为矩形的起点坐标,x2,y2为矩形对角的终点坐标, void Draw_Rect(uint x1,uint y1,uint x2,uint y2) { uchar Buffer[10]; Buffer[0]=9; Buffer[1]=0x26; Buffer[2]=x1; Buffer[3]=x1>>8; Buffer[4]=y1; Buffer[5]=y1>>8; Buffer[6]=x2; Buffer[7]=x2>>8; Buffer[8]=y2; Buffer[9]=y2>>8; write_com_pkg(Buffer); delay(20); delay(20); } //画填充矩形,原厂配套的演示驱动程序,不是本节的重点,x1,y1为矩形的起点坐标,x2,y2为矩形对角的终点坐标, void Fill_Rect(uint x1,uint y1,uint x2,uint y2) { uchar Buffer[10]; Buffer[0]=9; Buffer[1]=0x27; Buffer[2]=x1; Buffer[3]=x1>>8; Buffer[4]=y1; Buffer[5]=y1>>8; Buffer[6]=x2; Buffer[7]=x2>>8; Buffer[8]=y2; Buffer[9]=y2>>8; write_com_pkg(Buffer); delay(20); delay(20); } //显示一个基本单位--在任意一个位置显示一个点,正是本节苦苦寻找的东西,本节的核心内容 //x1和y1是要显示的某个具体点的坐标位置,我们是根据这个基本点来编写我们的各种不同字体的程序 void dwg_pixel(uint x1,uint y1) { uchar Buffer[6]; Buffer[0]=5; Buffer[1]=0x23; Buffer[2]=x1; Buffer[3]=x1>>8; Buffer[4]=y1; Buffer[5]=y1>>8; write_com_pkg(Buffer); } //配置液晶内部驱动寄存器的函数,不是本节重点,在初始化里照抄即可 void SdRegVal(uchar RegAdd, uchar RegDat) { uchar i, Buffer[5]; BitData=(RegAdd<<2)+3; for(i=0; i<8; i++) { SENA_0(); SCLK_0(); if((BitData&0x80)==0x80) { SDIN_1(); } else { SDIN_0(); } Buffer[0]=4; Buffer[1]=0x83; Buffer[2]=0x41; Buffer[3]=0xf2; Buffer[4]=GpioData; write_com_pkg(Buffer); SCLK_1(); Buffer[0]=4; Buffer[1]=0x83; Buffer[2]=0x41; Buffer[3]=0xf2; Buffer[4]=GpioData; write_com_pkg(Buffer); SCLK_0(); Buffer[0]=4; Buffer[1]=0x83; Buffer[2]=0x41; Buffer[3]=0xf2; Buffer[4]=GpioData; write_com_pkg(Buffer); BitData=BitData<<1; } BitData=RegDat; for(i=0; i<8; i++) { SENA_0(); SCLK_0(); if((BitData&0x80)==0x80) { SDIN_1(); } else { SDIN_0(); } Buffer[0]=4; Buffer[1]=0x83; Buffer[2]=0x41; Buffer[3]=0xf2; Buffer[4]=GpioData; write_com_pkg(Buffer); SCLK_1(); Buffer[0]=4; Buffer[1]=0x83; Buffer[2]=0x41; Buffer[3]=0xf2; Buffer[4]=GpioData; write_com_pkg(Buffer); SCLK_0(); Buffer[0]=4; Buffer[1]=0x83; Buffer[2]=0x41; Buffer[3]=0xf2; Buffer[4]=GpioData; write_com_pkg(Buffer); BitData=BitData<<1; } SENA_1(); Buffer[0]=4; Buffer[1]=0x83; Buffer[2]=0x41; Buffer[3]=0xf2; Buffer[4]=GpioData; write_com_pkg(Buffer); } //显示8X16的字符函数,本节的核心内容。col代表X轴,pag代表Y轴,zk代表显示相对应的字库, //因为是彩屏,不存在反显或者正显,显示之前要先设置一下想要显示内容的颜色即可。 void ***_display816(unsigned char col, unsigned char pag,const unsigned char *zk) { unsigned char j=0,i=0,k=0; unsigned char ***_temp=0; for(j=0;j<16;j++) //此处j代表Y轴的数据,也就是显示第几行了,一个8X16字符只占用16行 { for(i=0;i<1;i++) //此处i代表X轴的数据,一行8个点,共1个字节,每发送一个字节的显示数据,都要把这个字节分解成8个点依次显示 { ***_temp=zk[j*1+i]; //发送显示的字节数据,一行1个字节,因此1*j for(k=0;k<8;k++) //把一个字节分解成8个点,一个点一个点来显示 { if((***_temp&0x80)==0x80) { dwg_pixel(col+i*8+k,pag+j); //显示一个点 } ***_temp=***_temp<<1; } } } } //显示16X16的汉字函数,本节的核心内容。col代表X轴,pag代表Y轴,zk代表显示相对应的字库, //因为是彩屏,不存在反显或者正显,显示之前要先设置一下想要显示内容的颜色即可。 void hz_display1616(unsigned char col, unsigned char pag,const unsigned char *zk) { unsigned char j=0,i=0,k=0; unsigned char ***_temp=0; for(j=0;j<16;j++) //此处j代表Y轴的数据,也就是显示第几行了,一个16X16汉字只占用16行 { for(i=0;i<2;i++) //此处i代表X轴的数据,一行16个点,共2个字节,每发送一个字节的显示数据,都要把这个字节分解成8个点依次显示 { ***_temp=zk[j*2+i]; //发送显示的字节数据,一行2个字节,因此2*j for(k=0;k<8;k++) //把一个字节分解成8个点,一个点一个点来显示 { if((***_temp&0x80)==0x80) { dwg_pixel(col+i*8+k,pag+j); //显示一个点 } ***_temp=***_temp<<1; } } } } //显示24X24的汉字函数,本节的核心内容。col代表X轴,pag代表Y轴,zk代表显示相对应的字库, //因为是彩屏,不存在反显或者正显,显示之前要先设置一下想要显示内容的颜色即可。 void hz_display2424(unsigned char col, unsigned char pag,const unsigned char *zk) { unsigned char j=0,i=0,k=0; unsigned char ***_temp=0; for(j=0;j<24;j++) //此处j代表Y轴的数据,也就是显示第几行了,一个24X24的汉字只占用24行 { for(i=0;i<3;i++) //此处i代表X轴的数据,一行24个点,共3个字节,每发送一个字节的显示数据,都要把这个字节分解成8个点依次显示 { ***_temp=zk[j*3+i]; //发送显示的字节数据,一行3个字节,因此3*j for(k=0;k<8;k++) //把一个字节分解成8个点,一个点一个点来显示 { if((***_temp&0x80)==0x80) { dwg_pixel(col+i*8+k,pag+j); //显示一个点 } ***_temp=***_temp<<1; } } } } //*------------------初始化LCD屏--------------------------*/ void init_lcd() { LCDBUS=0xff; _CS_dr=1; _RES_dr=1; A1_dr=0; _WR_dr=1; _RD_dr=1; _RES_dr=1; delay(800);delay(800); _RES_dr=0; delay(100); delay(100); _RES_dr=1; delay(200);delay(200); write_com_pkg(Set_F500); write_com_pkg(Set_F504); write_com_pkg(Set_F505); write_com_pkg(Set_F6C4); write_com_pkg(Set_8F); write_com_pkg(Set_F240); write_com_pkg(Set_F241); write_com_pkg(Set_F080); write_com_pkg(Set_F08E); write_com_pkg(Set_F090); write_com_pkg(Set_F091); write_com_pkg(Set_F092); write_com_pkg(Set_F094); write_com_pkg(Set_F095); write_com_pkg(Set_F096); SdRegVal(0x0e,0x2a+0x40); } (6)小结: 读者要重点弄清楚void ***_display816, void hz_display1616, void hz_display2424这三个函数他们之间的联系与规律,即可掌握本节内容的精髓。 只要学会根据 “鸿哥液晶三大类定律“的指导思想,从厂家提供或者在网上下载的凌乱演示驱动程序中迅速寻找到显示的基本单位,然后自己动手编写以上三个不同字体的显示子程序,就可大功告成。 (未完待续,下节更精彩,不要走开哦) |
|
|
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
求解外围电路实现的是4脚给持续低电平复位并正常工作,高电平不工作的原因
2076 浏览 1 评论
3489 浏览 3 评论
PIC1946程序有一个变量在运行过程中恢复初始值其他变量保持不变
2329 浏览 2 评论
2754 浏览 0 评论
PIC16F1825的RC5引脚,在主程序中操作无效,在中断中可以改变是为什么?
4012 浏览 5 评论
960浏览 0评论
用XC8编译PIC18F25K80时提示下面Error,求怎么解决这个问题
6345浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 01:50 , Processed in 0.931417 second(s), Total 87, Slave 79 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号