历史上的今天
返回首页

历史上的今天

今天是:2024年12月09日(星期一)

正在发生

2020年12月09日 | 详细LCD1602串行或者并行数据传输51单片机程序

2020-12-09 来源:51hei

单片机串行源程序如下:

#include "reg52.h"  

#include   

   

//LCD1602接口定义              

#define    LCD_DATA    P1  //P1口(P14~P17)与LCD高四位(D4~D7)对应相接  

sbit   LCD1602_RS=P1^2;        //数据指令  

sbit   LCD1602_EN=P1^3;        //使能  

   

//延时函数,12mhz 6t延迟时间10*255us  

void LCD_init(void);  

void LCD_en_write(void);  

void LCD_write_command(unsigned char command) ;  

void LCD_write_data(unsigned char Recdata);  

void LCD_set_xy (unsigned char x, unsigned char y);  

void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);  

void LCD_write_char(unsigned char X,unsigned char Y,unsigned char Recdata);  

void delay_nus(unsigned int n);  

void delay_nms(unsigned int n);  

   

//以下函数用于输出字符串和数字  

int LCD_PutNum(unsigned long num,int XS,int pos);  

int LCD_PutStr(unsigned char *DData,int pos);  

   

//-------------------------1us延时函数---------------------------------  

void delay_1us(void)   

{  

    _nop_();  

}  

//------------------------N us延时函数---------------------------------  

void delay_nus(unsigned int n)   

{  

unsigned int i=0;  

for (i=0;idelay_1us();  

}  

  //-----------------------1ms延时函数----------------------------------  

void delay_1ms(void)  

{  

unsigned int i;  

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

}  

  //-----------------------N ms延时函数---------------------------------  

void delay_nms(unsigned int n)  

{  

unsigned int i=0;  

for (i=0;idelay_1ms();  

}  

  //------------------------液晶初始化-----------------------------------  

void LCD_init(void)  

{  

LCD_write_command(0x28);  

delay_nus(40);   

LCD_write_command(0x28);  

delay_nus(40);   

LCD_write_command(0x28);  

delay_nus(40);   

   

LCD_en_write();  

delay_nus(40);  

LCD_write_command(0x28); //4位显示  

LCD_write_command(0x0c); //显示开  

LCD_write_command(0x01); //清屏  

delay_nms(2);  

}  

   

  //----------------------液晶使能函数-------------------------------------  

void LCD_en_write(void)  

{                       //EN由高电平跳变到低电平时液晶使能  

LCD1602_EN=1;  

delay_nus(1);  

LCD1602_EN=0;  

}  

//------------------------写指令函数--------------------------------------  

void LCD_write_command(unsigned char command)   

{  

delay_nus(16);  

LCD1602_RS=0; //RS=0  

LCD_DATA &=0X0f; //清高四位  

LCD_DATA|=command&0xf0; //写高四位  

LCD_en_write();  

command=command<<4; //低四位移到高四位  

LCD_DATA&=0x0f; //清高四位  

LCD_DATA|=command&0xf0; //写低四位  

LCD_en_write();  

}  

   

//------------------------写数据函数--------------------------------------  

void LCD_write_data(unsigned char Recdata)   

{  

delay_nus(16);  

LCD1602_RS=1; //RS=1  

LCD_DATA&=0X0f; //清高四位  

LCD_DATA|=Recdata&0xf0; //写高四位  

LCD_en_write();  

Recdata=Recdata<<4; //低四位移到高四位  

LCD_DATA&=0X0f; //清高四位  

LCD_DATA|=Recdata&0xf0; //写低四位  

LCD_en_write();                                                                                                                                                                                                                                                                                                                                                                                                

}  

   

//-----------------------地址定位函数-------------------------------------  

void LCD_set_xy( unsigned char x, unsigned char y )   

{  

    unsigned char address;  

    if (y == 0) address = 0x80 + x;  

    else address = 0xc0 + x;  

    LCD_write_command(address);  

}  

   

   

//----------------------在某个地址处,写一个字符----------------------------  

void LCD_write_char(unsigned char X,unsigned char Y,unsigned char Recdata) //列x=0~15,行y=0,1  

{  

    LCD_set_xy(X, Y); //写地址  

    LCD_write_data(Recdata);  

}  

//----------------------------输出字符串-------------------------------------  

int LCD_PutStr(unsigned char *DData,int pos)  //pos表示字符显示位置,0~31  

{   

    unsigned char i;   

    if(pos==-1)  

    {  

        LCD_write_command(0x01); //清屏  

        delay_nms(2);  

        pos=0;   

    }   

    while((*DData)!='')  

    {      

        switch(*DData)  

        {   

            case 'n': //如果是n,则换行   

            {   

                if(pos<17)  

                {  

                    for(i=pos;i<16;i++) LCD_write_char(i%16, i/16,' ');  

                    pos=16;  

                }  

                else  

                {   

                    for(i=pos;i<32;i++) LCD_write_char(i%16, i/16,' ');  

                    pos=0;  

                }   

                break;   

            }  

   

            case 'b': //如果是b,则退格  

            {  

                if(pos>0) pos--;  

                LCD_write_char(pos%16, pos/16, ' ');   

                break;   

            }  

   

            default:   

            {   

                if((*DData)<0x20)  //小于0x20的显示不了?  

                {  

                    *DData=' ';  

                }  

   

                LCD_write_char(pos%16, pos/16,*DData);  

                pos++;   

                break;   

            }   

        }   

        DData++;   

    }  

    return(pos);  

}  

//----------------------------输出数字---------------------------------  

//这段程序写法我的理解大致是这样:num为去掉小数点之后的数字,XS为小数点  

//从左数第几位,pos为显示的位置  

//---------------------------------------------------------------------  

int LCD_PutNum(unsigned long num,int XS,int pos)  

{   

    unsigned long tmp=0;   

    unsigned char numbits=0; //总数字位数  

    if(pos==-1)  

    {   

        LCD_write_command(0x01);  

        delay_nms(2);   

        pos=0;   

    }   

   

    if(num==0)  

    {  

        LCD_write_char(pos%16, pos/16, '0');  

推荐阅读

史海拾趣

宝乘(baocheng)公司的发展小趣事

在激烈的市场竞争中,宝乘公司始终坚持质量为本的原则。公司建立了严格的质量管理体系,从原材料采购到生产加工、产品测试等各个环节都严格把关。正是这种对质量的执着追求,让宝乘的产品赢得了客户的信赖和好评。许多知名企业都成为了宝乘的长期合作伙伴,共同推动电子行业的发展。

Avel Lindberg公司的发展小趣事

宝乘公司自创立之初,便立志于在电子行业中开创新天地。面对国内外激烈的市场竞争,宝乘团队凭借对半导体功率器件领域的深入研究和不断创新,成功研发出一系列具有竞争力的产品。从芯片到整流桥,再到高压硅堆和电力电子模块,宝乘的产品线逐渐丰富,产品质量和技术水平也得到了业界的认可。

台湾富晶(FORTUNE)公司的发展小趣事
确保电源供电稳定,无电压波动或断电现象。
GE (General Electric)公司的发展小趣事
检查各电机是否正常运转,有无异响或过热现象。
Alpha Semiconductor公司的发展小趣事

经过多年的发展,Alpha Semiconductor已经成为一家高性能标准、半标准模拟和混合信号IC制造商。公司在这一领域的制造实力得到了业界的广泛认可。Alpha Semiconductor的产品广泛应用于通信、计算机、消费电子等领域,为电子行业的发展做出了重要贡献。

Bestar Electric公司的发展小趣事

为了进一步提升竞争力,Bestar Electric开始整合产业链资源。公司通过与供应商建立长期合作关系,确保原材料的稳定供应;同时,公司还涉足电子产品的组装和制造领域,实现了产业链的垂直整合。此外,公司还积极探索多元化发展路径,涉足相关领域,如智能家居、物联网等,以拓展新的增长点。

问答坊 | AI 解惑

电子设计大赛题目征集

本帖最后由 paulhyde 于 2014-9-15 09:31 编辑 各位大虾能帮着想一些电子设计大赛的题目吗?主要针对单片机控制类的,不甚感激,  …

查看全部问答>

Msp430F449时钟各模块运用例程

Msp430F449各种模块运用例程,包含了:Basictimer,Timer_A,Timer_B,ADC12,时钟模块FLL+操作,…

查看全部问答>

wince下如何编译armv6的程序

使用ce6.0,平台cpu是armv6指令集的。 vs2005的工程设置中只有armv4和armv5,怎么编armv6的应用? 或者vs2008可以编armv6吗…

查看全部问答>

广州招聘 嵌入式开发人员 重分找顶!!

名称:广州市百家汇技术研发中心 地址:广州市天河区 简介:本中心是集软件系统、单片机、模型等设计和开发为一体的研发机构。公司拥有多名技术过硬的高级工程师。并且与北京航天航空大学进行学术联盟,各种新技术都在这里不断的产生和应用。公司 ...…

查看全部问答>

WinCE ping 的问题

定制了一个CE6.0的映像,从设备可以ping 主机,但是从主机不能够ping到设备, 如果换一个ce5.0,则没有问题,请问是定制时哪方面的问题?…

查看全部问答>

Operational amplifier gain stability Part 1 General system analysis

本帖最后由 dontium 于 2015-1-23 13:38 编辑  Operational amplifier gain stability Part 1 General system analysis …

查看全部问答>

有关三极管饱和区间的疑问

1、深度饱和是不是三极管介于截止区和饱和区的临界点? 2、深度饱和Uce是不是一定为0.3V?还是不同的管子有不同的值。 3、当Ube大于开启电压,Uce小于0.3V(或深度饱和电压)时,三极管处于什么样的工作状态?…

查看全部问答>

国行iPhone4S拆机——内部构造详解

一部iPhone4s国行16GB就这样牺牲了,掉海里了,主板全烧,我来发挥下它最后的价值。拆了吧!以前拆了就扔了,这次我想拆了再装回去。 工具 卸下电池螺丝,就可以把插口拔出来,电池就下来了 本人是新手,所以只能用这个方法不让零件遗失,WIFI模 ...…

查看全部问答>

【MXCHIP Open1081】哪有可用的IAR工程???

本帖最后由 dontium 于 2014-11-17 21:53 编辑 打开官方提供的IAR工程,好多文件,特别是关键文件不存在。 如上图中,只有system_smt32f2xx.c及startup_stm32f2xx.s能打开,其它的都不存在! 更可恶的是,项目中指定的一个关键文件 ---- mxch ...…

查看全部问答>

电感的区别

请问这两种电感有什么区别么?仅仅是封装不同么?分别用在什么场合…

查看全部问答>