⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd.asm

📁 采用两片凌阳61实现的建简易智能车程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
//******************************************说明****************************************************//
//    DI/RS:IOB3   R/W:IOB4    E:IOB5    CS1:IOB6     CS2:IOB7    
// CS1和CS2只能有一个为低
//程序规范:每个函数写数据前自己清零数据线,写完后就返回,不用
//恢复数据线的电位。
//寄存器规范:R4传参,R5做数据指针.
//R1,R2,R3 做工作寄存器
//****************************************************************************************************//
.include   hardware.inc
.define    Clock        0x7013
.ram                       //定义公共变量
.public  _page1,_page2,Begin_row,page1_clr,page2_clr,_temp1,_temp2,_temp3,_col1         //行、列指针
.var _page1,_page2,Begin_row,page1_clr,page2_clr,_temp1,_temp2,_temp3,_col1

.define  lie  0x4000         //设置列起始地址
.code
//****************************************************************************************//
//函数名称:_Initial
//函数功能:液晶初始化
//入口参数:无
//返回参数:无
//************************************************************************************//
.public  _Initial_lcd
_Initial_lcd: .proc
          r1=0xffff
          [P_IOB_Dir]=r1
          [P_IOB_Attrib]=r1
          [P_IOB_Data]=r1
          nop
          r1=0x0000
          [P_IOB_Data]=r1
//          r1=0x0080        //更改此值可以改变时钟频率
//          [Clock]=r1       //主振49M,64分频?
     
          r4=0x3e00        //关显示,r4用于传参      
          call  Ctrl1
          call  Ctrl2
          r4=0x3f00        //开显示
          call  Ctrl1
          call  Ctrl2
          
          r1=0
          [Begin_row]=r1
          r1=r1 lsl 4
          r1=r1 lsl 4
		  r4=r1+0xc000                 //设起始点阵行
		  call Ctrl1
		  call Ctrl2
		  r1=0
		  [page1_clr]=r1
		  [page2_clr]=r1
  Clr_begin1:
          r1=[page1_clr]
          r1=r1 lsl 4
          r1=r1 lsl 4
          r4=r1+0xb800         //设置页面地址
          call  Ctrl1
          r2=0
          r4=lie             //设置列地址
          call  Ctrl1
     ?yihang1:
          r4=0x0000           //用于清屏
          call  data1
          r2+=1               //显示完64行?
          cmp  r2,63
          jna  ?yihang1
          r1=[page1_clr]
          r1+=1
          [page1_clr]=r1
          cmp r1,0x0007        //显示完8页?
          jna  Clr_begin1
          
   Clr_begin2:
          r1=[page2_clr]
          r1=r1 lsl 4
          r1=r1 lsl 4
          r4=r1+0xb800         //设置页面地址
          call  Ctrl2
          r2=0
          r4=lie             //设置列地址
          call  Ctrl2
     ?yihang2:
          r4=0x0000           //用于清屏
          call  data2
          r2+=1               //显示完64行?
          cmp  r2,63
          jna  ?yihang2
          r1=[page2_clr]
          r1+=1
          [page2_clr]=r1
          cmp r1,0x0007        //显示完8页?
          jna  Clr_begin2
          retf
          .endp
//************************************************************************************
//函数名称:Delay
//函数功能:延时
//入口参数:无
//返回参数:无
//**************************************************************************************
.public   Delay
 Delay:   .proc
          push r1,r2 to [sp]       //把r2,r1依次压入堆栈
          r1=0x0000
          r2=0x0000
    ?loop2:
       ?loop1:
          r2+=1
          cmp r2,0x3fff            //延时多长时间
          jna   ?loop1             //r2<=0x3fff则跳转
          r1+=1
          cmp  r1,0xcfff
          jna ?loop2
          pop r1,r2 from [sp]
          retf
          .endp
//************************************************************************************
//函数名称:busy1
//函数功能:判断液晶接口是否繁忙子程序(左半屏)
//入口参数:无
//返回参数:无
//DI/RS:IOB3   R/W:IOB4    E:IOB5    CS1:IOB6     CS2:IOB7
//**************************************************************************************
.public  busy1
busy1:    .proc
         push r1,r3 to [sp]
         call Set_IOB_Dir_in
         r1=[P_IOB_Data]         //读取B口的状态
         call Set_IOB_Dir_in
         r1&=0x0077              //清零RS,CS2  1110 1110 0000 0000 
         r1|=0x0050              //置RW,CS1为1 0000 1010 0000 0000
         [P_IOB_Data]=r1
         r1|=0x0020               //置E          0000 0100 0000 0000
         [P_IOB_Data]=r1
         call Set_IOB_Dir_in
    ?lop1:
         nop
         r3=[P_IOB_Data]
         r3&=0x8000               // 0000 0000 1000 0000
         jnz ?lop1                //r3 不等于0则忙,跳转 用于检验是否繁忙
         r1&=0xffdf               //清E  1111 1011 1111 1111
         [P_IOB_Data]=r1
         call Set_IOB_Dir_out
         pop r1,r3 from [sp]
         retf
         .endp
//************************************************************************************
//函数名称:busy2
//函数功能:判断液晶接口是否繁忙子程序(右半屏)
//入口参数:无
//返回参数:无
//DI/RS:IOB3   R/W:IOB4    E:IOB5    CS1:IOB6     CS2:IOB7
//**************************************************************************************
.public  busy2
busy2:   .proc
         push r1,r3 to [sp]
         call Set_IOB_Dir_in
         r1=[P_IOB_Data]
         call Set_IOB_Dir_in
         r1&=0x00b7           //清RS,CS1  1111 0110 0000 0000
         r1|=0x0090           //置RW,CS2  0000 1010 0000 0000
         [P_IOB_Data]=r1
         r1|=0x0020            //置E       0000 0100 0000 0000
         [P_IOB_Data]=r1
         call Set_IOB_Dir_in
    ?lop2:
         nop
         r3=[P_IOB_Data]
         r3&=0x8000            
         jnz  ?lop2
         r1&=0xffdf            //清E       1111 1011 1111 1111
         [P_IOB_Data]=r1
         call Set_IOB_Dir_out
         pop r1,r3 from [sp]
         retf
         .endp
         
//************************************************************************************
//函数名称:data1
//函数功能:写左半屏数据子程序
//入口参数:无
//返回参数:无
//DI/RS:IOB3   R/W:IOB4    E:IOB5    CS1:IOB6     CS2:IOB7
//**************************************************************************************
.public  data1
  data1: .proc
         push r1,r4 to [sp]
         call busy1            //检测是否繁忙
         r1=r4|0x0048          // 0000 1001 0000 0000 CS1和RS位置1
         r1=r1&0xff6f          // 1110 1101 1111 1111 清CS2,R/W        
         [P_IOB_Data]=r1
         r1=r1|0x0020          // 0000 0100 0000 0000
         [P_IOB_Data]=r1
         nop
         nop
         nop
         call _Clear_Watchdog
         r1=r1&0xffdf          // 1111 1011 1111 1111 E置0
         [P_IOB_Data]=r1
         pop r1,r4 from [sp]
         retf
           .endp
//************************************************************************************
//函数名称:data2
//函数功能:写右半屏数据子程序
//入口参数:无
//返回参数:无
//DI/RS:IOB3   R/W:IOB4    E:IOB5    CS1:IOB6     CS2:IOB7
//**************************************************************************************
.public  data2
    data2: .proc
         push r1,r4 to [sp]
         call busy2
         r1=r4|0x0088          //置RS CS2位为1  0001 0001 0000 0000
         r1=r1&0xffaf          //清RW,CS1      1111 0101 1111 1111
         [P_IOB_Data]=r1
         r1=r1|0x0020          //E置1           0000 0100 0000 0000
         [P_IOB_Data]=r1
         nop
         nop
         nop
         call _Clear_Watchdog
         r1=r1&0xffdf          // 1111 1011 1111 1111 E置0
         [P_IOB_Data]=r1
         pop r1,r4 from [sp]
         retf
         .endp
//************************************************************************************
//函数名称:Ctrl1
//函数功能:控制左半屏子程序
//入口参数:无
//返回参数:无
//DI/RS:IOB3   R/W:IOB4    E:IOB5    CS1:IOB6     CS2:IOB7
//**************************************************************************************
.public Ctrl1
    Ctrl1: .proc
         r1=r4|0x0040         //置CS1            0000 1000 0000 0000
         r1=r1&0xff67         //清DI,RW,CS2    1110 1100 1111 1111
         call busy1
         [P_IOB_Data]=r1
         r1=r1|0x0020         //E置1           0000 0100 0000 0000
         [P_IOB_Data]=r1
         nop
         nop
         nop
         r1=r1&0xffdf         // 1111 1011 1111 1111 E置0
         [P_IOB_Data]=r1
         retf
         .endp
//************************************************************************************
//函数名称:Ctrl2
//函数功能:控制右半屏子程序
//入口参数:无
//返回参数:无
//DI/RS:IOB3   R/W:IOB4    E:IOB5    CS1:IOB6     CS2:IOB7
//**************************************************************************************
.public Ctrl2
   Ctrl2: .proc
         r1=r4|0x0080         //置CS2           0001 0000 0000 0000
         r1=r1&0xffa7         //清DI,RW,CS1   1111 0100 1111 1111
         call busy2
         [P_IOB_Data]=r1
         r1=r1|0x0020         //E置1           0000 0100 0000 0000
         [P_IOB_Data]=r1
         nop
         nop
         nop
         r1=r1&0xffdf         // 1111 1011 1111 1111 E置0
         [P_IOB_Data]=r1
         retf
         .endp
//************************************************************************************
//函数名称:Set_IOB_Dir_in
//函数功能:将IO口属性改为输入
//入口参数:无
//返回参数:无
//**************************************************************************************
.public  Set_IOB_Dir_in
  Set_IOB_Dir_in: .proc
         push r1 to [sp]
         r1=[P_IOB_Dir]
         r1&=0x00ff
         [P_IOB_Dir]=r1
         r1=[P_IOB_Attrib]
         r1&=0x00ff
         [P_IOB_Attrib]=r1
         pop r1 from [sp]
         retf
         .endp
//************************************************************************************
//函数名称:Set_IOB_Dir_out
//函数功能:将IO口属性改为输出
//入口参数:无
//返回参数:无
//************************************************************************************
.public  Set_IOB_Dir_out
  Set_IOB_Dir_out: .proc
         push r1,r3 to [sp]
         r1=0xffff
         [P_IOB_Dir]=r1
         [P_IOB_Attrib]=r1
         pop r1,r3 from [sp]
         retf
         .endp
//************************************************************************************
//函数名称:_Clear_Watchdog
//函数功能:清看门狗程序
//入口参数:无
//返回参数:无
//**************************************************************************************
.public _Clear_Watchdog 
_Clear_Watchdog:.proc
         push r1 to [sp]
         r1=0x0001
         [P_Watchdog_Clear]=r1
         pop r1 from [sp]
         retf
         .endp
//************************************定位显示程序__正常显示1*****************************
//函数名称: _Dingwei_Display1
//函数功能: 在左半屏正常显示一行汉字,四个

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -