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

📄 sblcd_hpa449_sblcd.c

📁 ADS1241与MSP430F449接口设计
💻 C
字号:
/* -*- c -*- *//* Code for driving the lcd on the HPA449 *//* HPA449 LCD config:- Segment 0 used for turning off unused segments.  Normally off.- Antenna and alpha digit 7 tied to S1.  Normally off.- Segs 2-11, 16-35 connected to elements.- Segs 12-15 switched between seg 0 or certain elements.- Segs 36-39 used for SPI only, not available for LCD.See also lcdmap.txt*/#include "sysconf.h"typedef struct seginfo {	volatile char *loc;	unsigned char mask;} seginfo;/* ----- BEGIN THEFT ----- *//* THEFT ALERT: stolen from 'demo.c' by Rowley & Assoc. */// Starburst segment definitions.#define _N 0x0001#define _M 0x0002#define _K 0x0004#define _J 0x0008#define _D 0x0010#define _C 0x0020#define _B 0x0040#define _A 0x0080#define _P 0x0100#define _Q 0x0200#define _G 0x0400#define _H 0x0800#define _E 0x2000#define _F 0x4000static const u16 starburst_segments[] ={  /* */   0,  /*!*/   _F | _E,    // Lame  /*"*/   _H | _K,  /*#*/   _J | _B | _P | _C | _G | _M,  /*$*/   _A | _F | _G | _M | _C | _D | _J | _P,  /*%*/   0,          // No good idea  /*&*/   0,          // No good idea  /*'*/   _K,  /*(*/   _A | _F | _E | _D,  /*)*/   _A | _B | _C | _D,  /***/   _H | _J | _K | _G | _M | _Q | _P | _N,  /*+*/   _J | _G | _M | _P,  /*,*/   0,          // No good idea  /*-*/   _G | _M,  /*.*/   0,          // Should use decimal point, but...  /*/*/   _K | _Q,  /*0*/   _A | _B | _C | _D | _E | _F | _Q | _K,  /*1*/   _C | _B,  /*2*/   _A | _B | _M | _G | _E | _D,  /*3*/   _A | _B | _M | _G | _C | _D,  /*4*/   _F | _G | _M | _B | _C,  /*5*/   _A | _F | _G | _M | _C | _D,  /*6*/   _A | _F | _E | _D | _C | _M | _G,  /*7*/   _F | _A | _B | _C,  /*8*/   _A | _B | _C | _D | _E | _F | _G | _M,  /*9*/   _A | _F | _G | _M | _B | _C | _D,  /*:*/   0,          // No good idea  /*;*/   0,          // No good idea  /*<*/   _K | _N,  /*=*/   _G | _M | _D,  /*>*/   _H | _Q,  /*?*/   _A | _B | _M | _G | _E,  /*@*/   0,          // No good idea  /*A*/   _E | _F | _A | _B | _C | _G | _M,  /*B*/   _A | _B | _C | _D | _J | _P | _M,  /*C*/   _A | _F | _E | _D,  /*D*/   _A | _B | _C | _D | _J | _P,  /*E*/   _A | _F | _E | _D | _G | _M,  /*F*/   _A | _F | _E | _G | _M,  /*G*/   _A | _F | _E | _D | _C | _M,  /*H*/   _F | _E | _G | _M | _B | _C,  /*I*/   _A | _J | _P | _D,  /*J*/   _B | _C | _D | _E,  /*K*/   _F | _E | _G | _K | _N,  /*L*/   _F | _E | _D,  /*M*/   _E | _F | _H | _K | _B | _C,  /*N*/   _E | _F | _H | _N | _C | _B,  /*O*/   _A | _B | _C | _D | _E | _F,  /*P*/   _E | _F | _A | _B | _G | _M,  /*Q*/   _A | _B | _C | _D | _E | _F | _N,  /*R*/   _E | _F | _A | _B | _G | _M | _N,  /*S*/   _A | _F | _G | _M | _C | _D,  /*T*/   _A | _J | _P,  /*U*/   _F | _E | _D | _C | _B,  /*V*/   _F | _E | _Q | _K,  /*W*/   _F | _E | _Q | _N | _C | _B,  /*X*/   _H | _K | _Q | _N,  /*Y*/   _H | _K | _P,  /*Z*/   _A | _K | _Q | _D};/* ----- END THEFT ----- */#if 1static const seginfo bargraphtbl[]={	{&LCDM7,(1<<2)},	{&LCDM7,(1<<1)},	{&LCDM7,1},	{&LCDM7,(1<<4)},	{&LCDM7,(1<<5)},	{&LCDM7,(1<<6)},	{&LCDM7,(1<<7)},	{&LCDM8,(1<<3)},	{&LCDM8,(1<<2)},	{&LCDM8,(1<<1)}};static const u16 bgcentretbl[]={	0xfc1,0xbc1,0x9c1,0x8c1,0x841,0x861,0x821,0x831,0x839,0x83d,0x83f};static const u16 bglrtbl[]={	0x801,0xc01,0xe01,0xf01,0xf81,0xfc1,0xfe1,0xff1,0xff9,0xffd,0xfff};static const u16 bgonedottbl[]={	0x801,0xc01,0xa01,0x901,0x881,0x841,0x821,0x811,0x809,0x805,0x803,0x801};#endifstatic const seginfo lgcolontbl[]={	{&LCDM16,(1<<7)},	{&LCDM14,(1<<7)},	{&LCDM12,(1<<7)},	{&LCDM10,(1<<7)},	{&LCDM8,(1<<7)}};static const seginfo lgdptbl[]={	{&LCDM16,(1<<4)},	{&LCDM14,(1<<4)},	{&LCDM12,(1<<4)},	{&LCDM10,(1<<4)},	{&LCDM8,(1<<4)},	{&LCDM2,(1<<4)}};static const seginfo smdptbl[]={	{&LCDM6,1<<3},	{&LCDM5,1<<3},	{&LCDM3,1<<7}};/* charset format: pabcdefg */static const unsigned char segtbl[]={	// punctuation, 0x20-0x2f     //' ' !   "    # $ % & '    (    )    *    +    , - .    /	0,0xa0,0x22,0,0,0,0,0x02,0x4e,0x78,0x49,0x31,0,1,0x80,0,	// numbers: 0x30-0x39	//0  1    2    3    4    5    6    7    8    9	0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,	// extra stuff, 0x3a-0x40     // : ; < = > ?    @	0,0,0,9,0,0xe5,0,	// letters, 0x41-0x59	//a  b    c    d    e    f    g    h	0x7d,0x1f,0x0d,0x3d,0x6f,0x47,0x5e,0x17,	//i  j    k    l    m    n    o    p	0x10,0x3c,0x0f,0x0e,0x6a,0x15,0x1d,0x67,	//q  r    s    t    u    v    w    x	0x73,0x05,0x1b,0x07,0x1c,0x5c,0x2b,0x25,	//y  z	0x3b,0x65};// listing order: gfedcbastatic const seginfo smsegtbl[]={	// digit 0 (8)	{&LCDM6,(1<<5)},	{&LCDM6,(1<<4)},	{&LCDM6,(1<<6)},	{&LCDM6,(1<<7)},	{&LCDM6,(1<<2)},	{&LCDM6,(1<<1)}, 	{&LCDM6,1},	// digit 1 (9)	{&LCDM5,(1<<5)},	{&LCDM5,(1<<4)},	{&LCDM5,(1<<6)},	{&LCDM5,(1<<7)},	{&LCDM5,(1<<2)},	{&LCDM5,(1<<1)},	{&LCDM5,1},	// digit 2 (10)	{&LCDM4,(1<<1)},	{&LCDM4,(1<<5)},	{&LCDM4,(1<<6)},	{&LCDM4,(1<<3)},	{&LCDM4,(1<<2)},	{&LCDM4,1},	{&LCDM4,(1<<4)},	// digit 3 (11)	{&LCDM3,(1<<1)},	{&LCDM3,(1<<5)},	{&LCDM3,(1<<6)},	{&LCDM3,(1<<3)},	{&LCDM3,(1<<2)},	{&LCDM3,1},	{&LCDM3,(1<<4)}};void sblcd_seg_set(const seginfo *si, int on);// This LCD init turns all segments off.void sblcd_init(void){	int i;	volatile char *volatile mp=&LCDM1;	//BTCTL=0010 1000	BTCTL=0x28;	for (i=0;i<20;++i) {		*mp=0;		++mp;	}	//lcdctl=1101 1101	LCDCTL=0xdd;	P5SEL|=0x4;	P5SEL|=0x8;	P5SEL|=0x10;	P5SEL|=0x2;	P5SEL|=0x1;	P4SEL|=0x80;	P4SEL|=0x40;	P5SEL|=0x80;	P5SEL|=0x40;	P5SEL|=0x20;}void sblcd_lg_showc(char c, int position){	volatile char *base;	u16 digits;		if (position<0) return;	if (position>5) return;	if (c<' ') return;	if (c>='a'&&c<='z')		c-=0x20;	if (c>'Z') return;	base=&LCDM17 - position*2;	digits=starburst_segments[c-32];	base[0] = digits;	base[1] = (digits>>8)|(base[1]&0x90);  }void sblcd_SEG_SET(volatile char *loc, u8 mask, int on){	if (on)		sblcd_SEG_ON((volatile char *)loc,mask);	else		sblcd_SEG_OFF((volatile char *)loc,mask);}void sblcd_seg_set(const seginfo *si, int on){	if (on)		sblcd_seg_on(si);	else		sblcd_seg_off(si);}void sblcd_lg_dp_set(int ind, int on){	--ind;	if (ind<0) return;	if (ind>=6) return;	if (ind>=5) return;	sblcd_seg_set(&(lgdptbl[ind]),on);}void sblcd_lg_colon_set(int ind, int on){	--ind;	if (ind<0) return;	if (ind>=5) return;	if (ind>=5) return;	sblcd_seg_set(&(lgcolontbl[ind]),on);}void sblcd_lg_alldpcolonoff(void){	int i;	for (i=1;i<7;++i) {		sblcd_lg_colon_off(i);		sblcd_lg_dp_off(i);	}}/* Shows a string on the alpha portion of the HPA449's LCD */void sblcd_lg_showstr(char *c){	int i,blank=0;	if (*c=='+') {		sblcd_plus_on();		sblcd_minus_off();		c++;	} else if (*c=='-') {		sblcd_minus_on();		sblcd_plus_off();		c++;	} else {		sblcd_minus_off();		sblcd_plus_off();	}	sblcd_lg_alldpcolonoff();	for (i=0;i<6;++i) {		if (!blank)			if (!*c)				blank=1;		if (blank)			sblcd_lg_showc(' ',i);		else {			if (*c=='.') {				sblcd_lg_dp_on(i);				sblcd_lg_colon_off(i);				--i;			} else if (*c==':') {				sblcd_lg_colon_on(i);				sblcd_lg_dp_off(i);				--i;			} else {				sblcd_lg_showc(*c,i);			}			++c;		}	}}#if 1// ---- bargraph display ----------------------------------------------void sblcd_bg_set(u16 segs){	int i;	sblcd_SEG_SET(sblcd_SEG_BGR,segs&1);	sblcd_SEG_SET(sblcd_SEG_BGL,segs&(1<<11));	for (i=9;i>=0;--i){		segs=segs>>1;		sblcd_seg_set(&bargraphtbl[i],segs&1);	}}void sblcd_bg_centre(int val){	val+=5;	if (val<0) val=0;	if (val>10) val=10;	sblcd_bg_set(bgcentretbl[val]);}void sblcd_bg_onedot(int val){	if (val<0) val=0;	if (val>11) val=11;	sblcd_bg_set(bgonedottbl[val]);}void sblcd_bg_lr(int val){	if (val<0) val=0;	if (val>10) val=10;	sblcd_bg_set(bglrtbl[val]);}#endif// ---- small 7-seg display ----------------------------------------------unsigned char chrtosegs(char c){	if (c>='a'&&c<='z')		c-=0x20;	if (c>=' '&&c<='Z')		return segtbl[c-' '];	if (c=='_')		return 8;	if (c=='|')		return 6;	if (c=='`')		return 0x20;	return 0;}// seg: 6=a, 5=b, ... , 0=gvoid sblcd_sm_seg_set(int seg, int pos, int on){	sblcd_seg_set(&(smsegtbl[pos*7+seg]),on);}void sblcd_sm_showsegs(u8 segs, int pos){	int i;	for (i=0;i<7;++i) {		sblcd_sm_seg_set(i,pos,segs&1);		segs=segs>>1;	}}void sblcd_sm_dp_set(int ind, int on){	--ind;	if (ind<0) return;	if (ind>=3) return;	sblcd_seg_set(&(smdptbl[ind]),on);}void sblcd_sm_showc(char c, int pos){	u8 segs;		if (pos<0) return;	if (pos>3) return;	segs=chrtosegs(c);	sblcd_sm_showsegs(segs,pos);}void sblcd_sm_showstr(char *c){	int i,blank=0,colon=0;	char *oldc=c;	sblcd_sm_dp_off(1);	sblcd_sm_dp_off(2);	sblcd_sm_dp_off(3);	for (i=0;i<4;++i) {		if (!blank) {			if (!*c) blank=1;		}		if (blank)			sblcd_sm_showc(' ',i);		else {			if (*c==':') {				if (i==2)					colon=1;				--i;			} else if (*c=='.') {				sblcd_sm_dp_on(i);				if (i==2)					colon=0;				--i;			} else {				sblcd_sm_showc(*c,i);			}			++c;		}	}	sblcd_sm_colon_set(colon);}

⌨️ 快捷键说明

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