数码之家

 找回密码
 立即注册
搜索
查看: 1806|回复: 3

分享我用汇编语言风格写的LCD1602显示程序 有需要的可参考

[复制链接]
发表于 2021-11-16 23:01:05 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我的C语言新手
我用汇编语言风格写的LCD1602显示程序,有需要的可参考下

使用说明: 数组  unsigned char xdata LCD1602RAM1[2][16] 就是对应LCD1602两行,每行16字, 对这数组某位写入ASCII码就可以在LCD1602对应位上显示出来
LCD1602RAM1[0][0]  是第一行最左边那位,LCD1602RAM1[0][15]是第一行最右边那位
LCD1602RAM1[1][0]  是第二行最左边那位,LCD1602RAM1[1][15]是第二行最右边那位

LCD_SC1(); 这个函数就是写入需要显示的数据ASCII码, 需要显示什么字符那在这个函数修改就可以了  
LCD1602SC();        这个函数是把数组  unsigned char xdata LCD1602RAM1[2][16]  的数据逐个写入到LCD1602

//-------------------------------------------
        #include<stc8g.h>
        #include  "intrins.h"


   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 xdata LCD1602RAM1[2][16]={
         {0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20},                  //LCD1602的缓存,初始值是空格20H
         {0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20}
         };


         unsigned char bdata LCD1602RAM2;  //LCD1602的写入缓冲
         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;


         void LCD1602ZL();  //LCD1602指令写入函数
           void LCD1602SZ();  //LCD1602数据写入函数
         void LCD1602CCH();  //LCD1602初始化函数
         void LCD1602SC();        //LCD1602全屏写入函数

         void LCD_SC1()     //全屏数据显示程序      ,需要显示的数据

         #define     MAIN_Fosc       11059200L   //定义主时钟,  自定义变量 ,L是长整型的意思

        void main()
        {


                  LCD1602CCH();                //LCD1602初始化

              //主函数//********************
            while (1)       //下面重复循环
       {

           LCD1602SC();           //LCD1602全屏写入函数
           LCD_SC1();    //全屏数据显示程序      ,需要显示的数据
      }

}



                         //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();  //延时60us

                        }

                 //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();  //延时60us

                        }

                        //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++;
                   };
                  
                   }




                   void LCD_SC1()     //全屏数据显示程序      ,需要显示的数据
                     {
                        LCD1602RAM1[0][0] =ON_DAY10+0X30;         //开机时的日十位
                        LCD1602RAM1[0][1] =ON_DAY1+0X30;           //开机时的日个位
                        LCD1602RAM1[0][2] ='/';                  //分隔符

                        LCD1602RAM1[0][3] =ON_HOUR10+0X30;  //开机时的时十位
                        LCD1602RAM1[0][4] =ON_HOUR1+0X30;           //开机时的时个位
                        LCD1602RAM1[0][5] =':';                  //分隔符
                        LCD1602RAM1[0][6] =ON_MIN10+0X30;        //开机时的分十位
                        LCD1602RAM1[0][7] =ON_MIN1+0X30;        //开机时的分个位

                        LCD1602RAM1[0][8] =0x2d;  //符号-
                        LCD1602RAM1[0][9] =0x7e;  //符号 >


                        LCD1602RAM1[0][10] =OFF_HOUR10+0X30; //停机时的时十位
                        LCD1602RAM1[0][11] =OFF_HOUR1+0X30;           //停机时的时个位
                        LCD1602RAM1[0][12] =':';                  //分隔符  
                        LCD1602RAM1[0][13] =OFF_MIN10+0X30;        //停机时的分十位
                        LCD1602RAM1[0][14] =OFF_MIN1+0X30;        //停机时的分个位
                                          
                        LCD1602RAM1[0][15] =0X20; //空格


                        LCD1602RAM1[1][0] =(RUN1_HOUR/1000%10) +0x30;        //保养运行时间的小时千位
                        LCD1602RAM1[1][1] =(RUN1_HOUR/100%10) +0x30;        //保养运行时间的小时百位
                        LCD1602RAM1[1][2] =(RUN1_HOUR/10%10) +0x30;        //保养运行时间的小时十位
                        LCD1602RAM1[1][3] =(RUN1_HOUR%10) +0x30;        //保养运行时间的小时个位         
                        LCD1602RAM1[1][4] =  ':';                  //分隔符
                        LCD1602RAM1[1][5] =        (RUN1_MIN/10%10)+0x30;         //运行时间分钟十位
                        LCD1602RAM1[1][6] =        (RUN1_MIN%10)+0x30;         //运行时间分钟个位

                        LCD1602RAM1[1][7] =        '&';
                        LCD1602RAM1[1][8] =        '&';
                        LCD1602RAM1[1][9] =  
                        LCD1602RAM1[1][10] =  (EEPROM_RW[19]/100%10) +0x30;        //上次当日运行时间小时百位
                        LCD1602RAM1[1][11] = (EEPROM_RW[19]/10%10) +0x30;        //上次当日运行时间小时十位
                        LCD1602RAM1[1][12] = (EEPROM_RW[19]%10) +0x30;        //上次当日运行时间小时个位

                        LCD1602RAM1[1][13] =  ':';                  //分隔符
                        LCD1602RAM1[1][14] =EEPROM_RW[18]/10%10+0x30;        //上次当日运行时间分钟个位

                        LCD1602RAM1[1][15] =EEPROM_RW[18]%10+0x30;        //上次当日运行时间分钟十位
                              

                             }


         //下面是延时函数***********************

                void Delay60us()                //@11.0592MHz   60us延时
        {
        unsigned char i, j;

        _nop_();
        i = 1;
        j = 162;
        do
        {
                while (--j);
        } while (--i);
        }

         void delay_ms(unsigned int ms)                 //延时函数,ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
{
     unsigned int i;
     do{
          i = MAIN_Fosc / 13000;
          while(--i)    ;   //14T per loop
     }while(--ms);
}


打赏

参与人数 1家元 +60 收起 理由
家睦 + 60

查看全部打赏

发表于 2021-11-17 09:46:44 | 显示全部楼层
能有个演示就好了
回复 支持 反对

使用道具 举报

发表于 2021-11-17 10:02:27 | 显示全部楼层
C程言都还给老师了,看到别人写的程序就想去学习一下,但静不下心来:lol::lol::lol:
回复 支持 反对

使用道具 举报

发表于 2021-11-19 09:00:07 | 显示全部楼层
这不叫汇编风格,汇编风格是这样的:
//LCD1602RAM1[0][0] =ON_DAY10+0X30

A=ON_DAY10;
A=A+0x30;
LCD1602RAM1[0][0] =A;

//这才是ASM风格!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-12 20:35 , Processed in 0.156000 second(s), 14 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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