PIC16F876A 64X16点阵显示
扫描二维码
随时随地手机看文章
listp=16f876A;编驿参数
#include
errorlevel0,-302;错误输出级别
;配置字
__CONFIG_XT_OSC&_CP_OFF&_WDT_OFF&_BODEN_OFF&_PWRTE_ON&_WRT_OFF&_LVP_OFF&_CPD_OFF
;******************************************************************************
;**
;*全局公共变量定义*
;**
;******************************************************************************
cbLOCk0x70
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
;******************************************************************************
;**
;*在BANK1中定义的变量*
;**
;******************************************************************************
cblock0x20
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
;******************************************************************************
;**
;*单片机复位执行入口*
;**
;******************************************************************************
org0x000;
nop;预留ICD调试用
gotoMAIN;转入主执行程序入口
;******************************************************************************
;**
;* 单片机 中断执行入口*
;**
;******************************************************************************
org0x004;
MOV wfw_temp;保护现场
MOV fSTATUS,w
MOV wfstatus_temp
MOV fPCLATH,w
MOV wfpclath_temp
;此处编写自已的中断处理程序
MOV fpclath_temp,w;恢复现场
MOV wfPCLATH
MOV fstatus_temp,w
MOV wfSTATUS
swapfw_temp,f
swapfw_temp,w
retfie
;******************************************************************************
;**
;*主程序执行入口*
;**
;******************************************************************************
MAIN:
callINIT_PORT;初始化PORTA,PORTB,PORTC口寄存器
MAIN_1:
bankselbase_ptr
MOV lwlow(Hz_TABLE_1);置显示数据基准指针
MOV wfbase_ptr
MOV lwhigh(HZ_TABLE_1)
MOV wfbase_ptr+1
MOV lw0x03;置显示控制字,红绿色,静止,居左显示
MOV wfctrl_byte
MOV lw0x08;置总显示列宽度,4个汉字,8个字节
MOV wfrow_bytes
MAIN_2:
MOV lw0x00;置显示列偏移值为0
MOV wfcol_offset
MOV lw0x00;置起启显示行从Y0..Y15循环
MOV wfrow_cnt
MOV fbase_ptr,w
MOV wfcur_ptr
MOV fbase_ptr+1,w
MOV wfcur_ptr+1
MAIN_3:
MOV fwrow_bytes
MOV wfcol_cnt
MAIN_4:
callGET_DATA;获得一个字节数据
MOV wfAX
MOV fcol_offset,w
MOV wfBX
MOV lw0x08
MOV wfCX
callSHIFT_BYTE
decfszcol_cnt,f
gotoMAIN_4
callLATCH_REGISTER
bankselPORTB
MOV frow_cnt,w
MOV wfPORTB
callSLEEP_MS
incfrow_cnt,f
btfssrow_cnt,4
gotoMAIN_3
MAIN_5:
gotoMAIN_2
;******************************************************************************
;**
;*初始化PORT寄存器*
;**
;******************************************************************************
INIT_PORT:
BANKSELTRISB
clrfTRISB;PORTB寄存器的bit<0:3>用于行计数输出
BANKSELPORTB
MOV lw0x10;PORTB的BIT4=1,关闭所有LED显示
MOV wfPORTB
BANKSELADCON1;设置PORTA寄存器为数字I/O
MOV lw0x10
MOV wfADCON1
BANKSELTRISA;设置PORTA为数字输出寄存器
clrfTRISA;bit<0>用于红色移位数据输出,bit<1>用于绿色.bit<2>为移位脉冲,bit<3>为锁存脉冲
return;返回
;******************************************************************************
;**
;*将一个字节移入列寄存器*
;**
;*入口参数:*
;*AX中为移位数据*
;*BX中为起始位0=D7,1=D6,...*
;*CX中为移动计数*
;*出口参数:*
;*无*
;**
;******************************************************************************
SHIFT_BYTE:
MOV fBX,f;是从D7开如写入列寄存器?
skpnz
gotoSHIFT_BYTE_2
SHIFT_BYTE_1:
rlfAX,f;从AX中移去多余的数据位
decfszBX,f
gotoSHIFT_BYTE_1
SHIFT_BYTE_2:
BANKSELPORTA;选择端口A的所在页面
SHIFT_BYTE_3:
MOV lw0x03;预置,红、绿都为亮
rlfAX,f
skpc
MOV lw0x00;红、绿都为灭
andwfctrl_byte,w;确定显示的颜色
andlw0x03;屏蔽多余的位
MOV wfPORTA;数据输出到移位总线上,PORTA的BIT<0:1>
nop
nop
nop
iorlw0x04;在PORTA的BIT<2>上生成一个上升沿移位脉冲,将数据移入列寄存器
MOV wfPORTA;置PORTA的BIT<2>为高电平
nop
nop
nop
andlw0x03
MOV wfPORTA;置PORTA的BIT<2>为低电平
nop;完成移位脉冲输出
nop
nop
decfszCX,f;是否输出了所有的数据位
gotoSHIFT_BYTE_2;继续下一位输出
return;完成一个字节的移位输出,返回
;******************************************************************************
;**
;*将列寄存器的内容输出显示*
;**
;*入口参数:*
;*无*
;*出口参数:*
;*无*
;**
;******************************************************************************
LATCH_REGISTER:
BANKSELPORTA;选择端口A的所在页面
MOV lw0x00;在PORTA的BIT<3>上生成一个↑上升沿锁存脉冲,将移位数据打入锁存器
MOV wfPORTA
nop
nop
nop
MOV lw0x08;置PORTA的BIT<3>为高电平
MOV wfPORTA
nop
nop
nop
MOV lw0x00;置PORTA的BIT<3>为低电平
MOV wfPORTA
nop
nop
nop
return;完成脉冲输出,返回
;******************************************************************************
;**
;*廷时子程序*
;**
;*入口参数:*
;*无*
;*出口参数:*
;*无*
;**
;******************************************************************************
SLEEP_MS
MOV lw.2
MOV wfdelay_cnt+1
SLEEP_MS_1
MOV lw.199
MOV wfdelay_cnt
SLEEP_MS_2
nop
decfszdelay_cnt,f
gotoSLEEP_MS_2
decfszdelay_cnt+1,f
gotoSLEEP_MS_1
return
DELAY_NOP:
nop
nop
nop
nop
nop
return
;******************************************************************************
;**
;*查表获得数据*
;**
;*入口参数:*
;*cur_ptr中为查表指针*
;*出口参数:*
;*W中为值*
;*说明:*
;*本程序先将指针加一,再取数据*
;**
;******************************************************************************
GET_DATA:
incfcur_ptr,f
skpnz
incfcur_ptr+1,f
MOV fcur_ptr+1,w
MOV wfPCLATH
MOV fcur_ptr,w
MOV wfPCL
;******************************************************************************
;**
;*显示数据定义*
;**
;******************************************************************************
HZ_TABLE_1:dt0x00;占位节字
dt0x00,0x80,0x00,0x00,0x01,0x00,0x10,0x80
dt0x00,0x80,0x41,0x84,0x21,0x08,0x10,0x80
dt0xFC,0x80,0x26,0x7E,0x11,0x0C,0x51,0x04
dt0x04,0xFC,0x14,0x44,0x09,0x10,0x51,0xFE
dt0x45,0x04,0x04,0x44,0x09,0x20,0x52,0x00
dt0x46,0x48,0x04,0x44,0x01,0x04,0x54,0x80
dt0x28,0x40,0xF4,0x44,0xFF,0xFE,0x58,0x60
dt0x28,0x40,0x14,0xC4,0x04,0x40,0x50,0x24
dt0x10,0x40,0x15,0x44,0x04,0x40,0x57,0xFE
dt0x28,0x40,0x16,0x54,0x04,0x40,0x54,0x44
dt0x24,0xA0,0x14,0x48,0x04,0x40,0x54,0x44
dt0x44,0xA0,0x10,0x40,0x08,0x40,0x54,0x44
dt0x81,0x10,0x10,0x40,0x08,0x42,0x54,0x44
dt0x01,0x08,0x28,0x40,0x10,0x42,0x14,0x44
dt0x02,0x0E,0x47,0xFE,0x20,0x3E,0x17,0xFC
dt0x0C,0x04,0x00,0x00,0x40,0x00,0x14,0x04
;******************************************************************************
;**
;*源程序结束*
;**
;******************************************************************************
END