历史上的今天
返回首页

历史上的今天

今天是:2024年10月25日(星期五)

正在发生

2019年10月25日 | ATmega16的lcd12864显示程序及proteus仿真工程文件

2019-10-25 来源:51hei

 

#include

#include

#include"12864.h"

#include"main.h"


void port_init(void)

{

DDRC=0xFF;                 //12864数据口,置为输出

PORTC=0xFF;


en_out;   //置EN输出

rw_out;   //置rw输出

rs_out;   //置rs输出

cs1_out;//置cs1输出

cs2_out;//置cs2输出 

}


/***

******12864写命令函数

***/

void lcd_write_com(uchar com)

{

        rw_clr;                           //写操作

        delay_us(3);

        rs_clr;                          //写数据        

        PORTC=com;

        en_set;

        delay_us(3);

        en_clr;

}


/***

******12864写数据函数

***/

void lcd_write_date(uchar date)

{

        rw_clr;            //写操作

        delay_us(3);  

        rs_set;   //写数据

        PORTC=date;

        en_set;

        delay_us(3);

        en_clr;

}


/***

******12864确定位置数据函数

******页地址:x范围0-7

******列地址:y范围0-63

***/

void lcd_setxy(uchar x,uchar y)

{

        lcd_write_com(0xb8+x);

        lcd_write_com(0x40+y);

}


/***

******12864写一个字母或数字函数

******页地址:x范围0-3

******列地址:y范围0-15

***/ 

void lcd_write_ch(uchar x,uchar y,const uchar *ch)

{

        uchar i,j;

        if(y<8)                        //判断列地址,如果小于8列,显示在左屏

        {

                cs1_clr;        //        CS1=0;

            cs2_set;        //  CS2=1;

        }

        else                         //判断列地址,如果大于8列,显示在右屏

        {

        

                cs1_set;        //  CS1=1;

                cs2_clr;        //  CS2=0;

                y=y-8;

        }

        for(i=0;i<2;i++)

        {

                 lcd_setxy(x*2+i,y*8);                                  // x*2+i的意思是每个字符占用两页,一共可以显示4行(一共8页)

                                                                                              // y*8 的意思是每次写入的列都是8的整数倍

                 for(j=0;j<8;j++)

                 {

                          lcd_write_date(ch[i*8+j]) ;           //一共16个字节

                         delay_us(1);

                 }

        }

        cs1_clr;                 //    CS1=0;

        cs2_clr;                 //    CS2=0;

}


/***

******12864写一个汉字函数

******页地址:x范围0-3

******列地址:y范围0-7

***/ 

void lcd_write_hanzi(uchar x,uchar y,const uchar *dat)

{

        uchar i,j;

        if(y<4)

        {

                cs1_clr;                   //CS1=0;

                cs2_set;               //CS2=1;

        }

        else 

        {

        cs1_set;                //CS1=1;

                cs2_clr;                //CS2=0;

                y-=4;

        }


        for(i=0;i<2;i++)

        {

                lcd_setxy(x*2+i,y*16);                                  // x*2+i的意思是每个汉字占用两页,一共可以显示4行(一共8页)

                delay_us(1);                                                //每次写入都是16的倍数列

                for(j=0;j<16;j++)

                {

                        lcd_write_date(dat[i*16+j]) ;           //一共16个字节

                        delay_us(3);

                }        

        }

        cs1_clr;                        //CS1=0;

        cs2_clr;                        //CS2=0;

}


/***

******12864写一行字符函数

******页地址:x范围0-3

******列地址:y范围0-15

******字符数:0-15

***/

void lcd_write_str_hang(uchar x,uchar y,const uchar *ch,uchar n)

{

        uchar i;

        for(i=0;i        {

                lcd_write_ch(x,y,ch+16*i);        //指针相加

                y++;

                delay_us(3);        

        }

}



/***

******12864写一行汉字函数

******页地址:x范围0-3

******列地址:y范围0-7

******字符数:0-7

***/

void lcd_write_hanzi_hanzi_hang(uchar x,uchar y,const uchar *date,uchar n)

{

        uchar i;

        for(i=0;i        {

                lcd_write_hanzi(x,y,date+i*32);

                //注意理解ch+i*32:指的是数组指向下 i*32个数组

                y++;        

                delay_us(3);

        }

}


/***

******12864写一个字母或数字反白函数

******页地址:x范围0-3

******列地址:y范围0-15

***/ 

void lcd_write_ch_fb(uchar x,uchar y,const uchar *ch)

{

        uchar i,j;

        if(y<8)

        {

                cs1_clr;                   //CS1=0;

                cs2_set;                   //CS2=1;

        }

        else 

        {

                cs1_set;                   //CS1=1;

                cs2_clr;                   //CS2=0;

                y-=8;

        }

        

        for(i=0;i<2;i++)

        {

                lcd_setxy(x*2+i,y*8);                

                {

                        for(j=0;j<8;j++)

                        {

                                lcd_write_date(255-ch[i*8+j]) ;           //一共16个字节        

                                delay_us(3);

                        }

                }

        }

        cs1_clr;                                 //CS1=0;

        cs2_clr;                                //CS2=0;        

}


/***

******12864写一行字母或数字反白函数

******页地址:x范围0-3

******列地址:y范围0-15

***/ 

void lcd_write_str_fb(uchar x,uchar y,const uchar *ch,uchar n)

{

uchar i;

for(i=0;i{

  lcd_write_ch_fb(x,y,ch+i*16);

        y++;

        delay_us(3);

推荐阅读

史海拾趣

Andon Electronics公司的发展小趣事

Andon Electronics 是一家全球领先的电子元件制造商,以下是该公司发展的相关故事:

  1. 公司成立与初期发展:Andon Electronics 成立于 1984 年,总部位于美国加利福尼亚州。最初,公司主要从事 LED 和其他电子元件的生产和销售。由于对高质量产品和客户服务的执着追求,公司迅速赢得了客户的信任和好评。

  2. 技术创新与产品拓展:随着市场需求的变化和技术的进步,Andon Electronics 不断进行技术创新,并逐步扩大产品线。除了 LED 产品外,公司还推出了多种其他电子元件,包括连接器、电缆组件、线束和传感器等。这些产品在汽车、工业、通信和消费电子等领域得到了广泛应用。

  3. 质量管理和认证:Andon Electronics 一直致力于质量管理和产品认证,确保产品符合国际标准和客户要求。公司拥有 ISO 9001 质量管理体系认证,并不断优化生产流程和质量控制体系,以确保产品质量的稳定性和可靠性。

  4. 全球布局和市场拓展:随着业务的不断发展,Andon Electronics 在全球建立了多个生产基地和销售办事处。除了在美国的总部和生产基地外,公司还在亚洲、欧洲和其他地区设立了办事处和生产工厂,以更好地服务全球客户,并适应当地市场的需求。

  5. 可持续发展和未来展望:Andon Electronics 将继续致力于技术创新、产品拓展和质量管理,以满足客户不断变化的需求。公司将继续关注环保和可持续发展,推动节能减排和资源利用效率的提升。同时,Andon Electronics 也将积极响应行业的变革和挑战,不断调整战略,保持在电子元件制造业的领先地位。

Fronter Electronics Co Ltd公司的发展小趣事

进入21世纪后,Fronter电子意识到技术创新的重要性,开始加大在技术研发方面的投入。公司成立了专门的研发团队,致力于IC模块、晶振、滤波器、电感等电子产品的技术开发与升级。同时,Fronter电子积极申请专利,保护自主知识产权,并逐步打造出了自己的品牌“FT”。随着技术实力的增强和品牌知名度的提升,Fronter电子在电子行业中的影响力进一步扩大。

智烽维(CDA)公司的发展小趣事

经过几年的技术积累和市场探索,智烽维在2013年成功完成了叠片型超级电容器的研发。这一产品的推出,不仅极大地丰富了公司的产品线,也进一步提升了智烽维在超级电容器领域的技术实力。叠片型超级电容器以其高性能、高可靠性和长寿命等特点,受到了市场的广泛关注和好评。

康奈特(CNNT)公司的发展小趣事

面对数字化浪潮的冲击,康奈特积极响应并开始了数字化转型之路。公司引进了先进的智能制造设备和技术手段,实现了生产线的自动化和智能化升级。同时,公司还建立了数字化管理平台,实现了对生产、销售、库存等各个环节的实时监控和管理。这种数字化转型不仅提高了生产效率和质量稳定性,也为公司未来的发展奠定了坚实的基础。

DBS Microwave Inc公司的发展小趣事

DBS Microwave Inc公司起源于XXXX年,当时由几位志同道合的电子工程师创立。他们共同意识到,随着无线通信技术的飞速发展,微波器件的市场需求将会急剧增长。于是,他们凭借丰富的专业知识和对市场趋势的敏锐洞察,决定专注于研发和生产高质量的微波射频器件。起初,公司面临着资金紧张、市场竞争激烈等诸多挑战,但创始人团队凭借坚韧不拔的精神和对技术的执着追求,逐步在市场上崭露头角。

Global Power Technologies Group公司的发展小趣事
确保触发信号的幅度、宽度和极性适合电路的要求,以免触发失败或误触发。

问答坊 | AI 解惑

BOOTLOADER程序有高手能指点么?

把外部flash里的程序放到ARM内部ROM,谁有代码啊?…

查看全部问答>

Linus步入不惑之年

2009年12月28日是Linux创始人Linus的40岁生日。 19年前,在圣诞节后赫尔辛基商店开业的第一天“,Linus冲向电脑商店,用圣诞节和生日礼金购买了他的第一台PC:一台DX33 80386计算机,4 Megs RAM,40 Megabyte硬盘,没有协同处理器。Linus之所以选 ...…

查看全部问答>

心情沮丧啊。。。

刚刚了看,里面有句话很让我沮丧啊:卖包子的都比工程师强! 研发:产业链的源头,资金链的末尾; 销售:产业链的末尾,资金链的源头; 研发人员是那里面最累的,钱拿的是最少的(指回报率),在一个行业坚持下去的没几人,还劝说周围的年轻人除 ...…

查看全部问答>

BIOS设计是否可以跨硬件

在自学汇编的过程中,遇到一个问题: 我写的BIOS调用是否可以跨硬件平台 换句话说,就是不同的板子上的BIOS设计是否是一样的?…

查看全部问答>

在WinCE环境下对.txt文件的读写

编写一个基于MFC的应用程序,读取.txt文件 文件内容的结构如下 书名1;价格1 书名2;价格2 书名3;价格3 。。。。。。 要求分别提取出书名和价格,分别放到string类型变量中 要就用VC++实现 各位高手帮帮忙,最好能有代码…

查看全部问答>

一个USB设备二台电脑

一个USB扩展槽上插了一个U盘,用USB连接线插了二台电脑。这两台电脑不同时操作U盘的情况下(任何情况下只有一台电脑对U盘操作),这样使用会有问题吗?…

查看全部问答>

请教版主,为什么我的程序进不了硬中断(已解决)

问高手个问题,为什么我的程序进了不硬中断? BIOS设置: HWI_INT11属性: interrupt source: MCSP_0_Receiver function: _receiver use Dispatcher interrupt Mash: self 程序 void main() {} void receiver() {...} 用轮询方式可以收 ...…

查看全部问答>

基于高吞吐率WLR测试的 ACS集成测试系统(二)

多器件TDDB和NBTI 图4示出了多器件TDDB测试结构的共用 SMU和SMU-per-pin配置。在开关(共用SMU) 情况下,SMU1提供连续应力至测试序列的全 部结构,SMU2顺序测量每个器件。在顺序分 析结构的过程中,开关延时和有限的测量速 度合在一起会限制每 ...…

查看全部问答>

C2000 Launchpad发热很大??!!

今天刚拿到快递~~~好欢乐~~~(不得不吐槽的是,圆通就是慢,虽然路上不慢,但是总在终点站耽误一天!!尼玛啊!!) 迫不及待插上电,试试内置的例程. led闪了会,一摸芯片,明显有点烫啊!! 后来用ccs5少了个led boosterpack的程序进去..(虽然没达到演示效果 ...…

查看全部问答>

【Nucleo心得】+ (EX06) 旋转编码器使用

本帖最后由 slotg 于 2014-10-19 09:37 编辑 本次实验编写了一个旋转编码器的驱动,顺时钟旋转时计数器增加,逆时钟旋转时计数器减少,压下中间开关时计数器清除。 旋转编码器的接脚与输出波形: 旋转编码器是输出2个相位差90度的波形,由 ...…

查看全部问答>