数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 6251|回复: 31

[C51] 单片机I/O口无序直驱LED数码管程序分享

[复制链接]
发表于 2021-9-11 22:34:57 | 显示全部楼层
本帖最后由 广东梁百万 于 2021-9-11 23:03 编辑

下面这个是我年初针对STC8G1K17   SOP-20 +  LCD1602写的程序(部分),就是用不是同一组的I/O口拼成一组8位数据口给LCD1602的D0~D7.

重点留意  bdata 这个数据类型   ,跟着把端口P1^2定义成LCD_D0 , 再在程序里对LCD_D0 进行位操作
那位1065307738大神用的  DA=(bit)(Dat&0x01); 进行位操作比我的更简洁,但下面程序的作法是我自己摸索出来的,所以我还是习惯了用我自己的方法:lol:


   sbit  LCD_D0  =  P1^2;
   sbit  LCD_D1  =  P1^3 ;
   sbit  LCD_D2  =  P3^2 ;
   sbit  LCD_D3  =  P3^3 ;
   sbit  LCD_D4  =  P3^4 ;
   sbit  LCD_D5  =  P3^5 ;
   sbit  LCD_D6  =  P3^6 ;
   sbit  LCD_D7  =  P3^7;
   sbit  LCD_RS  =  P1^0;   //LCD1602 的 RS端  ,1-数据,0-指令
   sbit  LCD_EN  =  P1^1 ;  //LCD1602 的 E端   ,先从低变高,再变低,以确认输入数据或命令



         
         unsigned char bdata LCD1602RAM2;  //LCD1602的写入缓冲    ********* 重点留意  bdata 这个数据类型

         sbit LCD1602RAM2_D0= LCD1602RAM2^0;
         sbit LCD1602RAM2_D1= LCD1602RAM2^1;
         sbit LCD1602RAM2_D2= LCD1602RAM2^2;
         sbit LCD1602RAM2_D3= LCD1602RAM2^3;
         sbit LCD1602RAM2_D4= LCD1602RAM2^4;
         sbit LCD1602RAM2_D5= LCD1602RAM2^5;
         sbit LCD1602RAM2_D6= LCD1602RAM2^6;
         sbit LCD1602RAM2_D7= LCD1602RAM2^7;

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


                 //LCD1602数据写入
                        void LCD1602SZ()
                   {
                         LCD_RS=1;
                        LCD_EN=1;
                   LCD_D0=LCD1602RAM2_D0;
                   LCD_D1=LCD1602RAM2_D1;
                   LCD_D2=LCD1602RAM2_D2;
                   LCD_D3=LCD1602RAM2_D3;
                   LCD_D4=LCD1602RAM2_D4;
                   LCD_D5=LCD1602RAM2_D5;
                   LCD_D6=LCD1602RAM2_D6;
                   LCD_D7=LCD1602RAM2_D7;
                    LCD_EN=0;  //E,下降沿,让LCD读取
                         Delay60us();  //延时80us

                        }


                         //LCD1602指令写入
                        void LCD1602ZL()
                        {
                        LCD_RS=0;
                        LCD_EN=1;
                   LCD_D0=LCD1602RAM2_D0;
                   LCD_D1=LCD1602RAM2_D1;
                   LCD_D2=LCD1602RAM2_D2;
                   LCD_D3=LCD1602RAM2_D3;
                   LCD_D4=LCD1602RAM2_D4;
                   LCD_D5=LCD1602RAM2_D5;
                   LCD_D6=LCD1602RAM2_D6;
                   LCD_D7=LCD1602RAM2_D7;
                    LCD_EN=0;                 //E,下降沿,让LCD读取
                        Delay60us();  //延时80us

                        }





                        //LCD1602初始化
                        void LCD1602CCH()
                        {
                        
                        LCD1602RAM2=0;
                        delay_ms(15);          //延时15毫秒
                        LCD1602RAM2=0x38;  //;16行*2,5*8
                        LCD1602ZL();         //写入指令
                   delay_ms(5);          //延时5毫秒
                   LCD1602RAM2=0x38;  //;16行*2,5*8
                        LCD1602ZL();         //写入指令
                   delay_ms(5);          //延时5毫秒
                   LCD1602RAM2=0x08; // 关显示
                   LCD1602ZL();         //写入指令
                   delay_ms(1);          //延时1毫秒
                  LCD1602RAM2=0x01;        //清屏
                   LCD1602ZL();         //写入指令
                   delay_ms(5);          //延时5毫秒
                   LCD1602RAM2=0x06;        //;地址计数器AC自动加1,光标右移 *******
                   delay_ms(1);          //延时1毫秒
                   LCD1602RAM2=0x0C;        //开显示
                  LCD1602ZL();         //写入指令
                   delay_ms(1);          //延时1毫秒
                  
                   }



                // LCD1602全屏显示程序,16字*2行


                  void LCD1602SC()
                   {
                   unsigned char i=16;          //每行的个数计数
                   unsigned char x=0;                 //行数
                   unsigned char y=0;                //列数
                  
                   LCD1602RAM2=0x80;   //这个是LCD第1行的地址
                   LCD1602ZL(); //以地址/指令形式发送到LCD1602

                   while(i--)
                   {
                   LCD1602RAM2=LCD1602RAM1[0][y];
                   LCD1602SZ(); //以数据形式发送到LCD1602
                   y++;
                   };

               LCD1602RAM2=0xC0;   //这个是LCD第2行的地址
                   LCD1602ZL(); //以地址/指令形式发送到LCD1602
                   i=16        ;                 //每行的个数计数
                   y=0;        //每行的个数
                   while(i--)
                   {
                   LCD1602RAM2=LCD1602RAM1[1][y];
                   LCD1602SZ(); //以数据形式发送到LCD1602
                   y++;
                   };
                  
                   }








回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-6-21 01:57 , Processed in 0.093600 second(s), 8 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表