📄 oleddisp.c
字号:
#include"msp430x13x.h"
#include"logo.h"
#include"numdot.h"
#define uchar unsigned char
//=======================================================================//
//
//=======================================================================//
#define MAXDISPLAYSIZE 128
#define STEP 1 // shift left step
#define REFRESH 336 // EQU=maxdisplaysize*(chinese number+8)/(step*8)+1
#define MAXLEN 208 // EQU=16*chinese number
/*=======================================================================*/
uchar lattice[2][128];
uchar message[8][16]={{0xa1,0xa1,0xd3,0xb2,0xbc,0xfe,0xb2,0xbf},{0xd5,0xc5,0xc5,0xf4,0xc9,0xe8,0xbc,0xc6}};
uchar imagebuf;
//uchar keybuf;
unsigned int ADvalue=0;
unsigned int temp[3]={0x0fff,0x0fff,0x0fff};
uchar pagenum=1;
uchar rxbuf,k,bytes,flag=0,led;
uchar databuf[3];
// uchar p5keyj();
// void keymanage();
// uchar keycode();
void poweroff();
void wakeup();
void shutdown();
void init_display();
void ADC12init(void);
void read_status();
void delay(unsigned int );
void read_signal();
void write_signal();
void turnon_oled();
void turnoff_oled();
void boot_display();
void display(uchar ,uchar );
void clear_area(uchar ,uchar );
void battery_empty();
void battery(uchar );
void signal(uchar );
void address(uchar ,uchar );
void login_status(uchar );
void battery_detect();
void press_key_login();
void press_key_vote();
void insert_card_login();
void agree();
void disagree();
void abstain();
void set_address();
void vote_end();
void read_message(uchar );
void message_pages(uchar ,uchar );
void address_access();
void write_address();
void display_one(uchar );
void read_library(uchar ,uchar ,uchar );
void protocol(uchar ,uchar ,uchar );
/*=======================================================================*/
/*=======================================================================*/
void main(void) {
uchar i,j;
_DINT();
WDTCTL=WDTPW+WDTHOLD;
IE1&=~OFIE; //禁止振荡器失效中断
BCSCTL1&=~(XT2OFF+XTS); //选择XT2振荡器,ACLK为XT1
BCSCTL1|=DIVA0; // ACLK分频数为8,用于蜂鸣器发音
BCSCTL2|=SELM1; //用XT2CLK作为MCLK的时钟源
BCSCTL2&=~SELS;
do {
IFG1&=~OFIFG;
delay(255); //等待晶振转换完成
}
while((IFG1&OFIFG)!=0);
IFG1&=~OFIFG;
//=====================================================
//_EINT(); //初始化各端口
P3DIR=0XFF;
//P1DIR=0XFF;
//P1OUT=0X00;
P1DIR=0XF8; //引脚为输入
P1IES|=BIT0; // 下降沿有效
P1IE=0X01; //允许P1.0中断
_EINT();
P2DIR=0XFF;
P5DIR=0X07;
P3OUT|=BIT2; //CE=1
P3OUT|=BIT1; //OE=1;
P6DIR=0XFE;
P3SEL=0X00;
P6SEL=0X01;
P6OUT|=BIT1;
P3OUT|=BIT0;
//====================================================
TACTL=TASSEL0+TACLR; // TA定时
CCTL0=CCIE;
CCR0=20000;
//TACTL|=MC0;
TACTL&=~MC0;
TBCTL=TBSSEL0+TBCLR;
TBCCTL0=CCIE;
TBCCR0=2;
TBCTL|=MC0;
_EINT();
//=====================================================
init_display(); // 初始化oled
for(i=0;i<8;i++){
for(j=0;j<132;j++) { // clear all display RAM
imagebuf=0x00;
display(i,j);
}
}
turnon_oled();
//=====================================================
ADC12init();
_EINT();
ADC12CTL0|=ADC12SC;
//=====================================================
//boot_display();
//poweroff();
signal(1);
//address(2,65);
//battery_empty();
//battery(5);
//login_status(0);
//P5DIR=0X47;
//P5SEL=0X40;
//======================================================
while(1)
{//battery_detect();
if(led) turnon_oled();
else turnoff_oled();
//if(flag==1) protocol(databuf[0],databuf[1],databuf[2]);
}
//=======================================================
/*
while(1)
{battery_detect();
if(p5keyj()!=0)
{delay(500);
while(p5keyj()!=0)
{keybuf=keycode();
keymanage();
while(p5keyj()!=0);
}
}
}
*/
//======================================================
}
/*=======================================================================*/
#pragma optimize= z //set compile optimizes for size
void delay(unsigned int v) { //延时程序
while(v!=0)v--;
}
/*=======================================================================*/
/*=======================================================================*/
//读状态函数
void read_status() {
uchar wait,state;
P4DIR=0X00;
P3OUT&=~BIT5; //DC=0;
state=1;
wait=1;
do {
state=P4IN;
read_signal();
wait=state & 0x80;
}while(wait !=0);
P4DIR=0XFF;
}
/*=======================================================================*/
void read_signal() { //读信号
P3OUT&=~BIT7; //RD=0;
P3OUT|=BIT7; //RD=1;
}
void write_signal() { //写入信号
P3OUT&=~BIT6; //WR=0;
P3OUT|=BIT6; //WR=1;
}
/*=======================================================================*/
void init_display(void){ //OLED初始化
P3OUT&=~(BIT3+BIT4+BIT5); //CS=0; RES=0;DC=0;
P3OUT|=BIT4; //RES=1;
P4DIR=0XFF;
read_status();
P4OUT=0xa0; //10100000: set segment remap:column address 0 is mapped to SEG0(POR)
write_signal();
read_status();
P4OUT=0xc8; //11000000: set com output scan direction:Scan from COM0 to COM(N-1) (POR)
write_signal();
read_status();
P4OUT=0xda; // 11011010: set COM pins hardware configuration
write_signal();
read_status();
P4OUT=0x12; // 00010010: alternative COM pin
write_signal();
}
/*=======================================================================*/
//显示函数
#pragma optimize= z
void display(uchar start_page,uchar start_column) {
uchar haddress,laddress;
haddress=start_column>>4;
laddress=start_column&0x0f;
P3OUT&=~BIT5; // DC=0;
read_status();
P4OUT=176+start_page; //set page address
write_signal();
read_status();
P4OUT=0x00+laddress; //set low address
write_signal();
read_status();
P4OUT=0x10+haddress; //set higher address
write_signal();
read_status();
P3OUT|=BIT5; //DC=1;
P4OUT=imagebuf;
write_signal();
}
/*=======================================================================*/
/*=======================================================================*/
void turnon_oled() { //开启OLED显示
//TACTL&=~MC0;
P3OUT&=~BIT5; // DC=0;
read_status();
P4OUT=0XAF; //10101111: set display on
write_signal();
P6OUT|=BIT1;
}
void turnoff_oled() { //关闭OLED显示
TACTL|=MC0;
P3OUT&=~BIT5; // DC=0;
read_status();
P4OUT=0XAE; //10101110: set display off
write_signal();
}
/*=======================================================================*/
#pragma optimize= z
void boot_display() { //开机显示 调用数组logo[][]
uchar j;
unsigned int n;
uchar front,rear;
front=0; //显示范围头标记
rear=0; //显示范围尾标记
for(n=1;n<REFRESH;n++) {
if(front<MAXDISPLAYSIZE&&rear<MAXDISPLAYSIZE)
rear=rear+STEP;
else if(front<MAXDISPLAYSIZE&&rear>=MAXDISPLAYSIZE&&rear<MAXLEN)
{front=front+STEP;rear=rear+STEP;}
else if(rear==MAXLEN&&front<MAXLEN)
front=front+STEP;
else
front=front;rear=rear;
for(j=0;j<MAXDISPLAYSIZE;j++) {
if(rear<MAXDISPLAYSIZE&&MAXDISPLAYSIZE-j>rear) {
imagebuf=0x00;display(3,j);display(4,j);
}
else if(rear<MAXDISPLAYSIZE&&MAXDISPLAYSIZE-j<=rear) {
imagebuf=logo[0][front+j+rear-128];display(3,j);
imagebuf=logo[1][front+j+rear-128];display(4,j);
}
else if(rear==MAXLEN&&rear-front<=j) {
imagebuf=0x00;display(3,j);display(4,j);
}
else {
imagebuf=logo[0][front+j];display(3,j);
imagebuf=logo[1][front+j];display(4,j);
}
}
}
}
/*=======================================================================*/
void battery(uchar energy) { //电量指示 调用数组sign[]
if(energy!=0) {
imagebuf=0xba;
switch(energy) {
case 1:display(0,124);imagebuf=0x82;display(0,116);display(0,118);display(0,120);display(0,122);break; //battery
case 2:display(0,122);display(0,124);imagebuf=0x82;display(0,116);display(0,118);display(0,120);break;
case 3:display(0,120);display(0,122);display(0,124);imagebuf=0x82;display(0,116);display(0,118);break;
case 4:display(0,118);display(0,120);display(0,122);display(0,124);imagebuf=0x82;display(0,116);break;
case 5:display(0,116);display(0,118);display(0,120);display(0,122);display(0,124); break;
default:break;
}
}
else battery_empty();
}
void battery_empty() {
uchar j;
for(j=0;j<16;j++){
imagebuf=sign[16+j];
display(0,112+j);
}
}
//===================================================
void signal(uchar value) { //能量指示 调用数组sign[] 范围0-----7
uchar j;
if(value!=0) {
for(j=0;j<16;j++) {
if(value==1&&j==5)
imagebuf=0x06;
else if(j>6)
imagebuf=0x00;
else
imagebuf=sign[j]; //signal
display(0,j);
}
if(value>2) {
for(j=7;j<value*2+2;j=j+2) {
imagebuf=sign[j];display(0,j);
}
for(j=value*2+3;j<16;j=j+2) {
imagebuf=0x00;display(0,j);
}
}
}
else {
imagebuf=0x00;
for(j=0;j<16;j++)
display(0,j);
}
}
//====================================================
void address(uchar channels,uchar number) { //通道地址标识
uchar hundreds,tens,ones,j;
hundreds=number/100;
tens=(number-hundreds*100)/10;
ones=number-hundreds*100-tens*10;
imagebuf=0x08;
for(j=41;j<46;j++)
display(0,j); //显示 ” - “
if(channels==0xff||number==0x00) {
imagebuf=0x00;
for(j=34;j<40;j++) {
display(0,j);display(0,12+j);display(0,18+j);display(0,24+j);
}
}
else
for(j=32;j<38;j++) {
imagebuf=sign[channels*6+j];
display(0,2+j);
imagebuf=sign[hundreds*6+j];
display(0,14+j);
imagebuf=sign[tens*6+j];
display(0,20+j);
imagebuf=sign[ones*6+j];
display(0,26+j);
}
}
}
//==============================================================
void login_status(uchar login) { //报到标识
uchar j;
for(j=0;j<6;j++) {
imagebuf=0x00;display(0,76+j);display(0,94+j);
}
if(login==1) {
for(j=0;j<12;j++) {
imagebuf=sign[104+j];display(0,82+j);
}
}
else {
//display_please();
//display_checkin();
for(j=0;j<12;j++) {
imagebuf=sign[92+j];display(0,82+j);
}
}
}
//===============================================================
void clear_area(uchar start_page,uchar end_page) { //清除显示内容 按页清除
uchar i,j;
for(i=start_page;i<end_page+1;i++)
for(j=0;j<128;j++) {
imagebuf=0x00;
display(i,j);
}
}
//===============================================================
//====================================================
void ADC12init(void) {
ADC12CTL0&=~ENC;
ADC12CTL0=ADC12ON+SHT0_12;
ADC12CTL1=CONSEQ_0+SHP+ADC12DIV_7+ADC12SSEL_0;
ADC12MCTL0=0X00;
ADC12IE=BIT0;
ADC12CTL0|=ENC;
}
#pragma vector=ADC_VECTOR
__interrupt void ADC(void) {
switch (ADC12IV) {
case 0x02:break;
case 0x04:break;
case 0x06:
ADvalue=ADC12MEM0;
ADC12CTL0|=ADC12SC;
default:break;
}
}
//==========================================================================//
// 电池工作电压3.6V~4.2V,分压后进行探测 内部参考电平选择3.3V
//==========================================================================//
/*
void battery_detect()
{temp[2]=temp[1];temp[1]=temp[0];temp[0]=ADvalue;
if(ADvalue>=0X0EE2) battery(5);
else if (ADvalue<0X0EE2&&ADvalue>=0X0E82) battery(4);
else if (ADvalue<0X0E82&&ADvalue>=0X0E23) battery(3);
else if (ADvalue<0X0E23&&ADvalue>=0X0DF4) battery(2);
else if (ADvalue<0X0DF4&&ADvalue>=0X0DC4) battery(1);
else if (ADvalue<0X0DC4&&ADvalue>=0X0D78)
{battery(0);P3OUT|=BIT0;}
else
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -