📄 vidu6-2.c
字号:
/*******************************************************************************
; Vidu6-2.c la chuong trinh viet bang C30 de chay tren mot dsPIC *
; Chuong trinh thuc hien viec sau: Xuat chuoi 'Hello' ra LED ma tran *
;*******************************************************************************
; Tac gia : Nguyen Quang Nam *
; Don vi : PIC Viet Nam *
; Ten tap tin : Vidu6-2.c *
; Ngay : 12/08/2007 *
; Phien ban : 0.01 *
; Nhung tap tin can thiet khac: p30F4012.gld, p30f4012.h *
; Cong cu duoc dung: MPLAB 7.60 *
; C30 3.01 SE *
; ASM30 3.00 *
; LNK30 3.00 *
------------------------------------------------------------------------------*/
#include <p30fxxxx.h>
//Cac tu cau hinh
_FOSC(CSW_FSCM_OFF & FRC_PLL4); //fcy = 8 MHz
_FWDT(WDT_OFF);
_FBORPOR(PBOR_OFF & MCLR_EN & PWMxL_ACT_HI & PWMxH_ACT_HI);
_FGS(CODE_PROT_OFF);
//Thuoc tinh cua trinh phuc vu ngat (tuong thich voi C30 v3.00 tro di)
#define _ISR_PSV __attribute__((interrupt, auto_psv))
//Cac chan vao/ra
#define SH_CK LATEbits.LATE0 //chan 11 la clock de dich du lieu
#define ST_CK LATEbits.LATE1 //chan 12 la clock de chot du lieu
#define DS LATEbits.LATE2 //chan 14 la chan du lieu
//Mot so macro trong chuong trinh
#define StrobeSH() SH_CK = 1; SH_CK = 0;
#define StrobeST() ST_CK = 1; ST_CK = 0;
//Bitmap de hien thi (nx8), quet cot
const unsigned char __attribute__ ((space(psv), address (0x0400)))
Hello_bmp[70] = {
0, 0, 0, 0, 0, 0, 0, 0,255, 8, 8, 8, 8,255, 0,120,
148,148,148, 88, 0,255, 0,255, 0,120,132,132,132,120, 0, 0,
0, 0, 12, 48,192, 56, 4, 56,192, 48, 12, 0,120,132,132,132,
120, 0,252, 8, 4, 0,255, 0,120,132,132, 72,255, 0,191, 0,
0, 0, 0, 0, 0, 0
};
//Cac bien toan cuc
unsigned char cur_col; //Cot hien thoi cua bitmap
unsigned char col_idx; //Chi so cot hien thoi trong ma tran
unsigned char tmp1, tmp2; //Cac bien tam thoi
volatile unsigned char flag; //Co cap nhat hien thi
unsigned char speed; //Toc do chay chu (= 1 la toc do nhanh nhat)
//Chuong trinh con khoi tao cac cong I/O
void Init_PORTs(void) {
LATE = 0x0000;
TRISE = 0xFFF8; //RE0..RE2 la ngo ra
}
//Chuong trinh con khoi tao Timer 1
void Init_TMR1(void) {
TMR1 = 0; //Xoa thanh ghi dem cua Timer 1
PR1 = 0x07D0; //Ngat moi 2 ms, xem prescale khi thiet lap T1CON
_T1IF = 0; //Xoa co ngat cua TMR1
_T1IE = 1; //Cho phep ngat TMR1
flag = 0; //Xoa co cap nhat hien thi
T1CON = 0x8010; //Dung fcy, prescale = 1:8, bat Timer 1
}
//Chuong trinh chinh
int main(void) {
unsigned char k;
Init_PORTs();
Init_TMR1();
_PSV=1;
PSVPAG = __builtin_psvpage(Hello_bmp);
cur_col = col_idx = 0;
speed = 75; //Khoang 6.6 dich chuyen/giay
while (1 == 1) {
if (flag == 1) {
flag = 0;
//Quet cot hien thoi
tmp2 = 1 << (col_idx);
//Lay cot bitmap
tmp1 = Hello_bmp[cur_col+col_idx];
//Dich du lieu cot ra truoc
for (k=0; k < 8; k++) {
DS = tmp2;
StrobeSH();
tmp2 >>= 1;
}
//Roi den du lieu hang
for (k=0; k < 8; k++) {
DS = tmp1;
StrobeSH();
tmp1 >>= 1;
}
//Chot cac du lieu lai
StrobeST();
col_idx++; //Chuyen chi so sang cot ke tiep
col_idx &= 0x07;
speed--; //Giam so dem dung cho dich chuyen
//Neu den luc can dich chuyen thi cap nhat so dem va cot bitmap
if (speed == 0) {
cur_col++;
if (cur_col > 62) cur_col = 0;
speed = 75;
}
}
}
return 0;
}
//
void _ISR_PSV _T1Interrupt(void) {
flag = 1; //Den luc cap nhat hien thi
_T1IF = 0; //Xoa co ngat
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -