PIC16F876A 64X16点阵显示

发布者:shengju最新更新时间:2017-12-06 来源: eefocus关键字:PIC16F876A  64X16  点阵显示 手机看文章 扫描二维码
随时随地手机看文章

 list  p=16f876A   ; 编驿参数 
   #include   ; 预定义头文件 
   errorlevel 0, -302    ; 错误输出级别 

 






  
   ;配置字 
   __CONFIG _XT_OSC & _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _WRT_OFF & _LVP_OFF & _CPD_OFF 

;****************************************************************************** 
;*                                                                            * 
;*                              全局公共变量定义                              * 
;*                                                                            * 
;****************************************************************************** 
   cbLOCk  0x70 
w_temp:  1      ; 中断时的现场保护 W 寄存器暂存单元 
status_temp:1      ; 中断时的现场保护 STATUS 寄存器暂存单元 
pclath_temp:1      ; 中断时的现场保护 PCLATH 寄存器暂存单元    

AX:   1      ; 通用寄存器AX 
BX:   1      ; 通用寄存器BX 
CX:   1      ; 通用寄存器CX 

delay_cnt: 2      ; 延时专用计数单元,2个字节 

   endc 

;****************************************************************************** 
;*                                                                            * 
;*                              在BANK 1中定义的变量                          * 
;*                                                                            * 
;****************************************************************************** 
   cblock 0x20 
base_ptr: 2      ; 显示内容基准地址指针 
CTRl_byte: 1      ; 内容显示控制字 
         ; bit<0>   =红色 
         ; bit<1> =绿色 
         ; bit<2:4>  =显示方式, 0:静止,居左 
         ;        1:向左滚动,循环显示 
         ; bit<5:7> =保留 
row_bytes: 1      ; 每一行的字节总数 

cur_ptr: 2      ; 当前取数据指针 
row_cnt: 1      ; 行显示计数器 
col_cnt: 1      ; 列显示计数器 
col_offset: 1      ; 当前显示列偏移(与curr_ptr一起决定列的起点) 

   endc 

;****************************************************************************** 
;*                                                                            * 
;*                             单片机 复位执行入口                              * 
;*                                                                            * 
;****************************************************************************** 
   org     0x000   ;  

   nop        ; 预留ICD调试用 
     goto    MAIN   ; 转入主执行程序入口 

;****************************************************************************** 
;*                                                                            * 
;*                             单片机 中断执行入口                              * 
;*                                                                            * 
;****************************************************************************** 
   org     0x004         ;  

    MOV wf   w_temp          ; 保护现场 
    MOV f STATUS,w              
    MOV wf status_temp           
    MOV f PCLATH,w        
    MOV wf pclath_temp       

     ; 此处编写自已的中断处理程序 

    MOV f pclath_temp,w ; 恢复现场 
    MOV wf PCLATH        
    MOV f    status_temp,w        
    MOV wf STATUS               
   swapf   w_temp,f 
   swapf   w_temp,w             
   retfie                         

;****************************************************************************** 
;*                                                                            * 
;*                               主程序执行入口                               * 
;*                                                                            * 
;****************************************************************************** 
MAIN: 
   call INIT_PORT  ; 初始化PORTA, PORTB, PORTC口寄存器 
MAIN_1:   
   banksel base_ptr 
    MOV lw low(Hz_TABLE_1) ; 置显示数据基准指针 
    MOV wf base_ptr 
    MOV lw high(HZ_TABLE_1) 
    MOV wf base_ptr+1 
    MOV lw 0x03   ; 置显示控制字,红绿色,静止,居左显示 
    MOV wf ctrl_byte 
    MOV lw 0x08   ; 置总显示列宽度,4个汉字,8个字节 
    MOV wf row_bytes 
MAIN_2: 
    MOV lw 0x00   ; 置显示列偏移值为0 
    MOV wf col_offset 
    MOV lw 0x00   ; 置起启显示行从Y0..Y15循环 
    MOV wf row_cnt   
    MOV f    base_ptr,w 
    MOV wf cur_ptr 
    MOV f base_ptr+1,w 
    MOV wf cur_ptr+1  
MAIN_3: 
    MOV fw row_bytes 
    MOV wf col_cnt 
MAIN_4: 
   call GET_DATA  ;获得一个字节数据   

    MOV wf AX 
    MOV f col_offset,w 
    MOV wf BX 
    MOV lw 0x08 
    MOV wf CX 
   call SHIFT_BYTE 

   decfsz col_cnt,f 
   goto MAIN_4 
    
   call LATCH_REGISTER 

   banksel PORTB 
    MOV f row_cnt,w 
    MOV wf PORTB 

   call SLEEP_MS 

   incf row_cnt,f 
   btfss row_cnt,4 
   goto MAIN_3 
MAIN_5:  
   goto  MAIN_2 
;****************************************************************************** 
;*                                                                            * 
;*                             初始化PORT寄存器                               * 
;*                                                                            * 
;****************************************************************************** 
INIT_PORT: 
   BANKSEL TRISB 
   clrf TRISB   ; PORT B寄存器的bit<0:3>用于行计数输出 
      BANKSEL PORTB 
    MOV lw 0x10   ; PORT B的 BIT4=1 ,关闭所有LED显示 
    MOV wf PORTB 

      BANKSEL ADCON1   ; 设置PORTA寄存器为数字I/O 
       MOV lw 0x10 
    MOV wf ADCON1 
   BANKSEL TRISA   ; 设置PORTA为数字输出寄存器 
   clrf TRISA   ; bit<0> 用于红色移位数据输出, bit<1>用于绿色. bit<2>为移位脉冲,bit<3>为锁存脉冲 

   return     ; 返回 

;****************************************************************************** 
;*                                                                            * 
;*                          将一个字节移入列寄存器                            * 
;*                                                                            * 
;*  入口参数:                 * 
;*     AX 中为移位数据               * 
;*       BX 中为起始位0=D7,1=D6,...            * 
;*       CX 中为移动计数               * 
;*  出口参数:                 * 
;*     无                * 
;*                                                                            * 
;****************************************************************************** 
SHIFT_BYTE: 
    MOV f BX,f   ; 是从D7开如写入列寄存器? 
   skpnz 
   goto SHIFT_BYTE_2  
SHIFT_BYTE_1:       
   rlf  AX,f   ; 从AX中移去多余的数据位 
   decfsz BX,f 
   goto SHIFT_BYTE_1 

SHIFT_BYTE_2: 
   BANKSEL PORTA   ; 选择端口A的所在页面 
SHIFT_BYTE_3: 
    MOV lw 0x03   ; 预置,红、绿都为亮 
   rlf  AX,f    
   skpc 
    MOV lw 0x00   ; 红、绿都为灭 
   andwf ctrl_byte,w  ; 确定显示的颜色 
   andlw 0x03   ; 屏蔽多余的位 
    MOV wf PORTA   ; 数据输出到移位总线上,PORT A的BIT<0:1> 

   nop 
   nop 
   nop 
   iorlw 0x04   ; 在PORT A的BIT<2>上生成一个上升沿移位脉冲,将数据移入列寄存器 
    MOV wf PORTA   ; 置PORT A的BIT<2>为高电平 
   nop 
   nop 
   nop 
   andlw 0x03 
    MOV wf PORTA   ; 置PORT A的BIT<2>为低电平 
   nop      ; 完成移位脉冲输出 
   nop 
   nop 

   decfsz CX,f   ; 是否输出了所有的数据位 
   goto  SHIFT_BYTE_2 ; 继续下一位输出 
    
   return     ; 完成一个字节的移位输出,返回 

;****************************************************************************** 
;*                                                                            * 
;*                          将列寄存器的内容输出显示                          * 
;*                                                                            * 
;*  入口参数:                 * 
;*     无                * 
;*  出口参数:                 * 
;*     无                * 
;*                                                                            * 
;****************************************************************************** 
LATCH_REGISTER: 
   BANKSEL PORTA   ; 选择端口A的所在页面   

    MOV lw 0x00   ; 在PORT A的BIT<3>上生成一个↑上升沿锁存脉冲 ,将移位数据打入锁存器 
    MOV wf PORTA 
   nop 
   nop 
   nop 
    MOV lw 0x08   ; 置PORT A的BIT<3>为高电平 
    MOV wf PORTA 
   nop 
   nop 
   nop 
    MOV lw 0x00   ; 置PORT A的BIT<3>为低电平 
    MOV wf PORTA 
   nop 
   nop 
   nop 
    
   return     ; 完成脉冲输出,返回 

;****************************************************************************** 
;*                                                                            * 
;*                                 廷时子程序                                 * 
;*                                                                            * 
;*  入口参数:                 * 
;*     无                * 
;*  出口参数:                 * 
;*     无                * 
;*                                                                            * 
;****************************************************************************** 
SLEEP_MS 
    MOV lw .2 
    MOV wf  delay_cnt+1 
SLEEP_MS_1 
    MOV lw .199 
    MOV wf delay_cnt 
SLEEP_MS_2 
   nop 
   decfsz delay_cnt,f 
   goto SLEEP_MS_2 
   decfsz delay_cnt+1,f 
   goto  SLEEP_MS_1 

   return 

DELAY_NOP: 
   nop 
   nop 
   nop 
   nop 
   nop 
   return 

;****************************************************************************** 
;*                                                                            * 
;*                                查表获得数据                                * 
;*                                                                            * 
;*  入口参数:                 * 
;*     cur_ptr中为查表指针            * 
;*  出口参数:                 * 
;*     W 中为值              * 
;*  说    明:                  * 
;*     本程序先将指针加一,再取数据          * 
;*                                                                            * 
;****************************************************************************** 
GET_DATA: 
   incf cur_ptr,f 
   skpnz  
   incf cur_ptr+1,f 
    MOV f cur_ptr+1,w 
    MOV wf PCLATH 
    MOV f cur_ptr,w 
    MOV wf PCL 

;****************************************************************************** 
;*                                                                            * 
;*                                显示数据定义                                * 
;*                                                                            * 
;****************************************************************************** 
HZ_TABLE_1: dt   0x00    ;占位节字 
   dt   0x00,0x80,0x00,0x00,0x01,0x00,0x10,0x80 
   dt   0x00,0x80,0x41,0x84,0x21,0x08,0x10,0x80 
   dt   0xFC,0x80,0x26,0x7E,0x11,0x0C,0x51,0x04 
   dt   0x04,0xFC,0x14,0x44,0x09,0x10,0x51,0xFE 
   dt   0x45,0x04,0x04,0x44,0x09,0x20,0x52,0x00 
   dt   0x46,0x48,0x04,0x44,0x01,0x04,0x54,0x80 
   dt   0x28,0x40,0xF4,0x44,0xFF,0xFE,0x58,0x60 
   dt   0x28,0x40,0x14,0xC4,0x04,0x40,0x50,0x24 
   dt   0x10,0x40,0x15,0x44,0x04,0x40,0x57,0xFE 
   dt   0x28,0x40,0x16,0x54,0x04,0x40,0x54,0x44 
   dt   0x24,0xA0,0x14,0x48,0x04,0x40,0x54,0x44 
   dt   0x44,0xA0,0x10,0x40,0x08,0x40,0x54,0x44 
   dt   0x81,0x10,0x10,0x40,0x08,0x42,0x54,0x44 
   dt   0x01,0x08,0x28,0x40,0x10,0x42,0x14,0x44 
   dt   0x02,0x0E,0x47,0xFE,0x20,0x3E,0x17,0xFC 
   dt   0x0C,0x04,0x00,0x00,0x40,0x00,0x14,0x04 

  


;****************************************************************************** 
;*                                                                            * 
;*                               源程序结束                                   * 
;*                                                                            * 
;****************************************************************************** 
      END 


关键字:PIC16F876A  64X16  点阵显示 引用地址:PIC16F876A 64X16点阵显示

上一篇:PIC单片机扩展8255A并口
下一篇:PIC16F876A 64X16点阵显示

推荐阅读最新更新时间:2024-03-16 15:48

51单片机学习——7--8*8LED点阵显示
原理 点阵简介 点阵的外部 点阵的内部结构 和矩阵按键相似,将每一行或每一列的LED阳极或阳极并联一起。如左图,如果我们想让某个led灯点亮,就让某一行输出高电平,某一列输出低电平。 我们通过74HC595向led点阵输入段选数据,即控制每一列哪些灯亮 通过P0口输入位选数据,即控制哪一列显示 74HC595 通过控制14,11,12引脚来输入数据。 14:DS(SER)对应网络标号的P3^4 11:SHCP(SRCLK)对应网络标号中的P3^6 12:STCP(RCLK)对应网络标号中的P3^5 上升沿就是数字电路中,数字电平从低电平(数字“0”)变为高电平(数字“1”)的那一瞬间(时刻)叫作上升沿。
[单片机]
51单片机学习——7--8*8LED<font color='red'>点阵显示</font>
用AT89S51控制16×16点阵显示器的方法
  在8×8点阵显示器软硬件设计上一般都会用8位的 单片机 来控制,以AT89S51单片机为例,它有四个I/O口(PO、P1、P2、P3),每个I/O口有8位,因此可以直接用两个I/O口来控制8×8点阵显示器,如用P1口控制点阵的8行,P2口控制点阵的8列。用来控制16×16点阵时,16行与16列使得AT89S51单片机的四个I/O口的32位刚好用完,如果要做两个16×16点阵显示器时就没有多余的I/O口来控制了,因此在这种情况下可以通过接入译码器(74LS154)和锁存器(74LS373)的方式来做一个或多个的16×16点阵显示器。   1、74LS154译码器。      如右图所示,74LS154是一个4对16的译码器,
[单片机]
用AT89S51控制16×16<font color='red'>点阵显示</font>器的方法
51单片机教程:8*8 点阵显示字符、数字、简单汉字
点阵显示实验 一、什么是点阵? 我们用之前的方法一个IO口只能控制一个led,如果需要用更少的IO口控制更多的led怎么办呢,于是就有了点阵。 8X8点阵共由64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一行置1电平,某一列置0电平,则相应的二极管就亮;如要将第一个点点亮,则1脚接高电平a脚接低电平,则第一个点就亮了; 二、点阵原理图 可以看到点阵是由led按照一定的排列组成 实物图: 我们可以打开protues,用led模仿一下点阵结构,了解一下原理 三、测试点阵 1、 proteus里点阵是MATRIX,选择8*8就行了 发现没有引脚标识,只能自己测试一下了、 先接一个电源试
[单片机]
51单片机教程:8*8 <font color='red'>点阵显示</font>字符、数字、简单汉字
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved