历史上的今天
返回首页

历史上的今天

今天是:2024年10月15日(星期二)

正在发生

2019年10月15日 | ATMEGA16A单片机1602字符显示程序

2019-10-15 来源:eefocus

* 【编译环境】: ICCAVR  

* 【函数功能】: 1602字符显示        

* 【晶    振】:  8M                

* 【芯    片】:  ATMEGA16A         


#include

#define uchar unsigned char 

#define uint unsigned int 


uchar wz[]={"mcustudio1com-cn"};

uchar gd[]={"Tel:15980xx5601"};

#define uchar unsigned char 

#define uint unsigned int 


#define RS 0

#define RW 1

#define EN 2


void s_ms(uint ms)

{

        for(;ms>1;ms--);

}        


//查忙

void busy(void)

{

    uchar temp;

        s_ms(500);

        PORTA&=~(1<        s_ms(500);

        PORTA|=(1<        s_ms(500);

        while(temp)

        {

                PORTA|=(1<                s_ms(500);

                DDRB=0x00;      //A口变输入

                PORTB=0xff;     //上拉使能

                s_ms(500);

                temp = PINB&0x80;    //读取A口

                s_ms(500);      

                DDRB=0xff;      

                PORTB=0xff;        //A口变输出

                s_ms(500);

                PORTA&=~(1<                s_ms(500);

        }

}


//写指令

void writecom(uchar        com)

{

        busy();

        s_ms(500);

        PORTA&=~(1<        s_ms(500);

        PORTA&=~(1<        s_ms(500);

        PORTA|=(1<        s_ms(500);

        PORTB = com;       //输出指令

        s_ms(500);

        PORTA&=~(1<        s_ms(500);

}


//1602初始化

void        LcdInit(void)

{

    DDRB = 0xff; 

    PORTB = 0x00; 

        writecom(0x38);

        s_ms(1000);

        writecom(0x01);

        s_ms(1000);

        s_ms(1000);

        s_ms(1000);

        s_ms(1000);

        s_ms(1000);

        s_ms(1000);

        s_ms(1000);

        writecom(0x02);

        s_ms(1000);

        writecom(0x06);

        s_ms(1000);

        writecom(0x0c);

        s_ms(1000);

        writecom(0x38);        

        s_ms(1000);

}        


//写数据

void        writedata(uchar data)

{

        busy();

        s_ms(500);

        PORTA|=(1<        s_ms(500);

        PORTA&=~(1<        s_ms(500);

        PORTA|=(1<        s_ms(500);

        PORTB = data;      //输出数据

        s_ms(500);

        PORTA&=~(1<        s_ms(500);

}



//读数据

uchar        readdata(void)

{

        uchar temp;

        busy();

        s_ms(500);

        PORTA|=(1<        s_ms(500);

        PORTA|=(1<        s_ms(500);

        PORTA|=(1<        s_ms(500);

        DDRB=0x00;       //A端口变输入

        s_ms(500);

        temp = PINB;     //读A端口

        s_ms(500);

        DDRB=0xff;       //A端口变输出

        s_ms(500);

        PORTA&=~(1<        s_ms(500);

        return temp;        

}


//=================================================

// 描述: 写LCD内部CGRAM函数

// 入口: ‘num’要写的数据个数

//        ‘pbuffer’要写的数据的首地址

// 出口: 无

//================================================

void        WriteCGRAM(uint        num, const uint        *pBuffer)

{

        uint        i,t;

        writecom(0x40);

        PORTA|=(1<        PORTA&=~(1<        for(i=num;i!=0;i--)

        {

                t = *pBuffer;

                PORTA|=(1<                PORTB = t;

                PORTA&=~(1<                pBuffer++;

        }

        

}


//=================================================

//描述:写菜单函数,本程序使用的LCD规格为 16 * 2

//入口:菜单数组首地址

//出口:无

//=================================================

void        WriteMenu(const uchar *pBuffer)

{

        uchar        i,t;

        writecom(0x80);   //数据地址

        

        PORTA|=(1<        PORTA&=~(1<        s_ms(50);

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

        {

                t = *pBuffer;

                PORTB = t;

                PORTA|=(1<                s_ms(50);

                PORTA&=~(1<                pBuffer++;

        }

        writecom(0xC0);


        PORTA|=(1<        PORTA&=~(1<        s_ms(50);        

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

        {

                t = *pBuffer;

                PORTB = t;

                PORTA|=(1<                s_ms(50);

                PORTA&=~(1<                pBuffer++;

        }

}

//====================================================

// 描述:在任意位置写数字函数

// 入口:’row‘表示要写数字所在的行地址,只能为1或2

//       ’col‘表示要写数字所在的列地址,只能为0--15

//                 ‘num’表示要写的数字,只能为0--9

// 出口:无

//===================================================

void        WriteNum(uint        row,uint        col,uint         num)

{

        if (row == 1)        row = 0x80 + col;

        else        row = 0xC0 + col;

        writecom(row);

        if (num<=0 | num>9)        num =0x30;

        else        num = 0x30 + num;


        PORTA|=(1<        s_ms(500);

        PORTA&=~(1<        s_ms(500);

        PORTB = num;

        s_ms(500);

        PORTA|=(1<        s_ms(500);

        PORTA&=~(1<        s_ms(500);                        

}

//================================================================

// 描述:在任意位置写任意多个字符

// 入口:’row‘要写的字符所在的行,只能为1或2;

//       ‘col’要写的字符所在的列,只能为0---15

//       ‘num’要写字符的个数

推荐阅读

史海拾趣

Allied Controls Incorporated公司的发展小趣事

Allied Controls Incorporated(ACI)是一家专注于设计和制造温度传感器和控制器的公司,以下是其发展历程的五个相关故事:

  1. 创立和早期发展: Allied Controls Incorporated成立于1983年,总部位于美国新泽西州。公司的创始人是一群对温度控制技术充满热情的工程师和企业家。起初,ACI专注于为工业和商业应用提供高品质的温度传感器和控制器。通过不断提高产品质量和性能,公司逐渐赢得了客户的信任和好评,实现了良好的初期发展。

  2. 技术创新与产品优化: 随着市场需求的变化和技术的发展,ACI不断进行技术创新,并不断优化其产品线。公司投入大量资源用于研发新型温度传感器和控制器,以满足不同行业的需求。ACI的工程团队与客户紧密合作,根据客户的反馈和需求不断改进产品设计和性能,确保产品的质量和可靠性。

  3. 扩大市场份额: 随着业务的稳步增长,ACI逐渐扩大了其市场份额,涵盖了更多的行业和应用领域。除了工业和商业应用外,公司还开始进军医疗、航空航天、汽车和消费电子等领域。通过开发定制化解决方案和与行业领先企业合作,ACI成功地拓展了其市场份额,并在各个行业中树立了良好的声誉。

  4. 国际市场拓展: 除了在美国市场取得成功外,ACI还积极拓展国际市场。公司与全球各地的合作伙伴建立了稳固的合作关系,拓展了产品的销售网络。ACI的产品出口到欧洲、亚洲和其他地区,赢得了国际客户的青睐和认可。通过不断开拓国际市场,ACI进一步巩固了其在全球温度传感器和控制器领域的领先地位。

  5. 持续创新和发展: 作为一家技术驱动型公司,ACI致力于持续创新和发展。公司不断投入研发和技术改进,推出更加先进和高性能的产品。ACI的工程团队不断探索新的技术和解决方案,以满足客户日益增长的需求。通过不断创新和发展,ACI得以在电子行业中保持竞争优势,并为客户提供更加可靠和高效的温度控制解决方案。

EF Johnson Technologies Inc公司的发展小趣事

作为一家具有社会责任感的企业,EF Johnson公司始终关注环境保护和社会公益。公司积极响应国家节能减排政策,采用环保材料和清洁能源进行生产活动。同时,EF Johnson还积极参与社会公益活动,捐赠资金和物资支持教育事业和贫困地区的发展。这些举措不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实基础。

General Instrument Corp公司的发展小趣事
验证输入信号是否在变换器的允许范围内,避免超出其最大或最小输入电压。
FEIG ELECTRONIC公司的发展小趣事

FEIG ELECTRONIC成立于1978年,作为德国射频识别(RFID)系统的先驱,公司从一开始就专注于RFID技术的研发与制造。在创立初期,FEIG凭借其独特的技术视角和对市场需求的敏锐洞察,成功开发了一系列RFID系统,为物流、零售等行业提供了有效的解决方案。通过不断的技术创新和市场拓展,FEIG逐渐在RFID领域崭露头角。

DETCO公司的发展小趣事

在电子产品行业日益关注环保和可持续发展的背景下,ElectronicsCorp采取了一系列积极措施。公司开始使用环保材料制造产品,并优化生产流程以减少能源消耗和废物排放。此外,ElectronicsCorp还推出了一系列回收计划,鼓励消费者将旧电子产品回收再利用。这些措施不仅提高了公司的环保形象,还增强了消费者对公司品牌的忠诚度。

Dexter Research Center Inc公司的发展小趣事

Dexter Research Center Inc.(以下简称Dexter)最初是由一群热衷于电子科技研究的科学家和工程师组成的实验室。他们热衷于探索新的传感器技术,并在实验室环境下取得了多项技术突破。然而,技术的真正价值在于其商业化应用。Dexter意识到这一点,决定将研究成果转化为实际产品,推向市场。经过数年的努力,Dexter成功开发出了一系列高性能、高精度的传感器产品,并受到了市场的热烈欢迎。

问答坊 | AI 解惑

别傻了(5):报销时偷偷带一点儿私

报销单是公司测试你的一个工具        看到这个题目或许你会纳闷?报销单也能测试员工?是的,我们平时不以为常的报销单也是公司或领导测试你的一个工具。     大部分公司都会有月底报销(餐费、交通费、电话费等)或出差报销吧?   ...…

查看全部问答>

硬件高手在where????

在嵌入式系统中中断相关寄存器 常有 一个中断使能寄存器和一个中断屏蔽寄存器 一个是使能相应位,一个是屏蔽相应位;请问这两个寄存器的实现的作用一样吗?为什么用两个而不只用一个寄存器来实现 中断 使能/屏蔽 功能呢? …

查看全部问答>

wince驱动开发

请问朋友们,wince驱动开发可以有什么具体的开发项目,介绍几个,要求能够拿出台面展示或者能够参加程序设计比赛的。 …

查看全部问答>

u-boot-2010.03在tq6410上的移植详解(连载)

http://bbs.embedsky.net/viewthread.php?tid=6761&extra=page%3D1 (一) 原创文章版权所有!如需转载,请注明出处: http://hi.baidu.com/liushuiyue1/myhome谢谢合作!!!!!由于Uboot2010.03对S3C6410有了很好的支持,所以采用Uboot201 ...…

查看全部问答>

STM32串口发送问题

 while(1) {  while((USART1->SR & 0x80)==0);  //检查发送缓冲器是否为空   USART1->DR=0x0012;   //写进数据寄存器的数据   while((USART1->SR & 0x40)== ...…

查看全部问答>

DDR 的瓶颈

  最近一直在调试DDR,调试几天,仍然是毫无结果,真是郁闷,纠结中啊!!ddr的初始化是uboot 里面的,应该没有问题,也就是想把重定位到DDR 中运行,由于IRAM容量有限,只能运行16KB的程序!板子是QT210,A8的板子,cpu是S5PV210,明天继续~~ ...…

查看全部问答>

求前辈指路

毕业不久,对硬件感兴趣,想做一个硬件工程师,请问各位前辈,如果要做一个硬件工程师需要学习些什么东西呢?需要怎样入行呢?或者可以参加什么样的培训呢?多谢各位指导。…

查看全部问答>

S3C2416数据手册。

    到时候能用得上。省的大家再花时间去找。 …

查看全部问答>

E8卡片电脑、OK335xS-II谁更适合您?

由树莓派引发的卡片电脑热潮,国内嵌入式开发商也纷纷开发体积小的卡片电脑。国内著名嵌入式开发也开发卡片电脑。现在,将对天嵌的E8卡片电脑与OK335xS-II开发板进行基本参数的对比。 基本参数对比:  基本参数     ...…

查看全部问答>

STM32 Nucleo使用心得

      刚才登错朋友的账号,把文章发出去了,现在再写一篇     得知自己得到了参团购买STM32 Nucleo-L053R8感到很高兴,等待了几十天,板子终于到了,在网上了解到stm32l053是ST新出的一款低功耗的MCU,所以坤函数 ...…

查看全部问答>