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
上一篇:PIC单片机扩展8255A并口
下一篇:PIC16F876A 64X16点阵显示
推荐阅读最新更新时间:2024-03-16 15:48
设计资源 培训 开发板 精华推荐
- 新书推荐《ARM Cortex-M0从这里开始 》
- 《看一个TI老工程师如何驯服精密放大器》点评有礼!
- 单片机零起点入门,带你DIY 51开发板
- 直播已结束【大唐恩智浦具有阻抗检测功能的新能源锂电芯电池管理方案】
- 6月19日上午10:00直播:大大通助你解锁新一代ADAS技术
- nanoPower技术:延长电池寿命,提升传感器性能 2021年1月20日 上午10:00在线研讨会
- 6月6日 Microchip 直播|利用单片机设计安全关键型应用时应采取的最佳实践方法
- 庆元宵答题抽奖,知识与礼物齐飞
- 有奖直播:安世半导体先进 SiC MOSFET 助力提升 EV-Charger 和 OBC 应用能效
- 有奖直播|ADI多参数光水质分析平台