如何驱动lcm12864液晶屏的程序模块,详细使用方法经验分享

>> LCD液晶显示模块驱动程序,采用的是JDL12864液晶模块
LCD液晶显示模块驱动程序,采用的是JDL12864液晶模块
所属分类:
下载地址:
LCD12864.rar文件大小:1.70 kB
分享有礼! 》
请点击右侧的分享按钮,把本代码分享到各社交媒体。
通过您的分享链接访问Codeforge,每来2个新的IP,您将获得0.1 积分的奖励。
通过您的分享链接,每成功注册一个用户,该用户在Codeforge上所获得的每1个积分,您都将获得0.2 积分的分成奖励。
LCD液晶显示模块驱动程序,采用的是JDL12864液晶模块-LCD liquid crystal display module drivers, using the JDL12864 LCD Module
Sponsored links
源码文件列表
温馨提示: 点击源码文件名可预览文件内容哦 ^_^
3.81 kB28-08-07 17:56
(提交有效评论获得积分)
评论内容不能少于15个字,不要超出160个字。
评价成功,多谢!
下载LCD12864.rar
CodeForge积分(原CF币)全新升级,功能更强大,使用更便捷,不仅可以用来下载海量源代码马上还可兑换精美小礼品了
您的积分不足,优惠套餐快速获取 30 积分
10积分 / ¥100
30积分 / ¥200原价 ¥300 元
100积分 / ¥500原价 ¥1000 元
订单支付完成后,积分将自动加入到您的账号。以下是优惠期的人民币价格,优惠期过后将恢复美元价格。
支付宝支付宝付款
微信钱包微信付款
更多付款方式:、
您本次下载所消耗的积分将转交上传作者。
同一源码,30天内重复下载,只扣除一次积分。
鲁ICP备号-3 runtime:Elapsed:120.317ms - init:0.1;find:1.1;t:0.4;tags:0.2;related:59.3;comment:0.1; 5.8
登录 CodeForge
还没有CodeForge账号?
Switch to the English version?
^_^"呃 ...
Sorry!这位大神很神秘,未开通博客呢,请浏览一下其他的吧查看: 2057|回复: 2
我的单片机学习笔记:浅谈LCD12864液晶使用
先引出一段背景话:前段时间做电子大赛,题目是《无线遥控绘图小车》,意思即为制作一个A端,作为远程遥控部分;制作一个B端,作为绘图主体部分。每个部分均由主控IC来控制,我们采用的是增强型51单片机STC12C5A32S2,选择它的原因无非有两个:一是普通51单片机无论从主频、RAM上来讲均不能满足要求;二是在大赛前突然得知AVR系列的128停产了,市面上仅剩的128于是身价倍增,已经达到45~55元/片,成本过高。于是惊呼:AVR的时代已经马上就要过去了。最后我们选用了STC12C5A32S2单片机,主频选用24M,不分频,相当于传统51单片机的288M频率,速度够用;32K+28K的存储器,相比51的4K、8K存储空间够用了;而它的价格仅仅为7元/片(从芯片商直接购进)。这样无论从性能和价格上均满足要求,可谓性价比相当高的一款单片机了。好了,主控介绍完毕。因为本次主要想说说12864液晶,所以主要介绍A端及其控制。
A端主要有五部分组成:电源模块、主控芯片及其工作电路、欧姆龙非编码4*4矩阵键盘、nrf24L01无线传输模块、12864液晶显示模块。下面主要介绍在使用12864液晶中遇到的一些问题及其解决方案:(抛砖引玉,欢迎高手指点)
12864液晶,从字面意思上来理解,就是一块分辨率为128*64的液晶屏幕,和电脑中提到的显示器分辨率是一样的。只不过12864是一块单色的液晶屏,市面上最常见的为蓝绿色和蓝色。我们采用的是蓝色液晶屏,内有中文字库,使用起来方便很多。关于汉字和ASCII码:汉字在12864中占用16*16的屏幕空间,ASCII码字符占用16*8的屏幕空间。于是我们可以知道:一块12864使用内部字库,最多可以显示32个汉字或者64个ASCII码字符。如果我们感觉这样屏幕显示的东西太少,可以舍弃液晶内部字库,自己制作一个字库,其中汉字和ASCII码均可以占用8*8的屏幕空间,这样我们的12864最多可以显示128个汉字或ASCII码字符。所以在显示内容较多时可以采用这种方法。
作为背景,下面说一下12864的驱动。关于液晶的驱动电路是相当复杂的,一个有几年工作经验的工程师也不一定能自己独立设计出一个12864驱动,但是比较好的是,我们一般在买12864的时候,制造商都已经将驱动做好了,我们要做的就是通过制造商留给我们的20P接口去使用它(这也就是术业有专攻吧,我们不必关心它的内部驱动,只要会用就行了),关于制造商留给我们的这20P引脚的具体名称和功能 我就不赘述了,网上一把一把的。将单片机的I/O、电源线与液晶焊接完毕后,硬件也就搭建好了。下面开始软件编程来控制12864液晶让它显示。
说到软件编程,首先我们需要准备一下平台:第一:给单片机焊接一个下载电路,51单片机最常用的就是串口下载,需要串口头一个、104电容5个、max232芯片一个、串口线/USB转串口连接线(后者主要为笔记本等没有串口的电脑设计)一条、导线若干。这个下载电路在网上也是一把一把的,我也不赘述了。第二:需要一台电脑(编程用)。第三:需要相应的开发平台,51单片机最常用的是keil,现在比较流行的是keil2和keil3,各有特点,可以根据自己的习惯选择,我个人选用的是keil3平台。有了以上3点,软硬件开发平台就已经搭建好了,下面介绍一下程序编写。
首先,打开keil软件,建立一个工程,并添加一个文件到工程里面,然后就可以写程序了。首先把基本程序架构写好:头文件、主函数、while循环。为了让程序比较好理解,采用编写函数在主函数中调用的形式。下面介绍一下各种功能函数的编写。
首先是最基本的初始化操作,需要参考制造商给出的操作时序图(这里不赘述,只列出代码)
    void init_12864()
&&    lcd12864_psb=1;//选择并行模式
    write_cmd(0x30);//选择基本指令
    write_cmd(0x0C);//把显示打开,关闭游标
    write_cmd(0x01);//清屏,地址归零
接下来是基本的读写操作:参考制造商给出的操作时序图(这里不赘述,只列出代码)
    //往12864内部写入一个命令字节
    void write_cmd(uchar cmd)
    lcd12864_rs=0;//把rs引脚拉低,表示命令
    lcd12864_rw=0;//表示写,而非读
    P0=//把命令字节送到数据线上
    lcd12864_en=0; //给en引脚一个高脉冲
    delay_ms(5);
    lcd12864_en=1;
    delay_ms(5);
     lcd12864_en=0;
    //往12864内部写入一个字节的数据
    void write_dat(uchar dat)
     lcd12864_rs=1;//表示写数据
    lcd12864_rw=0;//表示写
    P0=//把数据送到数据线上
    lcd12864_en=0; //给en引脚一个高脉冲
     delay_ms(5);
    lcd12864_en=1;
     delay_ms(5);
    lcd12864_en=0;
    } 
这样基本的函数便写好了,关于12864的操作是这样的:首先需要对其进行配置,即执行初始化函数,然后就可以进行进行显示字符了。如果我们要在屏幕上显示汉字“好”,需要这样操作:首先写入命令,内容为显示地址(第一行首空间为0x80),然后写入数据,内容为我们要显示的字符(内容为“好”),于是我们的代码这样写:
    init_12864();
    write_cmd(0x80);
    write_dat(“好”);
这样我们进行代码编译,将文件下载到单片机就可以在12864上看见在屏幕最左上角的“好”字了。下面进行一些更加复杂一点的操作。即在屏幕任意的地方显示任意的字符串(当然需要的显示空间要够,不然会没有地方显示的),代码如下:
    void set_xy(uchar row,uchar line) //设置显示地址为第x行y列
        switch(row) //对行进行判断
        {
             case 1: {write_cmd(0x80|line);} //第一行,则设定列位置
&&            case 2: {write_cmd(0x90|line);} //第二行,则设定列位置
&&            case 3: {write_cmd(0x88|line);} //第三行,则设定列位置
&&            case 4: {write_cmd(0x98|line);} //第四行,则设定列位置
        }
    }    
    void write_xy(uchar row,uchar line,uchar *string) //在坐标为x行y列的地方显示出字符串string
        uchar lcd_&&//定义显示数据暂存变量
        set_xy(row,line);&&//设定显示地址为第x行y列    
        lcd_temp=* //将string的内容赋给lcd_temp    
         while(lcd_temp!=0x00) //判断字符串截止标志
        {
             write_dat(lcd_temp); //写入字符串的相应内容
&&            lcd_temp=*(++string); //读取字符串下一位字符
        }
这样,一个函数就编写好了,如果我们想在第三行第二列的位置显示“我爱电子”,则这样进行操作:行x=3,列y=2,字符串为“我爱电子”,于是我们在主函数里面写这样的代码:
    unsigned char string=“我爱电子”;
    write_xy(3,2,uchar *string);   
这样我们进行代码编译,将文件下载到单片机就可以在12864上看见在屏幕第三行第二列的位置显示“我爱电子”。下面介绍一下在12864上进行局部显示图片,在显示图片之前我们需要获得所显示图片的二进制编码。这个可以借助&字模提取软件&来进行,然后在函数中定义一下(我定义为logo[ ]={ }),下面是局部显示图片的函数
    void lcd12864_display(uchar code *img)/*显示函数*/
     uchar x,y;
    uint i=0;//不可定义为uchar,数量不够用
     for(y=24;y&=31;y++) //我们可以更改y的最小值和最大值来控制显示区域
         for(x=1;x&3;x++)//每个x对应于2个字节,我们可以更改x的最小值和最大值来控制显示区域
&&        {
&&             write_cmd(0x36); //扩充指令,同时开通图形显示
& &            write_cmd(0x80+y);//垂直地址
&&             write_cmd(0x80+x);//水平地址
& &            write_cmd(0x30);//改为基本指令,进而进行基本输入
&&             write_dat(img[i++]); //数据写入
& &            write_dat(img[i++]);
&&        }
    for(y=0;y&=23;y++) //我们可以更改y的最小值和最大值来控制显示区域
         for(x=1;x&3;x++) //我们可以更改x的最小值和最大值来控制显示区域
&&        {
&&             write_cmd(0x36);//扩充指令,同时开通图形显示
&&             write_cmd(0x80+y);//垂直地址
& &            write_cmd(0x88+x); //显示下半屏,y的坐标不变,x的坐标加8(看datasheet上的图)
&&             write_cmd(0x30);//改为基本指令,进而进行基本输入
& &            write_dat(img[i++]); //数据写入
& &            write_dat(img[i++]);
&&        }
     }
这样,一个函数就编写好了,如果我们就可以在任意区域显示自己想要的图片了(当然写入的区域不要有汉字或字符内容,不然会重叠到一起的,关于这部分的解决方案,下面即将介绍)
笔者在应用12864的时候,由基本模式切换到绘图模式时,会出现屏幕花屏的情况,始终无法解决,最后编写了一段清除图片内容的函数,其代码如下:
    void clear_img()
     uchar p,q;
    write_cmd(0x34);
    write_cmd(0x36);
    for(p=0;p&32;p++)
&&    write_cmd(0x80|p);
&&    write_cmd(0x80);
     for(q=0;q&32;q++)
     write_dat(0);
    } 
仔细研究一下这段代码,其实大家可以发现没有什么特别的东西,主要是为了给图片区域的部分全部写入0,屏蔽其显示内容,由此便可以解决模式切换后的花屏现象。然后在主函数中,调用初始化函数后,执行上面的clear_img()函数即可避免模式切换后的花屏现象。效果还是不错的,只是占用的时间比较长。笔者最初用普通51单片机时候选用11.05926M晶振,经12分频后清屏速度还是很慢的(接近8秒钟时间),后换用24M不分频的51单片机,清屏速度加快了很多(大概在0.4秒左右),所以这种方法并不适用普通51,否则光清屏的时间就会让人抓狂的。只建议不分频的单片机使用这种方法。
做比赛之前从来没有用过12864液晶,从头学起,最后在12864液晶上做出了一个简单的操作界面,花了整整两天时间。其中图像清屏的问题占用了很多时间,所以在此写下此文,为后来者提供问题的解决方案。最后欢迎大家多多交流~~
 讲得很详细 透彻
 谢谢楼主分享
Powered by21ic官方微信-->
后使用快捷导航没有帐号?
查看: 6408|回复: 3
SPI总线如何驱动12864液晶,
&&已结帖(2)
主题帖子积分
高级技术员, 积分 615, 距离下一级还需 385 积分
高级技术员, 积分 615, 距离下一级还需 385 积分
主题帖子积分
专家等级:结帖率:50%
主题帖子积分
高级技术员, 积分 615, 距离下一级还需 385 积分
高级技术员, 积分 615, 距离下一级还需 385 积分
我的程序如下
/* 液晶演示程序JLX1,串行接口!
& &驱动IC是:UC1701X或兼容的IC,比如ST7565R
& &叶建人编写,6月27日,2012
& &晶联讯电子:网址&&;
#include &REG51xD2.H&
#include &intrins.h&
#include &Ctype.h&
sbit Up& &&&=& &P1^0;
sbit Left& &=& &P1^2;
sbit Right&&=& &P1^3;
sbit cs1& & =& &P0^0 ; & & & & & & & && &//LCM片选信号端& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &&&
sbit rs& & & & & & & & =& & & & P2^2;& &&&//数据命令选择端口
sbit reset& & & & =&&& & & & P2^3;& & & && &//LCM复位
sbit SPISS&&=& &P1^1;& && & //SPI总线的从机选择脚&&MCU使用
sbit sclk& & & & =& & & & P1^6;& & //&&SCK
sbit sid& & & & =& &P1^7;& &&&//sid 就是 SDA,串行数据信号& && &&&端口MOSI
sbit LEDA& & & & =& & & & P0^1;& & & & //背光控制,低电平点亮
void delay(unsigned int i);
void clear_screen();
unsigned char code zhuang1[]={
/*--&&文字:&&状&&--*/
/*--&&宋体12;&&此字体下对应的点阵为:宽x高=16x16& &--*/
0x08,0x30,0x00,0xFF,0x20,0x20,0x20,0x20,0xFF,0x20,0xE1,0x26,0x2C,0x20,0x20,0x00,
0x04,0x02,0x01,0xFF,0x40,0x20,0x18,0x07,0x00,0x00,0x03,0x0C,0x30,0x60,0x20,0x00};
unsigned char&&code tai1[]={
/*--&&文字:&&态&&--*/
/*--&&宋体12;&&此字体下对应的点阵为:宽x高=16x16& &--*/
0x00,0x04,0x04,0x04,0x84,0x44,0x34,0x4F,0x94,0x24,0x44,0x84,0x84,0x04,0x00,0x00,
0x00,0x60,0x39,0x01,0x00,0x3C,0x40,0x42,0x4C,0x40,0x40,0x70,0x04,0x09,0x31,0x00};
unsigned char&&code shi1[]={
/*--&&文字:&&使&&--*/
/*--&&宋体12;&&此字体下对应的点阵为:宽x高=16x16& &--*/
0x40,0x20,0xF0,0x1C,0x07,0xF2,0x94,0x94,0x94,0xFF,0x94,0x94,0x94,0xF4,0x04,0x00,
0x00,0x00,0x7F,0x00,0x40,0x41,0x22,0x14,0x0C,0x13,0x10,0x30,0x20,0x61,0x20,0x00};
unsigned char&&code yong1[]={
/*--&&文字:&&用&&--*/
/*--&&宋体12;&&此字体下对应的点阵为:宽x高=16x16& &--*/
0x00,0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,
0x80,0x40,0x30,0x0F,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x42,0x82,0x7F,0x00,0x00};
unsigned char&&code mao_hao[]={
/*--&&文字:&&: (冒号) --*/
/*--&&宋体12;&&此字体下对应的点阵为:宽x高=8x16& &--*/
0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00};
unsigned char&&code num0[]={
/*--&&文字:&&0&&--*/
/*--&&宋体12;&&此字体下对应的点阵为:宽x高=8x16& &--*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00
char code num1[]={
/*--&&文字:&&1&&--*/
/*--&&宋体12;&&此字体下对应的点阵为:宽x高=8x16& &--*/
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00
char code num2[]={
/*--&&文字:&&2&&--*/
/*--&&宋体12;&&此字体下对应的点阵为:宽x高=8x16& &--*/
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00
unsigned char&&code num3[]={
/*--&&文字:&&3&&--*/
/*--&&宋体12;&&此字体下对应的点阵为:宽x高=8x16& &--*/
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00
char code num4[]={
/*--&&文字:&&4&&--*/
/*--&&宋体12;&&此字体下对应的点阵为:宽x高=8x16& &--*/
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00
unsigned char&&code num5[]={
/*--&&文字:&&5&&--*/
/*--&&宋体12;&&此字体下对应的点阵为:宽x高=8x16& &--*/
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00
unsigned char&&code num6[]={
/*--&&文字:&&6&&--*/
/*--&&宋体12;&&此字体下对应的点阵为:宽x高=8x16& &--*/
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00
unsigned char&&code num7[]={
/*--&&文字:&&7&&--*/
/*--&&宋体12;&&此字体下对应的点阵为:宽x高=8x16& &--*/
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00
unsigned char&&code num8[]={
/*--&&文字:&&8&&--*/
/*--&&宋体12;&&此字体下对应的点阵为:宽x高=8x16& &--*/
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00
unsigned char&&code num9[]={
/*--&&文字:&&9&&--*/
/*--&&宋体12;&&此字体下对应的点阵为:宽x高=8x16& &--*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00
unsigned char&&code empty[]=
& & & & 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
void SPI_init()
& & & & SPDAT = 0;& && &&&& & & & & & & & & & & && & //清空数据缓存
& & & & SPISS=1;& && && && && && && &&&/* enable master */&&//片选信号&&主机片选信号必须为高电平
& & & & SPCON |= 0x10;& && && && && & /* Master mode */
& & & & SPCON |= 0x01;& && && && && & /* Fclk Periph/64 */
& & & & SPCON &= ~0x08;& && && && && &/* CPOL=0; transmit mode example */
& &/*因为使用的12864是上升沿写入数据,所以注意CPOL 和CPHA的配置*/
& & & & SPCON &= ~0X04;& & & & & & & & & & & & & & & && &/* CPHA=0; transmit mode example */
& & & & SPCON &=~0x20;& & & & & & & & & & & & & & & && &/* Cleared to enable SS in both Master and Slave modes.*/
& & & & IEN1 |= 0x04;& && && && && &&&/* enable spi interrupt */
& & & & SPCON |= 0x40;& && && && && & /* run spi& &SPEN=1 */
& & & & EA=1;& && && && && && && && & /* enable interrupts */
unsigned char SPIS_Transfer(unsigned char dat)
& & SPDAT =& && && && && & //trigger SPI send
& & while (!(SPSTA&0X80));& && && && & //wait send complete
& & return SPDAT;& && && && && &//return received SPI data
/*****************************************************/
void Send_byte(unsigned char Byte)
& & SPIS_Transfer(Byte);
/***********写指令到LCD模块******************************************/
void Transfer_command(unsigned char&&send_cmd)
& & & && &cs1=0;
& & & && &rs=0;
& &Send_byte(send_cmd);& && && && && &// 发送起始信号 第1字节-格式:1111ABC
& &delay(5);& && && && && && && && && & // 延时是必须的
/*写数据到LCD模块*/
void Transfer_data(int send_data)
& & & & cs1=0;
& & & & rs=1;
&&Send_byte(send_data);& && && && && &// 发送起始信号 第1字节-格式:1111ABC
&&delay(5);& &
void delay(unsigned int i)& && && && && &
unsigned int j,k;
for(j=0;j&i;j++)
& &for(k=0;k&110;k++);
/*LCD模块初始化*/
void initial_lcd()
& & & & cs1=0;
&&& & & & reset=0;& && &&&/*低电平复位*/
&&& & & & delay(100);
&&& & & & reset=1;& & & & & & & && &&&/*复位完毕*/
&&& & & & delay(20);& && &&&
& & & & Transfer_command(0xe2);& & & &&&/*软复位*/
& & & & delay(5);
& & & & Transfer_command(0x2c);&&/*升压步聚1*/
& & & & delay(5);& & & &
& & & & Transfer_command(0x2e);&&/*升压步聚2*/
& & & & delay(5);
& & & & Transfer_command(0x2f);&&/*升压步聚3*/
& & & & delay(5);
& & & & Transfer_command(0x23);&&/*粗调对比度,可设置范围0x20~0x27*/
& & & & Transfer_command(0x81);&&/*微调对比度*/
& & & & Transfer_command(0x28);&&/*0x1a,微调对比度的值,可设置范围0x00~0x3f*/
& & & & Transfer_command(0xa2);&&/*1/9偏压比(bias)*/
& & & & Transfer_command(0xc8);&&/*行扫描顺序:从上到下*/
& & & & Transfer_command(0xa0);&&/*列扫描顺序:从左到右*/
& & & & Transfer_command(0x40);&&/*起始行:第一行开始*/
& & & & Transfer_command(0xaf);&&/*打开显示*/
& & & & clear_screen();& & & & & & //clear all dots
& & & & cs1=1;
void lcd_address(unsigned char&&page,unsigned char&&column)
& & & & cs1=0;
& & & & column=column-1;&&& & & & & & & & & & & & & & & & & & & & & & & & & & & & //我们平常所说的第1列,在LCD驱动IC里是第0列。所以在这里减去1.
& & & & page=page-1;
& & & & Transfer_command(0xb0+page);& && & & & & & & & & & & & & & & & //设置页地址。每页是8行。一个画面的64行被分成8个页。我们平常所说的第1页,在LCD驱动IC里是第0页,所以在这里减去1*/
& & & & Transfer_command(((column&&4)&0x0f)+0x10);& & & & //设置列地址的高4位
& & & & Transfer_command(column&0x0f);& & & & & & & & & & & & & & & & //设置列地址的低4位
/*全屏清屏,实际上是向每个点送数据0*/
void clear_screen()
& & & & unsigned char i,j;
& & & & cs1=0;
& & & & for(i=0;i&9;i++)
& & & & & & & & lcd_address(1+i,1);
& & & & & & & & for(j=0;j&132;j++)& &//
& & & & & & & & {
& & & & & & & & & & & & Transfer_data(0x00);
& & & & & & & & }
& & & & cs1=1;
/*显示16x16点阵图像、汉字、生僻字或16x16点阵的其他图标*/
void display_graphic_16x16(unsigned char&&page,unsigned char&&column,unsigned char&&*dp)
& & & & unsigned char&&i,j;
& & & & cs1=0;
& & & & for(j=0;j&2;j++)
& & & & & & & & lcd_address(page+j,column);
& & & & & & & & for (i=0;i&16;i++)
& & & & & & & & {& & & &
& & & & & & & & & & & & Transfer_data(*dp);& & & & & & & & /*写数据到LCD,每写完一个8位的数据后列地址自动加1*/
& & & & & & & & & & & & dp++;
& & & & & & & & }
& & & & cs1=1;
/*显示8x16点阵图像、ASCII, 或8x16点阵的自造字符、其他图标*/
void display_graphic_8x16(unsigned char&&page,unsigned char&&column,unsigned char&&*dp)
& & & & unsigned char&&i,j;
& & & & cs1=0;& & & &
& & & & for(j=0;j&2;j++)
& & & & & & & & lcd_address(page+j,column);
& & & & & & & & for (i=0;i&8;i++)
& & & & & & & & {& & & &
& & & & & & & & & & & & Transfer_data(*dp);& & & & & & & & & & & & & & & & & & & & /*写数据到LCD,每写完一个8位的数据后列地址自动加1*/
& & & & & & & & & & & & dp++;
& & & & & & & & }
& & & & cs1=1;
//分\秒闪烁,time表示分\秒的数据
void blink_graphic_8x16(unsigned char&&page,unsigned char&&column,unsigned char&&*dp)
& & & & unsigned char&&delay_& & & & & & & & & & & & & & & & & & & & & & & & & & & & //延时计数器
& & & & while(Right==1)& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //我的主板的按键是接在某某I/O口与地之间
& & & & & & & & delay_counter=0;& & & & & & & & & & & & & & & & & & & & & & & & & & & & //延时计数器归零
& & & & & & & & display_graphic_8x16(page,column,empty);&&& & & & //显示首位空
& & & & & & & & while(Right==1&&delay_counter&5)
& & & & & & & & {& & & &
& & & & & & & & & & & & delay(100);& && && & & & & & & & & & & & & & & & & & & & & & & & //延时100 ms左右再去扫描键盘,如此反复多次
& & & & & & & & & & & & delay_counter++;
& & & & & & & & }
& & & & & & & & display_graphic_8x16(page,column,dp);& & & & & & & & //显示时间
& & & & & & & & delay_counter=0;& & & & & & & & & & & & & & & & & & & & & & & & & & & & //延时计数器归零
& & & & & & & & while(Right==1&&delay_counter&5)
& & & & & & & & {& & & &
& & & & & & & & & & & & delay(100);& && && & & & & & & & & & & & & & & & & & & & & & & & //延时100 ms左右再去扫描键盘,如此反复多次
& & & & & & & & & & & & delay_counter++;
& & & & & & & & }
& & & & & & & & delay_counter=0;& & & & & & & & & & & & & & & & & & & & & & & & & & & & //延时计数器归零
void keyscan()
&&if(Up == 0){
& & page--;
& & & & INT0=0;
& &if(page==255)page=7;& &// 定义为unsgined char 0 再减一等于255
&&if(Down == 0){
& &T1 = 1;& & & &
& &if(page==7)page=0;
&&if(Left == 0){
& & column--;
& &if(column==255)column=128;& & & && &// // 定义为unsgined char 0 再减一等于255
&&if(Right == 0){
&&column++;
& &if(column==128)column=0;
void main(void)
& & & & LEDA=0;& & & &
& & & & SPI_init();
& & delay(5);
& & & & initial_lcd();
& & & & page&&= 3;
& & & & column= 0;
& & & &&&while(1)
& & & && &// & & & & clear_screen();& & & & & & //clear all dots
& & & & & & & & display_graphic_16x16(page,column,zhuang1); & & & & & & & & /*在第5页,第1列显示单个汉字&状&*/
& & & & & & & & display_graphic_16x16(page,(column+16),tai1); & & & & & & & & /*在第5页,第17列显示单个汉字&态&*/
& & & & & & & & display_graphic_8x16(page,(column+16*2),mao_hao); & & & & /*在第5页,第25列显示单个字符&:&*/
& & & & & & & & display_graphic_16x16(page,(column+16*2+8),shi1); & & & & /*在第5页,第41列显示单个汉字&使&*/
& & & & & & & & display_graphic_16x16(page,(column+16*3+8),yong1);& & & & /*在第5页,第49列显示单个汉字&用&*/
& & & & & & & & display_graphic_8x16(page,(column+88),num0); & & & & & & & & & & & & /*在第5页,第89列显示单个数字&0&*/
& & & & & & & & display_graphic_8x16(page,(column+88+8*1),num0); & & & & & & & & /*在第5页,第97列显示单个数字&0&*/
& & & & & & & & display_graphic_8x16(page,(column+88+8*2),mao_hao); & & & & /*在第5页,第105列显示单个字符&:&*/
& & & & & & & & display_graphic_8x16(page,(column+88+8*3),num0); & & & & & & & & /*在第5页,第113列显示单个数字&0&*/
& & & & & & & & display_graphic_8x16(page,(column+88+8*4),num0); & & & & & & & & /*在第5页,第121列显示单个数字&0&*/
& & & && &&&
& & & & & & & & blink_graphic_8x16(page,(column+88+8*4),num0);& & & & & & & & //光标闪烁
& & & & & & & &&&
* FUNCTION_PURPOSE:interrupt
* FUNCTIO N_INPUTS: void
* FUNCTION_OUTPUTS: transmit_complete is software transf
void it_SPI(void) interrupt 9 /* interrupt address is 0x004B*/
& & & & SPCON |= 0x40;& && && && && & /* run spi& &SPEN=1 */
& & & & SPCON |= 0x10;& && && && && & /* Master mode */& & & &
& & & & switch( SPSTA )& && && &/* read and clear spi status reGISTER*/
& & & & case 0x80:
& & & && && && & //serial_data=SPDAT;& &/* read receive data */
& & & && && && & //transmit_completed=1;/* set software flag */
& & & & case 0x10:
& & & && && && & /* put here for mode fault tasking */
& & & & case 0x40:
& & & && && && & /* put here for overrun tasking */
确实能驱动12864了,但是程序里有
unsigned char SPIS_Transfer(unsigned char dat)
& & SPDAT =& && && && && & //trigger SPI send
& & while (!(SPSTA&0X80));& && && && & //wait send complete
& & return SPDAT;& && && && && &//return received SPI data
这样的一段代码
但是这个 while (!(SPSTA&0X80));&&会导致传输变慢,
想在ISP中断里处理,怎么办呀
求大神帮助
满意回复+2
中断,进一次SPI发送中断,填充发送下一字节数据,另外需要一个全局变量保存状态,否则每次进中断看到的情况都相同,不知道什么时候发送完成。想是可以的,但是 ...
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
主题帖子积分
专家等级:结帖率:97%打赏:0.00受赏:38.00
主题帖子积分
开SPI发送完成中断就可以了,另外SPI的传输速度很快,如果不会影响到其它业务,这种查询方式是最简单的。除非有必要,不要自己弄复杂了。
++++看NE5532教学视频,炼就工程技术研发功力++++++++++
主题帖子积分
高级技术员, 积分 615, 距离下一级还需 385 积分
高级技术员, 积分 615, 距离下一级还需 385 积分
主题帖子积分
专家等级:结帖率:50%
主题帖子积分
高级技术员, 积分 615, 距离下一级还需 385 积分
高级技术员, 积分 615, 距离下一级还需 385 积分
NE5532 发表于
开SPI发送完成中断就可以了,另外SPI的传输速度很快,如果不会影响到其它业务,这种查询方式是最简单的。除 ...
开SPI中断,但是在SPI中断里怎么操作呀,是这样的,我们的一个项目需要,想在SPI传输的过程中不去等待,而是能让MCU去处理其他事情,这样怎么做的呀
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
主题帖子积分
专家等级:结帖率:97%打赏:0.00受赏:38.00
主题帖子积分
中断,进一次SPI发送中断,填充发送下一字节数据,另外需要一个全局变量保存状态,否则每次进中断看到的情况都相同,不知道什么时候发送完成。想是可以的,但是要想清楚是否必要,只是个善意提醒,避免做了N多工作以后发现根本没必要。
++++看NE5532教学视频,炼就工程技术研发功力++++++++++
时间类勋章
涓涓之细流
发帖类勋章
终身成就奖章
等级类勋章
坚毅之洋流
发帖类勋章
时间类勋章
技术领袖奖章
人才类勋章
热门推荐 /1

我要回帖

更多关于 12864点阵液晶屏 的文章

 

随机推荐